From c94cceea9c2262c5b2ad5f215bb9a8ae48b02764 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Fri, 29 Apr 2016 19:16:59 +0000 Subject: [PATCH] Vendor import of subversion-1.9.4. --- CHANGES | 135 ++++++++++++++++++- INSTALL | 88 ++---------- Makefile.in | 16 ++- NOTICE | 2 +- build-outputs.mk | 9 +- configure | 30 ++--- subversion/include/svn_client.h | 8 +- subversion/include/svn_config.h | 17 +++ subversion/include/svn_fs.h | 72 +++++++--- subversion/include/svn_version.h | 6 +- subversion/libsvn_client/externals.c | 36 +++++ subversion/libsvn_client/merge.c | 42 +++++- subversion/libsvn_client/patch.c | 33 ++--- subversion/libsvn_diff/binary_diff.c | 12 +- subversion/libsvn_fs_base/dag.c | 10 +- subversion/libsvn_fs_base/fs.h | 6 +- subversion/libsvn_fs_fs/cached_data.c | 8 +- subversion/libsvn_fs_fs/dag.c | 54 +++++--- subversion/libsvn_fs_fs/fs.h | 12 +- subversion/libsvn_fs_fs/fs_fs.c | 86 ++++++------ subversion/libsvn_fs_fs/fs_fs.h | 13 +- subversion/libsvn_fs_fs/rep-cache-db.h | 2 +- subversion/libsvn_fs_fs/transaction.c | 3 - subversion/libsvn_fs_fs/tree.c | 4 +- subversion/libsvn_fs_x/rep-cache-db.h | 2 +- subversion/libsvn_ra_local/ra_plugin.c | 9 +- subversion/libsvn_ra_serf/commit.c | 68 +++++++++- subversion/libsvn_ra_serf/inherited_props.c | 4 +- subversion/libsvn_ra_serf/merge.c | 16 ++- subversion/libsvn_ra_serf/multistatus.c | 10 +- subversion/libsvn_ra_serf/ra_serf.h | 18 +++ subversion/libsvn_ra_serf/replay.c | 1 + subversion/libsvn_ra_serf/serf.c | 58 +++----- subversion/libsvn_ra_serf/util.c | 26 ++++ subversion/libsvn_ra_svn/client.c | 7 +- subversion/libsvn_ra_svn/deprecated.c | 3 +- subversion/libsvn_ra_svn/marshal.c | 4 +- subversion/libsvn_repos/dump.c | 24 ++-- subversion/libsvn_repos/log.c | 2 +- subversion/libsvn_repos/repos.c | 15 ++- subversion/libsvn_subr/auth.c | 4 +- subversion/libsvn_subr/cache-membuffer.c | 37 ++--- subversion/libsvn_subr/eol.c | 17 +-- subversion/libsvn_subr/gpg_agent.c | 38 +++++- subversion/libsvn_subr/internal_statements.h | 2 +- subversion/libsvn_subr/prompt.c | 3 +- subversion/libsvn_subr/sqlite.c | 1 + subversion/libsvn_subr/string.c | 4 +- subversion/libsvn_subr/utf_validate.c | 79 +---------- subversion/libsvn_subr/version.c | 2 +- subversion/libsvn_wc/deprecated.c | 2 +- subversion/libsvn_wc/wc-checks.h | 2 +- subversion/libsvn_wc/wc-metadata.h | 2 +- subversion/libsvn_wc/wc-queries.h | 5 +- subversion/libsvn_wc/wc-queries.sql | 5 +- subversion/libsvn_wc/wc_db_pristine.c | 9 +- subversion/svn/conflict-callbacks.c | 4 +- subversion/svn/diff-cmd.c | 29 +++- subversion/svn/lock-cmd.c | 39 +++++- subversion/svn/unlock-cmd.c | 40 +++++- subversion/svnlook/svnlook.c | 73 ++++------ subversion/svnserve/cyrus_auth.c | 2 + win-tests.py | 4 +- 63 files changed, 837 insertions(+), 537 deletions(-) diff --git a/CHANGES b/CHANGES index 05a687066b87..ddaef6799169 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,91 @@ +Version 1.9.4 +(28 Apr 2016, from /branches/1.9.x) +http://svn.apache.org/repos/asf/subversion/tags/1.9.4 + + User-visible changes: + - Client-side bugfixes: + * diff: support '--summarize --ignore-properties' (part of issue #4567) + * checkout: fix performance regression on NFS (r1710167) + * gpg-agent: properly handle passwords with percent characters (issue #4611) + * svn-graph.pl: fix assertion about a non-canonical path (r1729060 et al) + * hot-backup.py: better input validation (r1721174, r1721175) + * commit: abort on Ctrl-C in plaintext password prompt (issue #4624) + * diff: produce proper forward binary diffs with --git (r1704292, r1704573) + * ra_serf: fix deleting directories with many files (issue #4557) + + - Server-side bugfixes: + * improve documentation for AuthzSVNGroupsFile and groups-db (r1730856) + * fsfs: reduce peak memory usage when listing large directories (r1725180) + * fsfs: fix a rare source of incomplete dump files and reports (r1717876) + + - Client-side and server-side bugfixes: + * update INSTALL documentation file (r1703470 et al) + * fix potential memory access bugs (r1722860 et al) + * fix potential out of bounds read in svn_repos_get_logs5() (r1738259) + + - Bindings bugfixes: + * ignore absent nodes in javahl version of svn status -u (r1720643) + + Developer-visible changes: + - General: + * fix ruby test suite to work with test-unit gem (r1714790) + * allow building against KDE4 without conflict with KDE5 (r1734926) + * fix update_tests.py#76 with SVNPathAuthz short_circuit (r1736432) + * build system tweaks: + * tweak how symbolic error names in maintainer mode (r1735179) + * fix inconsistent behavior of inherited property API (r1717874 et al) + + - API changes: + * properly interpret parameters in svn_wc_get_diff_editor6() (r1728308) + + +Version 1.9.3 +(15 Dec 2015, from /branches/1.9.x) +http://svn.apache.org/repos/asf/subversion/tags/1.9.3 + + User-visible changes: + - Client-side bugfixes: + * svn: fix possible crash in auth credentials cache (r1705328) + * cleanup: avoid unneeded memory growth during pristine cleanup (r1706241) + * diff: fix crash when repository is on server root (r1705060 et al) + * fix translations for commit notifications (r1709389, r1709562) + * ra_serf: fix crash in multistatus parser (r1706323, r1706324) + * svn: report lock/unlock errors as failures (r1701598 et al) + * svn: cleanup user deleted external registrations (r1705843, r1710558) + * svn: allow simple resolving of binary file text conflicts (r1703581) + * svnlook: properly remove tempfiles on diff errors (r1711346) + * ra_serf: report built- and run-time versions of libserf (r1704847) + * ra_serf: set Content-Type header in outgoing requests (r1715224 et al) + * svn: fix merging deletes of svn:eol-style CRLF/CR files (r1703689 et al) + * ra_local: disable zero-copy code path (r1718167) + + - Server-side bugfixes: + * mod_dav_svn: fix heap overflow with skel-encoded requests (CVE-2015-5343) + * mod_authz_svn: fix authz with mod_auth_kerb/mod_auth_ntlm (issue #4602) + * mod_dav_svn: fix display of process ID in cache statistics (r1709553) + * mod_dav_svn: use LimitXMLRequestBody for skel-encoded requests (r1687812) + * svnadmin dump: preserve no-op changes (r1709388 et al, issue #4598) + * fsfs: avoid unneeded I/O when opening transactions (r1715793) + + - Client-side and server-side bugfixes: + * fix heap overflow in svn:// protocol parser (CVE-2015-5259) + + - Bindings bugfixes: + * javahl: fix ABI incompatibilty with 1.8 (r1710104) + * javahl: allow non-absolute paths in SVNClient.vacuum (r1710215, r1710290) + + Developer-visible changes: + - General: + * fix patch filter invocation in svn_client_patch() (r1706783) + * add @since information to config defines (r1706983, r1706999) + * fix running the tests in compatibility mode (r1706375) + * clarify documentation of svn_fs_node_created_rev() (r1717154) + + - API changes: + * fix overflow detection in svn_stringbuf_remove and _replace (r1714358) + * don't ignore some of the parameters to svn_ra_svn_create_conn3 (r1714314) + + Version 1.9.2 (30 Sep 2015, from /branches/1.9.x) http://svn.apache.org/repos/asf/subversion/tags/1.9.2 @@ -118,7 +206,7 @@ http://svn.apache.org/repos/asf/subversion/tags/1.9.0 * fsfs: enable dir and prop deltas by default for formats that support it (r1555286) * fsfs: avoid out of date errors from files in a directory changing when - you change a property on the directory (r1558224) + you change a property on the directory (issue #2118) * fsfs: temporary transaction properties are preserved when commit is interrupted (r1549907 et al) * fsfs: speed up transaction creation (r1544719) @@ -794,6 +882,51 @@ http://svn.apache.org/repos/asf/subversion/tags/1.9.0 * javahl: allow compiling with a C++11 compiler (r1684412) +Version 1.8.16 +(28 Apr 2016, from /branches/1.8.x) +http://svn.apache.org/repos/asf/subversion/tags/1.8.16 + + User-visible changes: + - Server-side bugfixes: + * mod_authz_svn: fix authz with mod_auth_kerb/mod_auth_ntlm (issue #4602) + * dump: don't write broken dump files in some ambiguously encoded fsfs + repositories (issue #4554) + + - Client-side and server-side bugfixes: + * update INSTALL documentation file (r1703470, r1703475) + + Developer-visible changes: + - General: + * fix javahl test suite to work on a symlinked RAM disk (r1539230) + * fix ruby test suite to work with test-unit gem (r1714790) + + +Version 1.8.15 +(15 Dec 2015, from /branches/1.8.x) +http://svn.apache.org/repos/asf/subversion/tags/1.8.15 + + User-visible changes: + - Client-side bugfixes: + * gpg-agent: fix crash with non-canonical $HOME (r1691928, issue #4584) + + - Client-side and server-side bugfixes: + * fix a segfault with old style text delta (r1618472 et al) + + - Server-side bugfixes: + * mod_dav_svn: fix heap overflow with skel-encoded requests (CVE-2015-5343) + * fsfs: reduce memory allocation with Apache (r1591005 et al) + * mod_dav_svn: emit first log items as soon as possible (r1666965 et al) + * mod_dav_svn: use LimitXMLRequestBody for skel-encoded requests (r1687812) + + - Bindings bugfixes: + * swig: fix memory corruption in svn_client_copy_source_t (r1694929) + + Developer-visible changes: + - General: + * better configure-time detection of httpd authz fix (r1687304 et al) + * fix compilation with apr 1.2.x (r1701237) + + Version 1.8.14 (5 Aug 2015, from /branches/1.8.x) http://svn.apache.org/repos/asf/subversion/tags/1.8.14 diff --git a/INSTALL b/INSTALL index 7688b706f8ae..3ff16702aea5 100644 --- a/INSTALL +++ b/INSTALL @@ -3,7 +3,7 @@ A Quick Guide ====================================== -$LastChangedDate: 2015-07-26 23:03:10 +0000 (Sun, 26 Jul 2015) $ +$LastChangedDate: 2015-12-12 04:00:43 +0000 (Sat, 12 Dec 2015) $ Contents: @@ -199,48 +199,6 @@ I. INTRODUCTION Apache Portable Runtime (APR) and the APR Utility (APR-util) libraries. - - **************************************************************** - ** IMPORTANT ISSUE ABOUT APR VERSIONS: READ THIS ** - ** IF UPGRADING FROM MUCH OLDER SUBVERSION ** - **************************************************************** - | | - | APR 0.9.X and 1.X are binary-incompatible. | - | | - | This means: | - | | - | - if you are already using Subversion with APR 0.9.X, and | - | then upgrade your libapr to 1.X without rebuilding | - | Subversion, things will break and segfault. | - | | - | - if your Subversion server libraries are linked to one | - | version of APR, but your Apache server is linked to a | - | different version, things will break and segfault. | - | | - | Subversion distribution dependencies: | - | ------------------------------------- | - | | - | For a long time, Subversion's main distribution contained | - | APR and APR-UTIL (both 0.9.x), plus a few other things that | - | we couldn't count on the installation system having. But | - | nowadays, Subversion's requirements are no longer exotic, | - | and so our main distribution contains just the Subversion | - | source code itself -- people compiling Subversion are | - | expected to either have the APR libraries already installed | - | on their system, or to be capable of fetching them easily. | - | | - | Note that it's *perfectly* safe to use APR 1.X from the | - | beginning. In fact, we recommend it. If you're building | - | Subversion for the first time, there's no compatibility | - | issue to worry about, so grab the latest version of APR. | - | | - | If you already have a Subversion installation using APR | - | 0.9.x, it's still possible to move to APR 1.X safely. Just | - | be sure to recompile Subversion (and Apache httpd if | - | necessary) after upgrading APR! | - |______________________________________________________________| - - If you do not have a pre-installed APR and APR-util, you will need to get these yourself: @@ -960,14 +918,6 @@ II. INSTALLATION This step is only required for building the server dso modules. - The Subversion gen-make.py script must be run before building Apache or - Apache and Subversion will be running incompatible versions of apr. - - C:>cd src-%DIR% - C:>python gen-make.py -t dsp --with-httpd=..\httpd-2.0.58 - --with-berkeley-db=db4-win32 --with-openssl=..\openssl-0.9.7f - --with-zlib=..\zlib --with-libintl=..\svn-win32-libintl - C:>cd .. C:>set APACHEDIR=C:\Program Files\Apache Group\Apache2 C:>msdev httpd-2.0.58\apache.dsw /MAKE "BuildBin - Win32 Release" @@ -1042,7 +992,6 @@ II. INSTALLATION The Apache/APR projects required by Subversion are: apr-util\libaprutil.dsp, apr\libapr.dsp, apr-iconv\libapriconv.dsp, apr-util\xml\expat\lib\xml.dsp, - apr-util\uri\gen_uri_delims.dsp (for APR 0.9.x), apr-iconv\ccs\libapriconv_ccs_modules.dsp, and apr-iconv\ces\libapriconv_ces_modules.dsp. * If the server dso modules are being built and tested Apache must not @@ -1168,33 +1117,13 @@ III. BUILDING A SUBVERSION SERVER 1. Obtaining and Installing Apache 2 Subversion tries to compile against the latest released version - of Apache httpd 2.X. The easiest thing for you to do is download + of Apache httpd 2.2+. The easiest thing for you to do is download a source tarball of the latest release and unpack that. - - **************************************************************** - ** IMPORTANT ISSUE ABOUT APACHE VERSIONS: READ THIS. ** - ** ** - **************************************************************** - | | - | First, be sure to read the APR version warning box, back in | - | section I.C.1, which explains that APR 0.9.x and 1.X are | - | binary-incompatible. | - | | - | Apache HTTPD 2.0 uses APR 0.9.x. | - | Apache HTTPD 2.2 uses APR 1.2.x. | - | | - | We recommend using the latest Apache. However, whatever | - | version you choose, you *must* ensure that Subversion | - | and Apache are using the same version of APR. If you don't, | - | things will segfault and break. | - |______________________________________________________________| - - - If you have questions about the Apache httpd 2.0 build, please consult + If you have questions about the Apache httpd 2.2 build, please consult the httpd install documentation: - http://httpd.apache.org/docs-2.0/install.html + http://httpd.apache.org/docs-2.2/install.html At the top of the httpd tree: @@ -1240,7 +1169,7 @@ III. BUILDING A SUBVERSION SERVER --------------------------------------------------------- Go back into your subversion working copy and run ./autogen.sh if - you need to. Then, assuming Apache httpd 2.0 is installed in the + you need to. Then, assuming Apache httpd 2.2 is installed in the standard location, run: $ ./configure @@ -1250,7 +1179,7 @@ III. BUILDING A SUBVERSION SERVER look for other libsvn_*.so libraries on your system. If you see a warning message that the build of mod_dav_svn is - being skipped, this may be because you have Apache httpd 2.X + being skipped, this may be because you have Apache httpd 2.x installed in a non-standard location. You can use the "--with-apxs=" option to locate the apxs script: @@ -1292,7 +1221,7 @@ III. BUILDING A SUBVERSION SERVER /usr/local/apache2/conf/httpd.conf to reflect your setup. At a minimum you should look at the User, Group and ServerName directives. Full details on setting up apache can be found at: - http://httpd.apache.org/docs-2.0/ + http://httpd.apache.org/docs-2.2/ First, your httpd.conf needs to load the mod_dav_svn module. If you pass --enable-mod-activation to Subversion's configure, @@ -1346,6 +1275,7 @@ III. BUILDING A SUBVERSION SERVER Require group svn_readers + ### FIXME Tutorials section refers to old 2.0 docs These are only a few simple examples. For a complete tutorial on Apache access control, please consider taking a look at the tutorials found under "Security" on the following page: @@ -1372,7 +1302,7 @@ III. BUILDING A SUBVERSION SERVER NOTE: If you are unfamiliar with an Apache directive, or not exactly sure about what it does, don't hesitate to look it up in the - documentation: http://httpd.apache.org/docs-2.0/mod/directives.html. + documentation: http://httpd.apache.org/docs-2.2/mod/directives.html. NOTE: Make sure that the user 'nobody' (or whatever UID the httpd process runs as) has permission to read and write the diff --git a/Makefile.in b/Makefile.in index da622bd9f3bd..e63a09c6a6b7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -917,13 +917,15 @@ swig-rb: autogen-swig-rb check-swig-rb: swig-rb svnserve $(TEST_SHLIB_VAR_SWIG_RB) \ cd $(SWIG_RB_DIR); \ - if [ "$(RUBY_MAJOR)" -eq 1 -a "$(RUBY_MINOR)" -lt 9 ] ; then \ - $(RUBY) -I $(SWIG_RB_SRC_DIR) \ - $(SWIG_RB_SRC_DIR)/test/run-test.rb \ - --verbose=$(SWIG_RB_TEST_VERBOSE); \ - else \ - $(RUBY) -I $(SWIG_RB_SRC_DIR) \ - $(SWIG_RB_SRC_DIR)/test/run-test.rb; \ + check_rb() { \ + $(RUBY) -I $(SWIG_RB_SRC_DIR) $(SWIG_RB_SRC_DIR)/test/run-test.rb "$$@"; \ + }; \ + if check_rb --help 2>&1 | grep -q -- --collector; then \ + check_rb --collector=dir --verbose=$(SWIG_RB_TEST_VERBOSE); \ + elif [ "$(RUBY_MAJOR)" -eq 1 -a "$(RUBY_MINOR)" -lt 9 ] ; then \ + check_rb --verbose=$(SWIG_RB_TEST_VERBOSE); \ + else \ + check_rb; \ fi EXTRACLEAN_SWIG_RB=rm -f $(SWIG_RB_SRC_DIR)/svn_*.c $(SWIG_RB_SRC_DIR)/core.c diff --git a/NOTICE b/NOTICE index fa362873d7cb..0c4fe7d4420c 100644 --- a/NOTICE +++ b/NOTICE @@ -1,5 +1,5 @@ Apache Subversion -Copyright 2015 The Apache Software Foundation +Copyright 2016 The Apache Software Foundation This product includes software developed by many people, and distributed under Contributor License Agreements to The Apache Software Foundation diff --git a/build-outputs.mk b/build-outputs.mk index 2f51a5619f73..68acf271a05e 100644 --- a/build-outputs.mk +++ b/build-outputs.mk @@ -521,8 +521,8 @@ subversion/bindings/cxxhl/libsvncxxhl-1.la: $(libsvncxxhl_DEPS) cd subversion/bindings/cxxhl && $(LINK_CXX_LIB) $(libsvncxxhl_LDFLAGS) -o libsvncxxhl-1.la $(LT_NO_UNDEFINED) $(libsvncxxhl_OBJECTS) ../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../subversion/libsvn_client/libsvn_client-1.la ../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../subversion/libsvn_diff/libsvn_diff-1.la ../../../subversion/libsvn_subr/libsvn_subr-1.la ../../../subversion/libsvn_fs/libsvn_fs-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(LIBS) libsvnjavahl_PATH = subversion/bindings/javahl/native -libsvnjavahl_DEPS = $(javahl_java_DEPS) $(javahl_callback_javah_DEPS) $(javahl_remote_javah_DEPS) $(javahl_types_javah_DEPS) $(javahl_util_javah_DEPS) $(javahl_javah_DEPS) subversion/bindings/javahl/native/Array.lo subversion/bindings/javahl/native/AuthnCallback.lo subversion/bindings/javahl/native/BlameCallback.lo subversion/bindings/javahl/native/ChangelistCallback.lo subversion/bindings/javahl/native/ClientContext.lo subversion/bindings/javahl/native/CommitCallback.lo subversion/bindings/javahl/native/CommitEditor.lo subversion/bindings/javahl/native/CommitMessage.lo subversion/bindings/javahl/native/CopySources.lo subversion/bindings/javahl/native/CreateJ.lo subversion/bindings/javahl/native/Credential.lo subversion/bindings/javahl/native/DiffOptions.lo subversion/bindings/javahl/native/DiffSummaryReceiver.lo subversion/bindings/javahl/native/EditorCallbacks.lo subversion/bindings/javahl/native/EditorProxy.lo subversion/bindings/javahl/native/EnumMapper.lo subversion/bindings/javahl/native/ExternalItem.lo subversion/bindings/javahl/native/File.lo subversion/bindings/javahl/native/ImportFilterCallback.lo subversion/bindings/javahl/native/InfoCallback.lo subversion/bindings/javahl/native/InputStream.lo subversion/bindings/javahl/native/Iterator.lo subversion/bindings/javahl/native/JNIByteArray.lo subversion/bindings/javahl/native/JNICriticalSection.lo subversion/bindings/javahl/native/JNIMutex.lo subversion/bindings/javahl/native/JNIStackElement.lo subversion/bindings/javahl/native/JNIStringHolder.lo subversion/bindings/javahl/native/JNIUtil.lo subversion/bindings/javahl/native/ListCallback.lo subversion/bindings/javahl/native/LockTokenTable.lo subversion/bindings/javahl/native/LogMessageCallback.lo subversion/bindings/javahl/native/MessageReceiver.lo subversion/bindings/javahl/native/NativeStream.lo subversion/bindings/javahl/native/OperationContext.lo subversion/bindings/javahl/native/OutputStream.lo subversion/bindings/javahl/native/PatchCallback.lo subversion/bindings/javahl/native/Path.lo subversion/bindings/javahl/native/Pool.lo subversion/bindings/javahl/native/Prompter.lo subversion/bindings/javahl/native/PropertyTable.lo subversion/bindings/javahl/native/ProplistCallback.lo subversion/bindings/javahl/native/RemoteSession.lo subversion/bindings/javahl/native/RemoteSessionContext.lo subversion/bindings/javahl/native/ReposFreezeAction.lo subversion/bindings/javahl/native/ReposNotifyCallback.lo subversion/bindings/javahl/native/ReposVerifyCallback.lo subversion/bindings/javahl/native/Revision.lo subversion/bindings/javahl/native/RevisionRange.lo subversion/bindings/javahl/native/RevisionRangeList.lo subversion/bindings/javahl/native/SVNBase.lo subversion/bindings/javahl/native/SVNClient.lo subversion/bindings/javahl/native/SVNRepos.lo subversion/bindings/javahl/native/StateReporter.lo subversion/bindings/javahl/native/StatusCallback.lo subversion/bindings/javahl/native/StringArray.lo subversion/bindings/javahl/native/SubversionException.lo subversion/bindings/javahl/native/Targets.lo subversion/bindings/javahl/native/Utility.lo subversion/bindings/javahl/native/VersionExtended.lo subversion/bindings/javahl/native/deprecated.lo subversion/bindings/javahl/native/jniwrapper/jni_base.lo subversion/bindings/javahl/native/jniwrapper/jni_channel.lo subversion/bindings/javahl/native/jniwrapper/jni_class_cache.lo subversion/bindings/javahl/native/jniwrapper/jni_io_stream.lo subversion/bindings/javahl/native/jniwrapper/jni_iterator.lo subversion/bindings/javahl/native/jniwrapper/jni_list.lo subversion/bindings/javahl/native/jniwrapper/jni_string_map.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNRepos.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_CommitEditor.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteFactory.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteSession.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_StateReporter.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RevisionRangeList.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RuntimeVersion.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_types_VersionExtended.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigImpl_Category.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_TunnelChannel.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_fs/libsvn_fs-1.la -libsvnjavahl_OBJECTS = Array.lo AuthnCallback.lo BlameCallback.lo ChangelistCallback.lo ClientContext.lo CommitCallback.lo CommitEditor.lo CommitMessage.lo CopySources.lo CreateJ.lo Credential.lo DiffOptions.lo DiffSummaryReceiver.lo EditorCallbacks.lo EditorProxy.lo EnumMapper.lo ExternalItem.lo File.lo ImportFilterCallback.lo InfoCallback.lo InputStream.lo Iterator.lo JNIByteArray.lo JNICriticalSection.lo JNIMutex.lo JNIStackElement.lo JNIStringHolder.lo JNIUtil.lo ListCallback.lo LockTokenTable.lo LogMessageCallback.lo MessageReceiver.lo NativeStream.lo OperationContext.lo OutputStream.lo PatchCallback.lo Path.lo Pool.lo Prompter.lo PropertyTable.lo ProplistCallback.lo RemoteSession.lo RemoteSessionContext.lo ReposFreezeAction.lo ReposNotifyCallback.lo ReposVerifyCallback.lo Revision.lo RevisionRange.lo RevisionRangeList.lo SVNBase.lo SVNClient.lo SVNRepos.lo StateReporter.lo StatusCallback.lo StringArray.lo SubversionException.lo Targets.lo Utility.lo VersionExtended.lo deprecated.lo jniwrapper/jni_base.lo jniwrapper/jni_channel.lo jniwrapper/jni_class_cache.lo jniwrapper/jni_io_stream.lo jniwrapper/jni_iterator.lo jniwrapper/jni_list.lo jniwrapper/jni_string_map.lo org_apache_subversion_javahl_SVNClient.lo org_apache_subversion_javahl_SVNRepos.lo org_apache_subversion_javahl_remote_CommitEditor.lo org_apache_subversion_javahl_remote_RemoteFactory.lo org_apache_subversion_javahl_remote_RemoteSession.lo org_apache_subversion_javahl_remote_StateReporter.lo org_apache_subversion_javahl_types_RevisionRangeList.lo org_apache_subversion_javahl_types_RuntimeVersion.lo org_apache_subversion_javahl_types_Version.lo org_apache_subversion_javahl_types_VersionExtended.lo org_apache_subversion_javahl_util_ConfigImpl_Category.lo org_apache_subversion_javahl_util_ConfigLib.lo org_apache_subversion_javahl_util_DiffLib.lo org_apache_subversion_javahl_util_PropLib.lo org_apache_subversion_javahl_util_SubstLib.lo org_apache_subversion_javahl_util_TunnelChannel.lo +libsvnjavahl_DEPS = $(javahl_java_DEPS) $(javahl_callback_javah_DEPS) $(javahl_remote_javah_DEPS) $(javahl_types_javah_DEPS) $(javahl_util_javah_DEPS) $(javahl_javah_DEPS) subversion/bindings/javahl/native/Array.lo subversion/bindings/javahl/native/AuthnCallback.lo subversion/bindings/javahl/native/BlameCallback.lo subversion/bindings/javahl/native/ChangelistCallback.lo subversion/bindings/javahl/native/ClientContext.lo subversion/bindings/javahl/native/CommitCallback.lo subversion/bindings/javahl/native/CommitEditor.lo subversion/bindings/javahl/native/CommitMessage.lo subversion/bindings/javahl/native/CopySources.lo subversion/bindings/javahl/native/CreateJ.lo subversion/bindings/javahl/native/Credential.lo subversion/bindings/javahl/native/DiffOptions.lo subversion/bindings/javahl/native/DiffSummaryReceiver.lo subversion/bindings/javahl/native/EditorCallbacks.lo subversion/bindings/javahl/native/EditorProxy.lo subversion/bindings/javahl/native/EnumMapper.lo subversion/bindings/javahl/native/ExternalItem.lo subversion/bindings/javahl/native/File.lo subversion/bindings/javahl/native/ImportFilterCallback.lo subversion/bindings/javahl/native/InfoCallback.lo subversion/bindings/javahl/native/InputStream.lo subversion/bindings/javahl/native/Iterator.lo subversion/bindings/javahl/native/JNIByteArray.lo subversion/bindings/javahl/native/JNICriticalSection.lo subversion/bindings/javahl/native/JNIMutex.lo subversion/bindings/javahl/native/JNIStackElement.lo subversion/bindings/javahl/native/JNIStringHolder.lo subversion/bindings/javahl/native/JNIUtil.lo subversion/bindings/javahl/native/ListCallback.lo subversion/bindings/javahl/native/LockTokenTable.lo subversion/bindings/javahl/native/LogMessageCallback.lo subversion/bindings/javahl/native/MessageReceiver.lo subversion/bindings/javahl/native/NativeStream.lo subversion/bindings/javahl/native/OperationContext.lo subversion/bindings/javahl/native/OutputStream.lo subversion/bindings/javahl/native/PatchCallback.lo subversion/bindings/javahl/native/Path.lo subversion/bindings/javahl/native/Pool.lo subversion/bindings/javahl/native/Prompter.lo subversion/bindings/javahl/native/PropertyTable.lo subversion/bindings/javahl/native/ProplistCallback.lo subversion/bindings/javahl/native/RemoteSession.lo subversion/bindings/javahl/native/RemoteSessionContext.lo subversion/bindings/javahl/native/ReposFreezeAction.lo subversion/bindings/javahl/native/ReposNotifyCallback.lo subversion/bindings/javahl/native/ReposVerifyCallback.lo subversion/bindings/javahl/native/Revision.lo subversion/bindings/javahl/native/RevisionRange.lo subversion/bindings/javahl/native/RevisionRangeList.lo subversion/bindings/javahl/native/SVNBase.lo subversion/bindings/javahl/native/SVNClient.lo subversion/bindings/javahl/native/SVNRepos.lo subversion/bindings/javahl/native/StateReporter.lo subversion/bindings/javahl/native/StatusCallback.lo subversion/bindings/javahl/native/StringArray.lo subversion/bindings/javahl/native/SubversionException.lo subversion/bindings/javahl/native/Targets.lo subversion/bindings/javahl/native/Utility.lo subversion/bindings/javahl/native/VersionExtended.lo subversion/bindings/javahl/native/deprecated.lo subversion/bindings/javahl/native/jniwrapper/jni_base.lo subversion/bindings/javahl/native/jniwrapper/jni_channel.lo subversion/bindings/javahl/native/jniwrapper/jni_class_cache.lo subversion/bindings/javahl/native/jniwrapper/jni_io_stream.lo subversion/bindings/javahl/native/jniwrapper/jni_iterator.lo subversion/bindings/javahl/native/jniwrapper/jni_list.lo subversion/bindings/javahl/native/jniwrapper/jni_string_map.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNRepos.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_CommitEditor.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteFactory.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_RemoteSession.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_remote_StateReporter.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RevisionRangeList.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_types_RuntimeVersion.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_types_Version.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_types_VersionExtended.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigImpl_Category.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_ConfigLib.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_PropLib.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_SubstLib.lo subversion/bindings/javahl/native/org_apache_subversion_javahl_util_TunnelChannel.lo subversion/libsvn_repos/libsvn_repos-1.la subversion/libsvn_client/libsvn_client-1.la subversion/libsvn_wc/libsvn_wc-1.la subversion/libsvn_ra/libsvn_ra-1.la subversion/libsvn_delta/libsvn_delta-1.la subversion/libsvn_diff/libsvn_diff-1.la subversion/libsvn_subr/libsvn_subr-1.la subversion/libsvn_fs/libsvn_fs-1.la +libsvnjavahl_OBJECTS = Array.lo AuthnCallback.lo BlameCallback.lo ChangelistCallback.lo ClientContext.lo CommitCallback.lo CommitEditor.lo CommitMessage.lo CopySources.lo CreateJ.lo Credential.lo DiffOptions.lo DiffSummaryReceiver.lo EditorCallbacks.lo EditorProxy.lo EnumMapper.lo ExternalItem.lo File.lo ImportFilterCallback.lo InfoCallback.lo InputStream.lo Iterator.lo JNIByteArray.lo JNICriticalSection.lo JNIMutex.lo JNIStackElement.lo JNIStringHolder.lo JNIUtil.lo ListCallback.lo LockTokenTable.lo LogMessageCallback.lo MessageReceiver.lo NativeStream.lo OperationContext.lo OutputStream.lo PatchCallback.lo Path.lo Pool.lo Prompter.lo PropertyTable.lo ProplistCallback.lo RemoteSession.lo RemoteSessionContext.lo ReposFreezeAction.lo ReposNotifyCallback.lo ReposVerifyCallback.lo Revision.lo RevisionRange.lo RevisionRangeList.lo SVNBase.lo SVNClient.lo SVNRepos.lo StateReporter.lo StatusCallback.lo StringArray.lo SubversionException.lo Targets.lo Utility.lo VersionExtended.lo deprecated.lo jniwrapper/jni_base.lo jniwrapper/jni_channel.lo jniwrapper/jni_class_cache.lo jniwrapper/jni_io_stream.lo jniwrapper/jni_iterator.lo jniwrapper/jni_list.lo jniwrapper/jni_string_map.lo org_apache_subversion_javahl_NativeResources.lo org_apache_subversion_javahl_SVNClient.lo org_apache_subversion_javahl_SVNRepos.lo org_apache_subversion_javahl_remote_CommitEditor.lo org_apache_subversion_javahl_remote_RemoteFactory.lo org_apache_subversion_javahl_remote_RemoteSession.lo org_apache_subversion_javahl_remote_StateReporter.lo org_apache_subversion_javahl_types_RevisionRangeList.lo org_apache_subversion_javahl_types_RuntimeVersion.lo org_apache_subversion_javahl_types_Version.lo org_apache_subversion_javahl_types_VersionExtended.lo org_apache_subversion_javahl_util_ConfigImpl_Category.lo org_apache_subversion_javahl_util_ConfigLib.lo org_apache_subversion_javahl_util_DiffLib.lo org_apache_subversion_javahl_util_PropLib.lo org_apache_subversion_javahl_util_SubstLib.lo org_apache_subversion_javahl_util_TunnelChannel.lo subversion/bindings/javahl/native/libsvnjavahl-1.la: $(libsvnjavahl_DEPS) cd subversion/bindings/javahl/native && $(LINK_JAVAHL_CXX) $(libsvnjavahl_LDFLAGS) -o libsvnjavahl-1.la $(LT_NO_UNDEFINED) $(libsvnjavahl_OBJECTS) ../../../../subversion/libsvn_repos/libsvn_repos-1.la ../../../../subversion/libsvn_client/libsvn_client-1.la ../../../../subversion/libsvn_wc/libsvn_wc-1.la ../../../../subversion/libsvn_ra/libsvn_ra-1.la ../../../../subversion/libsvn_delta/libsvn_delta-1.la ../../../../subversion/libsvn_diff/libsvn_diff-1.la ../../../../subversion/libsvn_subr/libsvn_subr-1.la ../../../../subversion/libsvn_fs/libsvn_fs-1.la $(SVN_APRUTIL_LIBS) $(SVN_APR_LIBS) $(SVN_JAVA_SDK_LIBS) $(LIBS) @@ -2268,6 +2268,9 @@ subversion/bindings/javahl/native/jniwrapper/jni_list.lo: subversion/bindings/ja subversion/bindings/javahl/native/jniwrapper/jni_string_map.lo: subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/jniwrapper/jni_iterator.hpp subversion/bindings/javahl/native/jniwrapper/jni_object.hpp subversion/bindings/javahl/native/jniwrapper/jni_string.hpp subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp subversion/svn_private_config.h $(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp +subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_NativeResources.h + $(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_NativeResources.cpp + subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.lo: subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp subversion/bindings/javahl/include/org_apache_subversion_javahl_SVNClient.h subversion/bindings/javahl/native/Array.h subversion/bindings/javahl/native/BlameCallback.h subversion/bindings/javahl/native/ChangelistCallback.h subversion/bindings/javahl/native/ClientContext.h subversion/bindings/javahl/native/CommitCallback.h subversion/bindings/javahl/native/CommitMessage.h subversion/bindings/javahl/native/CopySources.h subversion/bindings/javahl/native/CreateJ.h subversion/bindings/javahl/native/DiffOptions.h subversion/bindings/javahl/native/DiffSummaryReceiver.h subversion/bindings/javahl/native/EnumMapper.h subversion/bindings/javahl/native/ImportFilterCallback.h subversion/bindings/javahl/native/InfoCallback.h subversion/bindings/javahl/native/JNIByteArray.h subversion/bindings/javahl/native/JNIStackElement.h subversion/bindings/javahl/native/JNIStringHolder.h subversion/bindings/javahl/native/JNIUtil.h subversion/bindings/javahl/native/ListCallback.h subversion/bindings/javahl/native/LogMessageCallback.h subversion/bindings/javahl/native/OperationContext.h subversion/bindings/javahl/native/OutputStream.h subversion/bindings/javahl/native/PatchCallback.h subversion/bindings/javahl/native/Path.h subversion/bindings/javahl/native/Pool.h subversion/bindings/javahl/native/Prompter.h subversion/bindings/javahl/native/PropertyTable.h subversion/bindings/javahl/native/ProplistCallback.h subversion/bindings/javahl/native/Revision.h subversion/bindings/javahl/native/RevisionRange.h subversion/bindings/javahl/native/SVNBase.h subversion/bindings/javahl/native/SVNClient.h subversion/bindings/javahl/native/StatusCallback.h subversion/bindings/javahl/native/StringArray.h subversion/bindings/javahl/native/Targets.h subversion/bindings/javahl/native/VersionExtended.h subversion/bindings/javahl/native/jniwrapper/jni_env.hpp subversion/bindings/javahl/native/jniwrapper/jni_globalref.hpp subversion/bindings/javahl/native/version.h subversion/include/private/svn_atomic.h subversion/include/private/svn_debug.h subversion/include/private/svn_dep_compat.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_client.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_diff.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_opt.h subversion/include/svn_pools.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_wc.h subversion/svn_private_config.h $(COMPILE_JAVAHL_CXX) $(canonicalized_srcdir)subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp @@ -3139,7 +3142,7 @@ subversion/mod_dav_svn/reports/update.lo: subversion/mod_dav_svn/reports/update. subversion/mod_dav_svn/repos.lo: subversion/mod_dav_svn/repos.c subversion/include/mod_authz_svn.h subversion/include/mod_dav_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_log.h subversion/include/private/svn_repos_private.h subversion/include/private/svn_skel.h subversion/include/private/svn_sorts_private.h subversion/include/private/svn_string_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_ctype.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_hash.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_pools.h subversion/include/svn_props.h subversion/include/svn_ra.h subversion/include/svn_repos.h subversion/include/svn_sorts.h subversion/include/svn_string.h subversion/include/svn_subst.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/repos.c ; else echo "fake" > subversion/mod_dav_svn/repos.lo ; fi -subversion/mod_dav_svn/status.lo: subversion/mod_dav_svn/status.c subversion/include/mod_authz_svn.h subversion/include/private/svn_cache.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h +subversion/mod_dav_svn/status.lo: subversion/mod_dav_svn/status.c subversion/include/mod_authz_svn.h subversion/include/private/svn_cache.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fs_private.h subversion/include/private/svn_skel.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_iter.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h subversion/svn_private_config.h if $(INSTALL_APACHE_MODS) ; then $(COMPILE_APACHE_MOD) $(canonicalized_srcdir)subversion/mod_dav_svn/status.c ; else echo "fake" > subversion/mod_dav_svn/status.lo ; fi subversion/mod_dav_svn/util.lo: subversion/mod_dav_svn/util.c subversion/include/mod_authz_svn.h subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_fspath.h subversion/include/private/svn_skel.h subversion/include/svn_base64.h subversion/include/svn_checksum.h subversion/include/svn_dav.h subversion/include/svn_delta.h subversion/include/svn_dirent_uri.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_fs.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_path.h subversion/include/svn_repos.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_xml.h subversion/mod_dav_svn/dav_svn.h diff --git a/configure b/configure index 5d24eb97e317..19fee6eb8068 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for subversion 1.9.2. +# Generated by GNU Autoconf 2.69 for subversion 1.9.4. # # Report bugs to . # @@ -590,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='subversion' PACKAGE_TARNAME='subversion' -PACKAGE_VERSION='1.9.2' -PACKAGE_STRING='subversion 1.9.2' +PACKAGE_VERSION='1.9.4' +PACKAGE_STRING='subversion 1.9.4' PACKAGE_BUGREPORT='http://subversion.apache.org/' PACKAGE_URL='' @@ -1471,7 +1471,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures subversion 1.9.2 to adapt to many kinds of systems. +\`configure' configures subversion 1.9.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1537,7 +1537,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of subversion 1.9.2:";; + short | recursive ) echo "Configuration of subversion 1.9.4:";; esac cat <<\_ACEOF @@ -1751,7 +1751,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -subversion configure 1.9.2 +subversion configure 1.9.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2295,7 +2295,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by subversion $as_me 1.9.2, which was +It was created by subversion $as_me 1.9.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2675,8 +2675,8 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. -{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring Subversion 1.9.2" >&5 -$as_echo "$as_me: Configuring Subversion 1.9.2" >&6;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring Subversion 1.9.4" >&5 +$as_echo "$as_me: Configuring Subversion 1.9.4" >&6;} abs_srcdir="`cd $srcdir && pwd`" @@ -20314,16 +20314,16 @@ $as_echo_n "checking for KWallet... " >&6; } fi done qt_include_dirs="`$PKG_CONFIG --cflags-only-I QtCore QtDBus QtGui`" - kde_dir="`$KDE4_CONFIG --prefix`" - SVN_KWALLET_INCLUDES="$DBUS_CPPFLAGS $qt_include_dirs -I$kde_dir/include" + kde_incdir="`$KDE4_CONFIG --install include`" + SVN_KWALLET_INCLUDES="$DBUS_CPPFLAGS $qt_include_dirs -I$kde_incdir" qt_libs_other_options="`$PKG_CONFIG --libs-only-other QtCore QtDBus QtGui`" SVN_KWALLET_LIBS="$DBUS_LIBS -lQtCore -lQtDBus -lQtGui -lkdecore -lkdeui $qt_libs_other_options" CXXFLAGS="$CXXFLAGS $SVN_KWALLET_INCLUDES" LIBS="$LIBS $SVN_KWALLET_LIBS" qt_lib_dirs="`$PKG_CONFIG --libs-only-L QtCore QtDBus QtGui`" - kde_lib_suffix="`$KDE4_CONFIG --libsuffix`" + kde_libdir="`$KDE4_CONFIG --install lib`" LDFLAGS="$old_LDFLAGS ` - input_flags="$qt_lib_dirs -L$kde_dir/lib$kde_lib_suffix" + input_flags="$qt_lib_dirs -L$kde_libdir" output_flags="" filtered_dirs="/lib /lib64 /usr/lib /usr/lib64" for flag in $input_flags; do @@ -26750,7 +26750,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by subversion $as_me 1.9.2, which was +This file was extended by subversion $as_me 1.9.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -26816,7 +26816,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -subversion config.status 1.9.2 +subversion config.status 1.9.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/subversion/include/svn_client.h b/subversion/include/svn_client.h index 6719e3ea03fd..cb0f49d98d49 100644 --- a/subversion/include/svn_client.h +++ b/subversion/include/svn_client.h @@ -4098,16 +4098,16 @@ svn_client_mergeinfo_log_eligible(const char *path_or_url, * @{ */ -/** Recursively vacuum a working copy directory @a dir, removing unnecessary - * data. +/** 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 after successful working copy cleanup. + * in @a dir_abspath after successful working copy cleanup. * If @a remove_ignored_items is @c TRUE, remove ignored unversioned items - * in @a dir after successful working copy cleanup. + * 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 diff --git a/subversion/include/svn_config.h b/subversion/include/svn_config.h index b4dc84838d5e..5ad3b0bae234 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" @@ -123,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" @@ -133,8 +143,11 @@ typedef struct svn_config_t svn_config_t; #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" @@ -172,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 */ diff --git a/subversion/include/svn_fs.h b/subversion/include/svn_fs.h index 7773ac667f9a..e34146d16dff 100644 --- a/subversion/include/svn_fs.h +++ b/subversion/include/svn_fs.h @@ -1759,12 +1759,15 @@ svn_fs_node_relation(svn_fs_node_relation_t *relation, const char *path_b, apr_pool_t *scratch_pool); -/** Set @a *revision to the revision in which @a path under @a root was - * created. Use @a pool for any temporary allocations. @a *revision will +/** 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, @@ -1861,6 +1864,15 @@ svn_fs_change_node_prop(svn_fs_root_t *root, * 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 * @@ -1872,9 +1884,7 @@ svn_fs_props_different(svn_boolean_t *different_p, apr_pool_t *scratch_pool); -/** Determine if the properties of two path/root combinations are different. - * In contrast to #svn_fs_props_different, we only perform a quick test and - * allow for false positives. +/** 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 @@ -1882,15 +1892,19 @@ svn_fs_props_different(svn_boolean_t *different_p, * both roots must be in the same filesystem. * Do any necessary temporary allocation in @a pool. * - * @note The behavior is implementation dependent in that the false - * positives reported may differ from release to release and backend to - * backend. There is also no guarantee that there will be false positives - * at all. + * @note 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 Prior to Subversion 1.9, this function would return false negatives - * for FSFS: If @a root1 and @a root2 were both transaction roots - * and the proplists of both paths had been changed in their respective - * transactions, @a changed_p would be set to #FALSE. + * @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, @@ -2410,7 +2424,7 @@ svn_fs_apply_text(svn_stream_t **contents_p, apr_pool_t *pool); -/** Check if the contents of two root/path combos have changed. +/** 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 @@ -2418,6 +2432,16 @@ svn_fs_apply_text(svn_stream_t **contents_p, * 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 * @@ -2428,9 +2452,7 @@ svn_fs_contents_different(svn_boolean_t *different_p, const char *path2, apr_pool_t *scratch_pool); -/** Check if the contents of two root/path combos have changed. In - * contrast to #svn_fs_contents_different, we only perform a quick test - * and allow for false positives. +/** Check if the contents of two root/path combos have changed. * * 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 @@ -2438,10 +2460,18 @@ svn_fs_contents_different(svn_boolean_t *different_p, * respective roots, and both roots must be in the same filesystem. * Do any necessary temporary allocation in @a pool. * - * @note The behavior is implementation dependent in that the false - * positives reported may differ from release to release and backend to - * backend. There is also no guarantee that there will be false positives - * at all. + * @note 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, diff --git a/subversion/include/svn_version.h b/subversion/include/svn_version.h index 254bfc6dc060..92ce825ced8c 100644 --- a/subversion/include/svn_version.h +++ b/subversion/include/svn_version.h @@ -70,7 +70,7 @@ extern "C" { * * @since New in 1.1. */ -#define SVN_VER_PATCH 2 +#define SVN_VER_PATCH 4 /** @deprecated Provided for backward compatibility with the 1.0 API. */ @@ -93,7 +93,7 @@ extern "C" { * * Always change this at the same time as SVN_VER_NUMTAG. */ -#define SVN_VER_TAG " (r1703836)" +#define SVN_VER_TAG " (r1740329)" /** Number tag: a string describing the version. @@ -117,7 +117,7 @@ extern "C" { * 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 1703836 +#define SVN_VER_REVISION 1740329 /* Version strings composed from the above definitions. */ diff --git a/subversion/libsvn_client/externals.c b/subversion/libsvn_client/externals.c index e50371543954..851b260dec4c 100644 --- a/subversion/libsvn_client/externals.c +++ b/subversion/libsvn_client/externals.c @@ -231,6 +231,42 @@ 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. */ diff --git a/subversion/libsvn_client/merge.c b/subversion/libsvn_client/merge.c index e912682e3651..e2435754ea0b 100644 --- a/subversion/libsvn_client/merge.c +++ b/subversion/libsvn_client/merge.c @@ -2349,17 +2349,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)); diff --git a/subversion/libsvn_client/patch.c b/subversion/libsvn_client/patch.c index d70e83ccaf48..6d8d0a4632c8 100644 --- a/subversion/libsvn_client/patch.c +++ b/subversion/libsvn_client/patch.c @@ -209,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; @@ -489,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; @@ -2264,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) @@ -2285,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++) @@ -3164,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 = diff --git a/subversion/libsvn_diff/binary_diff.c b/subversion/libsvn_diff/binary_diff.c index d42b2e53bf1b..035794dbed57 100644 --- a/subversion/libsvn_diff/binary_diff.c +++ b/subversion/libsvn_diff/binary_diff.c @@ -194,22 +194,22 @@ svn_diff_output_binary(svn_stream_t *output_stream, SVN_ERR(svn_stream_puts(output_stream, "GIT binary patch" APR_EOL_STR)); - /* ### git would first calculate if a git-delta original->latest would be + /* ### 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(original_full, - svn_stream_from_aprfile2(original_apr, FALSE, subpool), + 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 latest->original would be + /* ### 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(latest_full, - svn_stream_from_aprfile2(latest_apr, FALSE, subpool), + SVN_ERR(write_literal(original_full, + svn_stream_from_aprfile2(original_apr, FALSE, subpool), output_stream, cancel_func, cancel_baton, scratch_pool)); diff --git a/subversion/libsvn_fs_base/dag.c b/subversion/libsvn_fs_base/dag.c index e530fb2b4305..7c79dc2018a3 100644 --- a/subversion/libsvn_fs_base/dag.c +++ b/subversion/libsvn_fs_base/dag.c @@ -1657,8 +1657,14 @@ svn_fs_base__things_different(svn_boolean_t *props_changed, /* Compare contents keys and their (optional) uniquifiers. */ if (contents_changed != NULL) - *contents_changed = (! svn_fs_base__same_keys(noderev1->data_key, - noderev2->data_key)); + *contents_changed = + (! (svn_fs_base__same_keys(noderev1->data_key, + noderev2->data_key) + /* Technically, these uniquifiers aren't used and "keys", + but keys are base-36 stringified numbers, so we'll take + this liberty. */ + && (svn_fs_base__same_keys(noderev1->data_key_uniquifier, + noderev2->data_key_uniquifier)))); return SVN_NO_ERROR; } diff --git a/subversion/libsvn_fs_base/fs.h b/subversion/libsvn_fs_base/fs.h index bdbced3ccb49..cc89116836a7 100644 --- a/subversion/libsvn_fs_base/fs.h +++ b/subversion/libsvn_fs_base/fs.h @@ -195,11 +195,7 @@ typedef struct node_revision_t only because one or both of us decided to pick up a shared representation after-the-fact." May be NULL (if this node revision isn't using a shared rep, or isn't the original - "assignee" of a shared rep). - - This is no longer used by the 1.9 code but we have to keep - reading and writing it to remain compatible with 1.8, and - earlier, that require it. */ + "assignee" of a shared rep). */ const char *data_key_uniquifier; /* representation key for this node's text-data-in-progess (files diff --git a/subversion/libsvn_fs_fs/cached_data.c b/subversion/libsvn_fs_fs/cached_data.c index 1618f07d40a5..948870e6be1a 100644 --- a/subversion/libsvn_fs_fs/cached_data.c +++ b/subversion/libsvn_fs_fs/cached_data.c @@ -2558,8 +2558,12 @@ svn_fs_fs__rep_contents_dir(apr_array_header_t **entries_p, SVN_ERR(get_dir_contents(entries_p, fs, noderev, result_pool, scratch_pool)); - /* Update the cache, if we are to use one. */ - if (cache) + /* 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; diff --git a/subversion/libsvn_fs_fs/dag.c b/subversion/libsvn_fs_fs/dag.c index 78d1b23e3583..d21c17c4b9aa 100644 --- a/subversion/libsvn_fs_fs/dag.c +++ b/subversion/libsvn_fs_fs/dag.c @@ -1307,34 +1307,58 @@ svn_fs_fs__dag_things_different(svn_boolean_t *props_changed, apr_pool_t *pool) { node_revision_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_fs__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) + if (strict) { - SVN_ERR(svn_fs_fs__prop_rep_equal(&same, fs, noderev1, noderev2, - strict, pool)); - *props_changed = !same; - } + /* In strict mode, compare text and property representations in the + svn_fs_contents_different() / svn_fs_props_different() manner. - /* Compare contents keys. */ - if (contents_changed != NULL) + 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) + { + SVN_ERR(svn_fs_fs__file_text_rep_equal(&same, fs, noderev1, + noderev2, pool)); + *contents_changed = !same; + } + } + else { - SVN_ERR(svn_fs_fs__file_text_rep_equal(&same, fs, noderev1, noderev2, - strict, pool)); - *contents_changed = !same; + /* 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/fs.h b/subversion/libsvn_fs_fs/fs.h index 221db1a17c12..c75eafbd5c09 100644 --- a/subversion/libsvn_fs_fs/fs.h +++ b/subversion/libsvn_fs_fs/fs.h @@ -478,10 +478,6 @@ typedef struct 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; @@ -536,13 +532,7 @@ typedef struct representation_t /* 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. - - This is no longer used by the 1.9 code but we have to keep - reading and writing it for old formats to remain compatible with - 1.8, and earlier, that require it. We also read/write it in - format 7 even though it is not currently required by any code - that handles that format. */ + intra-node uniqification content. */ struct { /* unique context, i.e. txn ID, in which the noderev (!) got created */ diff --git a/subversion/libsvn_fs_fs/fs_fs.c b/subversion/libsvn_fs_fs/fs_fs.c index c2eaf5c04d48..1d32672b87f9 100644 --- a/subversion/libsvn_fs_fs/fs_fs.c +++ b/subversion/libsvn_fs_fs/fs_fs.c @@ -1414,19 +1414,37 @@ svn_fs_fs__file_length(svn_filesize_t *length, return SVN_NO_ERROR; } +svn_boolean_t +svn_fs_fs__noderev_same_rep_key(representation_t *a, + representation_t *b) +{ + if (a == b) + return TRUE; + + if (a == NULL || b == NULL) + return FALSE; + + if (a->item_index != b->item_index) + return FALSE; + + if (a->revision != b->revision) + return FALSE; + + return memcmp(&a->uniquifier, &b->uniquifier, sizeof(a->uniquifier)) == 0; +} + 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, - svn_boolean_t strict, 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 || rep_a->expanded_size == 0; - svn_boolean_t b_empty = !rep_b || rep_b->expanded_size == 0; + 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) @@ -1435,28 +1453,6 @@ svn_fs_fs__file_text_rep_equal(svn_boolean_t *equal, return SVN_NO_ERROR; } - if (a_empty != b_empty) - { - *equal = FALSE; - return SVN_NO_ERROR; - } - - /* 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))) - { - *equal = FALSE; - return SVN_NO_ERROR; - } - - /* 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) - { - *equal = memcmp(rep_a->sha1_digest, rep_b->sha1_digest, - sizeof(rep_a->sha1_digest)) == 0; - return SVN_NO_ERROR; - } - /* Same path in same rev or txn? */ if (svn_fs_fs__id_eq(a->id, b->id)) { @@ -1464,17 +1460,28 @@ svn_fs_fs__file_text_rep_equal(svn_boolean_t *equal, return SVN_NO_ERROR; } - /* Old repositories may not have the SHA1 checksum handy. - This check becomes expensive. Skip it unless explicitly required. - - We already have seen that the ID is different, so produce a likely - false negative as allowed by the API description - even though the - MD5 matched, there is an extremely slim chance that the SHA1 wouldn't. - */ - if (!strict) + /* 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) { - *equal = FALSE; - return SVN_NO_ERROR; + /* 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))) + { + *equal = FALSE; + return SVN_NO_ERROR; + } + + /* 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) + { + *equal = memcmp(rep_a->sha1_digest, rep_b->sha1_digest, + sizeof(rep_a->sha1_digest)) == 0; + return SVN_NO_ERROR; + } } SVN_ERR(svn_fs_fs__get_contents(&contents_a, fs, rep_a, TRUE, @@ -1492,7 +1499,6 @@ svn_fs_fs__prop_rep_equal(svn_boolean_t *equal, svn_fs_t *fs, node_revision_t *a, node_revision_t *b, - svn_boolean_t strict, apr_pool_t *scratch_pool) { representation_t *rep_a = a->prop_rep; @@ -1526,14 +1532,6 @@ svn_fs_fs__prop_rep_equal(svn_boolean_t *equal, return SVN_NO_ERROR; } - /* Skip the expensive bits unless we are in strict mode. - Simply assume that there is a difference. */ - 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_fs__get_proplist(&proplist_a, fs, a, scratch_pool)); diff --git a/subversion/libsvn_fs_fs/fs_fs.h b/subversion/libsvn_fs_fs/fs_fs.h index 1be993a931bd..b6c94c7e7ff3 100644 --- a/subversion/libsvn_fs_fs/fs_fs.h +++ b/subversion/libsvn_fs_fs/fs_fs.h @@ -81,28 +81,29 @@ svn_error_t *svn_fs_fs__file_length(svn_filesize_t *length, node_revision_t *noderev, apr_pool_t *pool); +/* Return TRUE if the representation keys in A and B both point to the + same representation, else return FALSE. */ +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. If STRICT is not set, allow - for false negatives. + 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, - svn_boolean_t strict, 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. If STRICT is not set, allow - for false negatives. + 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, - svn_boolean_t strict, apr_pool_t *scratch_pool); diff --git a/subversion/libsvn_fs_fs/rep-cache-db.h b/subversion/libsvn_fs_fs/rep-cache-db.h index 037585964994..56692c92e6d0 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.9.2/subversion/libsvn_fs_fs/token-map.h. +/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.4/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 diff --git a/subversion/libsvn_fs_fs/transaction.c b/subversion/libsvn_fs_fs/transaction.c index c6b2d25c251b..3968c6fa5deb 100644 --- a/subversion/libsvn_fs_fs/transaction.c +++ b/subversion/libsvn_fs_fs/transaction.c @@ -1247,9 +1247,6 @@ svn_fs_fs__get_txn(transaction_t **txn_p, 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_root(txn_id, pool); SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, root_id, pool, pool)); diff --git a/subversion/libsvn_fs_fs/tree.c b/subversion/libsvn_fs_fs/tree.c index 66de1f8ca313..0047bef251fc 100644 --- a/subversion/libsvn_fs_fs/tree.c +++ b/subversion/libsvn_fs_fs/tree.c @@ -1900,13 +1900,13 @@ merge(svn_stringbuf_t *conflict_p, /* 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_fs__prop_rep_equal(&same, fs, src_nr, anc_nr, TRUE, pool)); + 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, TRUE, pool)); + 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. diff --git a/subversion/libsvn_fs_x/rep-cache-db.h b/subversion/libsvn_fs_x/rep-cache-db.h index 44c49f128bd5..21d56f141228 100644 --- a/subversion/libsvn_fs_x/rep-cache-db.h +++ b/subversion/libsvn_fs_x/rep-cache-db.h @@ -1,4 +1,4 @@ -/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.2/subversion/libsvn_fs_x/token-map.h. +/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.4/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 diff --git a/subversion/libsvn_ra_local/ra_plugin.c b/subversion/libsvn_ra_local/ra_plugin.c index cc4a72bf5789..bb09162f0e0a 100644 --- a/subversion/libsvn_ra_local/ra_plugin.c +++ b/subversion/libsvn_ra_local/ra_plugin.c @@ -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 diff --git a/subversion/libsvn_ra_serf/commit.c b/subversion/libsvn_ra_serf/commit.c index ec3bce945589..b1e81c7870e3 100644 --- a/subversion/libsvn_ra_serf/commit.c +++ b/subversion/libsvn_ra_serf/commit.c @@ -101,6 +101,8 @@ typedef struct delete_context_t { svn_revnum_t revision; commit_context_t *commit_ctx; + + svn_boolean_t non_recursive_if; /* Only create a non-recursive If header */ } delete_context_t; /* Represents a directory. */ @@ -841,6 +843,7 @@ proppatch_resource(svn_ra_serf__session_t *session, handler->body_delegate = create_proppatch_body; handler->body_delegate_baton = proppatch; + handler->body_type = "text/xml"; handler->response_handler = svn_ra_serf__handle_multistatus_only; handler->response_baton = handler; @@ -1101,8 +1104,15 @@ 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_ctx, - 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_ctx->keep_locks) serf_bucket_headers_setn(headers, SVN_DAV_OPTIONS_HEADER, @@ -1402,6 +1412,28 @@ open_root(void *edit_baton, 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, @@ -1445,9 +1477,37 @@ 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)); + if (handler->sline.code == 400) + { + /* 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)); + } + + 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)); @@ -1539,7 +1599,9 @@ 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)); if (handler->sline.code != 201) diff --git a/subversion/libsvn_ra_serf/inherited_props.c b/subversion/libsvn_ra_serf/inherited_props.c index 40acc5d6f14f..6edafb1027cf 100644 --- a/subversion/libsvn_ra_serf/inherited_props.c +++ b/subversion/libsvn_ra_serf/inherited_props.c @@ -143,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) { diff --git a/subversion/libsvn_ra_serf/merge.c b/subversion/libsvn_ra_serf/merge.c index 2465b8fd2bc4..0a2fd5465b59 100644 --- a/subversion/libsvn_ra_serf/merge.c +++ b/subversion/libsvn_ra_serf/merge.c @@ -285,12 +285,12 @@ setup_merge_headers(serf_bucket_t *headers, return SVN_NO_ERROR; } -static void -merge_lock_token_list(apr_hash_t *lock_tokens, - const char *parent, - serf_bucket_t *body, - serf_bucket_alloc_t *alloc, - apr_pool_t *pool) +void +svn_ra_serf__merge_lock_token_list(apr_hash_t *lock_tokens, + const char *parent, + serf_bucket_t *body, + serf_bucket_alloc_t *alloc, + apr_pool_t *pool) { apr_hash_index_t *hi; @@ -378,7 +378,8 @@ create_merge_body(serf_bucket_t **bkt, "D:creator-displayname", SVN_VA_NULL); svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:prop"); - 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"); @@ -426,6 +427,7 @@ svn_ra_serf__run_merge(const svn_commit_info_t **commit_info, handler->path = merge_ctx->merge_url; handler->body_delegate = create_merge_body; handler->body_delegate_baton = merge_ctx; + handler->body_type = "text/xml"; handler->header_delegate = setup_merge_headers; handler->header_delegate_baton = merge_ctx; diff --git a/subversion/libsvn_ra_serf/multistatus.c b/subversion/libsvn_ra_serf/multistatus.c index 5b4c8fd0c0f5..9c269c39bedd 100644 --- a/subversion/libsvn_ra_serf/multistatus.c +++ b/subversion/libsvn_ra_serf/multistatus.c @@ -315,7 +315,7 @@ multistatus_closed(svn_ra_serf__xml_estate_t *xes, svn_ra_serf__xml_note(xes, MS_RESPONSE, "errcode", errcode); break; case MS_RESPONSE: - if ((status = svn_hash_gets(attrs, "status")) != NULL) + if ((status = svn_hash__get_cstring(attrs, "status", NULL)) != NULL) { error_item_t *item; @@ -369,7 +369,7 @@ multistatus_closed(svn_ra_serf__xml_estate_t *xes, break; case MS_PROPSTAT: - if ((status = svn_hash_gets(attrs, "status")) != NULL) + if ((status = svn_hash__get_cstring(attrs, "status", NULL)) != NULL) { apr_hash_t *response_attrs; error_item_t *item; @@ -428,7 +428,8 @@ multistatus_closed(svn_ra_serf__xml_estate_t *xes, item->http_status = server_error->handler->sline.code; /* Do we have a mod_dav specific message? */ - item->message = svn_hash_gets(attrs, "human-readable"); + item->message = svn_hash__get_cstring(attrs, "human-readable", + NULL); if (item->message) { @@ -442,9 +443,6 @@ multistatus_closed(svn_ra_serf__xml_estate_t *xes, 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; diff --git a/subversion/libsvn_ra_serf/ra_serf.h b/subversion/libsvn_ra_serf/ra_serf.h index 510a6b5ebc81..fcef73777a03 100644 --- a/subversion/libsvn_ra_serf/ra_serf.h +++ b/subversion/libsvn_ra_serf/ra_serf.h @@ -1022,6 +1022,13 @@ svn_ra_serf__svnname_from_wirename(const char *ns, /** MERGE-related functions **/ +void +svn_ra_serf__merge_lock_token_list(apr_hash_t *lock_tokens, + const char *parent, + serf_bucket_t *body, + serf_bucket_alloc_t *alloc, + apr_pool_t *pool); + /* Create an MERGE request aimed at the SESSION url, requesting the merge of the resource identified by MERGE_RESOURCE_URL. LOCK_TOKENS is a hash mapping paths to lock tokens owned by the @@ -1538,6 +1545,17 @@ 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) diff --git a/subversion/libsvn_ra_serf/replay.c b/subversion/libsvn_ra_serf/replay.c index d9a2ed6992b2..8d2da69fa4eb 100644 --- a/subversion/libsvn_ra_serf/replay.c +++ b/subversion/libsvn_ra_serf/replay.c @@ -756,6 +756,7 @@ svn_ra_serf__replay_range(svn_ra_session_t *ra_session, handler->path = replay_target; handler->body_delegate = create_replay_body; handler->body_delegate_baton = rev_ctx; + handler->body_type = "text/xml"; handler->done_delegate = replay_done; handler->done_delegate_baton = rev_ctx; diff --git a/subversion/libsvn_ra_serf/serf.c b/subversion/libsvn_ra_serf/serf.c index ab28ca040790..3c47d5eae900 100644 --- a/subversion/libsvn_ra_serf/serf.c +++ b/subversion/libsvn_ra_serf/serf.c @@ -64,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 * @@ -73,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(). */ @@ -509,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); @@ -741,18 +735,15 @@ ra_serf_dup_session(svn_ra_session_t *new_session, new_sess->repos_root_str = apr_pstrdup(result_pool, new_sess->repos_root_str); - status = apr_uri_parse(result_pool, new_sess->repos_root_str, - &new_sess->repos_root); - if (status) - return svn_ra_serf__wrap_err(status, NULL); + 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); - status = apr_uri_parse(result_pool, new_sess->session_url_str, - &new_sess->session_url); - - if (status) - return svn_ra_serf__wrap_err(status, NULL); + 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 */ @@ -799,7 +790,6 @@ svn_ra_serf__reparent(svn_ra_session_t *ra_session, { 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) @@ -821,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; diff --git a/subversion/libsvn_ra_serf/util.c b/subversion/libsvn_ra_serf/util.c index 98f1f4a8cd63..5490ddea8a59 100644 --- a/subversion/libsvn_ra_serf/util.c +++ b/subversion/libsvn_ra_serf/util.c @@ -1949,3 +1949,29 @@ svn_ra_serf__create_handler(svn_ra_serf__session_t *session, 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_svn/client.c b/subversion/libsvn_ra_svn/client.c index c83f25db231e..9ea59d20e147 100644 --- a/subversion/libsvn_ra_svn/client.c +++ b/subversion/libsvn_ra_svn/client.c @@ -1191,7 +1191,6 @@ parse_iproplist(apr_array_header_t **inherited_props, { int i; - const char *repos_root_url; apr_pool_t *iterpool; if (iproplist == NULL) @@ -1204,8 +1203,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 *)); @@ -1231,9 +1228,7 @@ 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->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; diff --git a/subversion/libsvn_ra_svn/deprecated.c b/subversion/libsvn_ra_svn/deprecated.c index ad2ad5839a0e..7f0c8fde2edc 100644 --- a/subversion/libsvn_ra_svn/deprecated.c +++ b/subversion/libsvn_ra_svn/deprecated.c @@ -256,7 +256,8 @@ svn_ra_svn_create_conn3(apr_socket_t *sock, out_stream = svn_stream_from_aprfile2(out_file, FALSE, pool); return svn_ra_svn_create_conn4(sock, in_stream, out_stream, - compression_level, 0, 0, pool); + compression_level, zero_copy_limit, + error_check_interval, pool); } svn_ra_svn_conn_t * diff --git a/subversion/libsvn_ra_svn/marshal.c b/subversion/libsvn_ra_svn/marshal.c index 55e3c1f1bb6b..0778269fa404 100644 --- a/subversion/libsvn_ra_svn/marshal.c +++ b/subversion/libsvn_ra_svn/marshal.c @@ -944,6 +944,7 @@ static svn_error_t *read_string(svn_ra_svn_conn_t *conn, apr_pool_t *pool, 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 */ @@ -951,8 +952,9 @@ 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")); + buflen = conn->read_end - conn->read_ptr; /* Shorter strings can be copied directly from the read buffer. */ - if (conn->read_ptr + len <= conn->read_end) + if (len <= buflen) { item->kind = SVN_RA_SVN_STRING; item->u.string = svn_string_ncreate(conn->read_ptr, len, pool); diff --git a/subversion/libsvn_repos/dump.c b/subversion/libsvn_repos/dump.c index af7b6176da1b..78cd78bebc99 100644 --- a/subversion/libsvn_repos/dump.c +++ b/subversion/libsvn_repos/dump.c @@ -1164,13 +1164,13 @@ dump_node(struct edit_baton *eb, svn_fs_root_fs(eb->fs_root), compare_rev, pool)); - SVN_ERR(svn_fs_props_different(&must_dump_props, - compare_root, compare_path, - eb->fs_root, path, pool)); + SVN_ERR(svn_fs_props_changed(&must_dump_props, + compare_root, compare_path, + eb->fs_root, path, pool)); if (kind == svn_node_file) - SVN_ERR(svn_fs_contents_different(&must_dump_text, - compare_root, compare_path, - eb->fs_root, path, pool)); + SVN_ERR(svn_fs_contents_changed(&must_dump_text, + compare_root, compare_path, + eb->fs_root, path, pool)); break; case svn_node_action_delete: @@ -1293,16 +1293,16 @@ dump_node(struct edit_baton *eb, /* Need to decide if the copied node had any extra textual or property mods as well. */ - SVN_ERR(svn_fs_props_different(&must_dump_props, - compare_root, compare_path, - eb->fs_root, path, pool)); + SVN_ERR(svn_fs_props_changed(&must_dump_props, + compare_root, compare_path, + eb->fs_root, path, pool)); if (kind == svn_node_file) { svn_checksum_t *checksum; const char *hex_digest; - SVN_ERR(svn_fs_contents_different(&must_dump_text, - compare_root, compare_path, - eb->fs_root, path, pool)); + SVN_ERR(svn_fs_contents_changed(&must_dump_text, + compare_root, compare_path, + eb->fs_root, path, pool)); SVN_ERR(svn_fs_file_checksum(&checksum, svn_checksum_md5, compare_root, compare_path, diff --git a/subversion/libsvn_repos/log.c b/subversion/libsvn_repos/log.c index d6845a05e471..82caf0219ea8 100644 --- a/subversion/libsvn_repos/log.c +++ b/subversion/libsvn_repos/log.c @@ -2127,7 +2127,7 @@ do_logs(svn_fs_t *fs, if (added_mergeinfo || deleted_mergeinfo) { svn_revnum_t *cur_rev = - apr_pmemdup(pool, ¤t, sizeof(cur_rev)); + apr_pmemdup(pool, ¤t, sizeof(*cur_rev)); struct added_deleted_mergeinfo *add_and_del_mergeinfo = apr_palloc(pool, sizeof(*add_and_del_mergeinfo)); diff --git a/subversion/libsvn_repos/repos.c b/subversion/libsvn_repos/repos.c index 9cbe07381c6a..dc0caf5b532a 100644 --- a/subversion/libsvn_repos/repos.c +++ b/subversion/libsvn_repos/repos.c @@ -848,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 diff --git a/subversion/libsvn_subr/auth.c b/subversion/libsvn_subr/auth.c index 2cd83c4ca13a..303c41e5cc05 100644 --- a/subversion/libsvn_subr/auth.c +++ b/subversion/libsvn_subr/auth.c @@ -371,7 +371,9 @@ svn_auth_next_credentials(void **credentials, 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; } diff --git a/subversion/libsvn_subr/cache-membuffer.c b/subversion/libsvn_subr/cache-membuffer.c index 8aeaf775d771..87ac96168b0f 100644 --- a/subversion/libsvn_subr/cache-membuffer.c +++ b/subversion/libsvn_subr/cache-membuffer.c @@ -139,6 +139,10 @@ #endif /* 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 @@ -632,10 +636,6 @@ 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 * @@ -1643,28 +1643,6 @@ ensure_data_insertable_l1(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. - * - * Also, satisfy our buffer alignment needs for performance reasons. - */ -static void* secure_aligned_alloc(apr_pool_t *pool, - apr_size_t size, - svn_boolean_t zero) -{ - void* memory = apr_palloc(pool, size + ITEM_ALIGNMENT); - if (memory != NULL) - { - memory = ALIGN_POINTER(memory); - if (zero) - memset(memory, 0, size); - } - - return memory; -} - svn_error_t * svn_cache__membuffer_cache_create(svn_membuffer_t **cache, apr_size_t total_size, @@ -1822,10 +1800,11 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache, 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 = data_size - 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; - c[seg].data = secure_aligned_alloc(pool, (apr_size_t)data_size, FALSE); + /* 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; @@ -2204,7 +2183,7 @@ membuffer_cache_get_internal(svn_membuffer_t *cache, } size = ALIGN_VALUE(entry->size) - entry->key.key_len; - *buffer = ALIGN_POINTER(apr_palloc(result_pool, size + ITEM_ALIGNMENT-1)); + *buffer = apr_palloc(result_pool, size); memcpy(*buffer, cache->data + entry->offset + entry->key.key_len, size); #ifdef SVN_DEBUG_CACHE_MEMBUFFER diff --git a/subversion/libsvn_subr/eol.c b/subversion/libsvn_subr/eol.c index 417d90aaae46..e63cf1113577 100644 --- a/subversion/libsvn_subr/eol.c +++ b/subversion/libsvn_subr/eol.c @@ -33,20 +33,7 @@ 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) @@ -71,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/gpg_agent.c b/subversion/libsvn_subr/gpg_agent.c index 96021c52ec85..d53eec44c28f 100644 --- a/subversion/libsvn_subr/gpg_agent.c +++ b/subversion/libsvn_subr/gpg_agent.c @@ -103,6 +103,40 @@ 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. */ @@ -379,7 +413,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; @@ -452,7 +486,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; diff --git a/subversion/libsvn_subr/internal_statements.h b/subversion/libsvn_subr/internal_statements.h index 3c8e4599c8da..93251a47e997 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.9.2/subversion/libsvn_subr/token-map.h. +/* This file is automatically generated from internal_statements.sql and .dist_sandbox/subversion-1.9.4/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/prompt.c b/subversion/libsvn_subr/prompt.c index e00fa0ce4f71..8f24b424042a 100644 --- a/subversion/libsvn_subr/prompt.c +++ b/subversion/libsvn_subr/prompt.c @@ -831,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/sqlite.c b/subversion/libsvn_subr/sqlite.c index 6dddc8dd2260..18d1c4928558 100644 --- a/subversion/libsvn_subr/sqlite.c +++ b/subversion/libsvn_subr/sqlite.c @@ -1171,6 +1171,7 @@ 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); diff --git a/subversion/libsvn_subr/string.c b/subversion/libsvn_subr/string.c index 29176d6d5dc5..43a1a4ec1802 100644 --- a/subversion/libsvn_subr/string.c +++ b/subversion/libsvn_subr/string.c @@ -677,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); @@ -705,7 +705,7 @@ svn_stringbuf_replace(svn_stringbuf_t *str, if (pos > str->len) pos = str->len; - if (pos + old_count > str->len) + if (old_count > str->len - pos) old_count = str->len - pos; if (old_count < new_count) diff --git a/subversion/libsvn_subr/utf_validate.c b/subversion/libsvn_subr/utf_validate.c index 90e529e2ffb2..0aab81c9172e 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 ((unsigned char)*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 ((unsigned char)*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 || (unsigned char)*data >= 0x80) - return data; - - /* Scan the input one machine word at a time. */ -#ifndef SVN_UTF_NO_UNINITIALISED_ACCESS - /* This may read allocated but uninitialised 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 || (unsigned char)*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/version.c b/subversion/libsvn_subr/version.c index b10330e0b31e..95cb4d399379 100644 --- a/subversion/libsvn_subr/version.c +++ b/subversion/libsvn_subr/version.c @@ -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) 2015 The Apache Software Foundation.\n" + (pool, _("Copyright (C) 2016 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_wc/deprecated.c b/subversion/libsvn_wc/deprecated.c index e6db56887660..dcb5e42f749b 100644 --- a/subversion/libsvn_wc/deprecated.c +++ b/subversion/libsvn_wc/deprecated.c @@ -2051,7 +2051,7 @@ svn_wc_get_diff_editor6(const svn_delta_editor_t **editor, wc_ctx, anchor_abspath, target, depth, - use_git_diff_format, use_text_base, + ignore_ancestry, use_text_base, reverse_order, server_performs_filtering, changelist_filter, diff_processor, diff --git a/subversion/libsvn_wc/wc-checks.h b/subversion/libsvn_wc/wc-checks.h index 5888626ac030..35f15336f3fd 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.9.2/subversion/libsvn_wc/token-map.h. +/* This file is automatically generated from wc-checks.sql and .dist_sandbox/subversion-1.9.4/subversion/libsvn_wc/token-map.h. * Do not edit this file -- edit the source and rerun gen-make.py */ #define STMT_VERIFICATION_TRIGGERS 0 diff --git a/subversion/libsvn_wc/wc-metadata.h b/subversion/libsvn_wc/wc-metadata.h index 8367adc6ec37..7b74d83740d5 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.9.2/subversion/libsvn_wc/token-map.h. +/* This file is automatically generated from wc-metadata.sql and .dist_sandbox/subversion-1.9.4/subversion/libsvn_wc/token-map.h. * Do not edit this file -- edit the source and rerun gen-make.py */ #define STMT_CREATE_SCHEMA 0 diff --git a/subversion/libsvn_wc/wc-queries.h b/subversion/libsvn_wc/wc-queries.h index 523a6a169076..ad5ccb57355d 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.9.2/subversion/libsvn_wc/token-map.h. +/* This file is automatically generated from wc-queries.sql and .dist_sandbox/subversion-1.9.4/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 @@ -1623,7 +1623,8 @@ #define STMT_PRAGMA_LOCKING_MODE 151 #define STMT_151_INFO {"STMT_PRAGMA_LOCKING_MODE", NULL} #define STMT_151 \ - "PRAGMA locking_mode = exclusive " \ + "PRAGMA locking_mode = exclusive; " \ + "PRAGMA journal_mode = DELETE " \ "" #define STMT_INSERT_ACTUAL_NODE 152 diff --git a/subversion/libsvn_wc/wc-queries.sql b/subversion/libsvn_wc/wc-queries.sql index 5d8dbe375c74..3a8bf92a2776 100644 --- a/subversion/libsvn_wc/wc-queries.sql +++ b/subversion/libsvn_wc/wc-queries.sql @@ -1286,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 /* ------------------------------------------------------------------------- */ diff --git a/subversion/libsvn_wc/wc_db_pristine.c b/subversion/libsvn_wc/wc_db_pristine.c index bdfd46aa5c9a..9118d7068810 100644 --- a/subversion/libsvn_wc/wc_db_pristine.c +++ b/subversion/libsvn_wc/wc_db_pristine.c @@ -870,6 +870,7 @@ pristine_cleanup_wcroot(svn_wc__db_wcroot_t *wcroot, { 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, @@ -879,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/svn/conflict-callbacks.c b/subversion/svn/conflict-callbacks.c index 356f59d95e05..a9cb39a2ade1 100644 --- a/subversion/svn/conflict-callbacks.c +++ b/subversion/svn/conflict-callbacks.c @@ -775,7 +775,7 @@ handle_text_conflict(svn_wc_conflict_result_t *result, } else { - if (knows_something) + if (knows_something || desc->is_binary) *next_option++ = "r"; /* The 'mine-full' option selects the ".mine" file so only offer @@ -994,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, diff --git a/subversion/svn/diff-cmd.c b/subversion/svn/diff-cmd.c index 7a84736bee91..71853c7f2776 100644 --- a/subversion/svn/diff-cmd.c +++ b/subversion/svn/diff-cmd.c @@ -82,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 @@ -98,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. */ @@ -114,10 +120,14 @@ 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", + "props", prop_change, SVN_VA_NULL); svn_xml_escape_cdata_cstring(&sb, path, pool); @@ -135,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. */ @@ -155,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); } @@ -395,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, @@ -447,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, diff --git a/subversion/svn/lock-cmd.c b/subversion/svn/lock-cmd.c index c2795da9add8..e527ff858934 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/unlock-cmd.c b/subversion/svn/unlock-cmd.c index 0f94d2a2201f..3818d1f2450b 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/svnlook/svnlook.c b/subversion/svnlook/svnlook.c index e06933f38ca9..53ff2977d59b 100644 --- a/subversion/svnlook/svnlook.c +++ b/subversion/svnlook/svnlook.c @@ -674,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, @@ -683,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; @@ -701,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; @@ -711,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; @@ -721,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, 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, - tmpdir, - svn_io_file_del_none, - pool, pool)); - SVN_ERR(dump_contents(stream, root2, path2, 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; } @@ -830,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; @@ -839,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)); @@ -900,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) { @@ -909,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') @@ -918,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 @@ -1091,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)) { @@ -1143,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; } @@ -1525,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: @@ -1559,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; } diff --git a/subversion/svnserve/cyrus_auth.c b/subversion/svnserve/cyrus_auth.c index 98d9cedaf269..40f4228a999f 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; } diff --git a/win-tests.py b/win-tests.py index 2057db54283f..9c9daa307a25 100644 --- a/win-tests.py +++ b/win-tests.py @@ -25,7 +25,7 @@ """ # $HeadURL: http://svn.apache.org/repos/asf/subversion/branches/1.9.x/win-tests.py $ -# $LastChangedRevision: 1703828 $ +# $LastChangedRevision: 1718291 $ import os, sys, subprocess import filecmp @@ -226,7 +226,7 @@ def _usage_exit(): enable_sasl = 1 base_url = "svn://localhost/" elif opt == '--server-minor-version': - server_minor_version = val + server_minor_version = int(val) elif opt == '--bin': svn_bin = val elif opt in ('-p', '--parallel'):