Update subversion 1.9.5 -> 1.9.7
This includes a client-side fix for CVE-2017-9800.
This commit is contained in:
commit
081baee06a
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=322380
@ -1,3 +1,63 @@
|
|||||||
|
Version 1.9.7
|
||||||
|
(10 Aug 2017, from /branches/1.9.x)
|
||||||
|
http://svn.apache.org/repos/asf/subversion/tags/1.9.7
|
||||||
|
|
||||||
|
User-visible changes:
|
||||||
|
- Client-side bugfixes:
|
||||||
|
* Fix arbitrary code execution vulnerability CVE-2017-9800
|
||||||
|
See <https://subversion.apache.org/security/CVE-2017-9800-advisory.txt>
|
||||||
|
for details.
|
||||||
|
|
||||||
|
- Server-side bugfixes:
|
||||||
|
(none)
|
||||||
|
|
||||||
|
- Bindings bugfixes:
|
||||||
|
(none)
|
||||||
|
|
||||||
|
Developer-visible changes:
|
||||||
|
- General:
|
||||||
|
(none)
|
||||||
|
|
||||||
|
- API changes:
|
||||||
|
(none)
|
||||||
|
|
||||||
|
|
||||||
|
Version 1.9.6
|
||||||
|
(5 Jul 2017, from /branches/1.9.x)
|
||||||
|
http://svn.apache.org/repos/asf/subversion/tags/1.9.6
|
||||||
|
|
||||||
|
User-visible changes:
|
||||||
|
- Client-side bugfixes:
|
||||||
|
* cp/mv: improve error message when target is an unversioned dir (r1779948)
|
||||||
|
* merge: reduce memory usage with large amounts of mergeinfo (issue #4667)
|
||||||
|
|
||||||
|
- Server-side bugfixes:
|
||||||
|
* 'svnadmin freeze': document the purpose more clearly (r1774109)
|
||||||
|
* dump: fix segfault when a revision has no revprops (r1781507)
|
||||||
|
* fsfs: improve error message upon failure to open rep-cache (r1781655)
|
||||||
|
* fsfs: never attempt to share directory representations (r1785053)
|
||||||
|
* fsfs: make consistency independent of hash algorithms (r1785737 et al)
|
||||||
|
This change makes Subversion resilient to collision attacks, including
|
||||||
|
SHA-1 collision attacks such as <http://shattered.io/>. See also our
|
||||||
|
documentation at <https://subversion.apache.org/faq#shattered-sha1> and
|
||||||
|
<https://subversion.apache.org/docs/release-notes/1.9#shattered-sha1>.
|
||||||
|
|
||||||
|
- Client-side and server-side bugfixes:
|
||||||
|
* work around an APR bug related to file truncation (r1759116)
|
||||||
|
|
||||||
|
- Bindings bugfixes:
|
||||||
|
* javahl: follow redirects when opening a connection (r1667738, r1796720)
|
||||||
|
|
||||||
|
Developer-visible changes:
|
||||||
|
- General:
|
||||||
|
* win_tests.py: make the --bin option work, rather than abort (r1706432)
|
||||||
|
(regression introduced in 1.9.2)
|
||||||
|
* windows: support building with 'zlibstat.lib' in install-layout (r1783704)
|
||||||
|
|
||||||
|
- API changes:
|
||||||
|
(none)
|
||||||
|
|
||||||
|
|
||||||
Version 1.9.5
|
Version 1.9.5
|
||||||
(29 Nov 2016, from /branches/1.9.x)
|
(29 Nov 2016, from /branches/1.9.x)
|
||||||
http://svn.apache.org/repos/asf/subversion/tags/1.9.5
|
http://svn.apache.org/repos/asf/subversion/tags/1.9.5
|
||||||
@ -19,7 +79,7 @@ http://svn.apache.org/repos/asf/subversion/tags/1.9.5
|
|||||||
* fsfs: fix "offset too large" error during pack (issue #4657)
|
* fsfs: fix "offset too large" error during pack (issue #4657)
|
||||||
* svnserve: enable hook script environments (r1769152)
|
* svnserve: enable hook script environments (r1769152)
|
||||||
* fsfs: fix possible data reconstruction error (issue #4658)
|
* fsfs: fix possible data reconstruction error (issue #4658)
|
||||||
* fix source of spurious 'incoming edit' tree conflicts (r1770108)
|
* fix source of spurious 'incoming edit' tree conflicts (r1760570)
|
||||||
* fsfs: improve caching for large directories (r1721285)
|
* fsfs: improve caching for large directories (r1721285)
|
||||||
* fsfs: fix crash when encountering all-zero checksums (r1759686)
|
* fsfs: fix crash when encountering all-zero checksums (r1759686)
|
||||||
* fsfs: fix potential source of repository corruptions (r1756266)
|
* fsfs: fix potential source of repository corruptions (r1756266)
|
||||||
@ -34,19 +94,19 @@ http://svn.apache.org/repos/asf/subversion/tags/1.9.5
|
|||||||
|
|
||||||
- Bindings bugfixes:
|
- Bindings bugfixes:
|
||||||
* swig-pl: do not corrupt "{DATE}" revision variable (r1767768)
|
* swig-pl: do not corrupt "{DATE}" revision variable (r1767768)
|
||||||
* javahl: fix temporary accepting SSL server certificates (r1764851)
|
* javahl: fix temporarily accepting SSL server certificates (r1764851)
|
||||||
* swig-pl: fix possible stack corruption (r1683266, r1683267)
|
* swig-pl: fix possible stack corruption (r1683266, r1683267)
|
||||||
|
|
||||||
Developer-visible changes:
|
Developer-visible changes:
|
||||||
- General:
|
- General:
|
||||||
* add zlib discovery through pkg-config (issue #4655)
|
* add zlib discovery through pkg-config (issue #4655)
|
||||||
* fix potential build issue with invalid SVN_LOCALE_DIR (issue #4653)
|
* fix potential build issue with invalid SVN_LOCALE_DIR (issue #4653)
|
||||||
* ruby: fix test failures with ruby >= 2.2 (r1766621)
|
* ruby: fix test failures with ruby >= 2.2 (r1766240)
|
||||||
* fix link error with --disable-keychain on OS X (r1765385)
|
* fix link error with --disable-keychain on OS X (r1761755)
|
||||||
* swig: enable building with SWIG >= 3.0.6 (r1721488 et al)
|
* swig: enable building with SWIG >= 3.0.6 (r1721488 et al)
|
||||||
* swig: fix building with -Wdate-time in $CPPFLAGS (r1722164)
|
* swig: fix building with -Wdate-time in $CPPFLAGS (r1722164)
|
||||||
* update serf download URI in build scripts (r1700130 et al)
|
* update serf download URI in build scripts (r1700130 et al)
|
||||||
* raise minimal httpd version from 2.0 to 2.2 (r1754193)
|
* raise minimal httpd version from 2.0 to 2.2 (r1754190)
|
||||||
|
|
||||||
|
|
||||||
Version 1.9.4
|
Version 1.9.4
|
||||||
@ -105,7 +165,6 @@ http://svn.apache.org/repos/asf/subversion/tags/1.9.3
|
|||||||
* svn: report lock/unlock errors as failures (r1701598 et al)
|
* svn: report lock/unlock errors as failures (r1701598 et al)
|
||||||
* svn: cleanup user deleted external registrations (r1705843, r1710558)
|
* svn: cleanup user deleted external registrations (r1705843, r1710558)
|
||||||
* svn: allow simple resolving of binary file text conflicts (r1703581)
|
* 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: report built- and run-time versions of libserf (r1704847)
|
||||||
* ra_serf: set Content-Type header in outgoing requests (r1715224 et al)
|
* 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)
|
* svn: fix merging deletes of svn:eol-style CRLF/CR files (r1703689 et al)
|
||||||
@ -118,6 +177,7 @@ http://svn.apache.org/repos/asf/subversion/tags/1.9.3
|
|||||||
* mod_dav_svn: use LimitXMLRequestBody for skel-encoded requests (r1687812)
|
* mod_dav_svn: use LimitXMLRequestBody for skel-encoded requests (r1687812)
|
||||||
* svnadmin dump: preserve no-op changes (r1709388 et al, issue #4598)
|
* svnadmin dump: preserve no-op changes (r1709388 et al, issue #4598)
|
||||||
* fsfs: avoid unneeded I/O when opening transactions (r1715793)
|
* fsfs: avoid unneeded I/O when opening transactions (r1715793)
|
||||||
|
* svnlook: properly remove tempfiles on diff errors (r1711346)
|
||||||
|
|
||||||
- Client-side and server-side bugfixes:
|
- Client-side and server-side bugfixes:
|
||||||
* fix heap overflow in svn:// protocol parser (CVE-2015-5259)
|
* fix heap overflow in svn:// protocol parser (CVE-2015-5259)
|
||||||
@ -942,18 +1002,18 @@ http://svn.apache.org/repos/asf/subversion/tags/1.8.17
|
|||||||
- Client-side bugfixes:
|
- Client-side bugfixes:
|
||||||
* fix handling of newly secured subdirectories in working copy (r1724448)
|
* fix handling of newly secured subdirectories in working copy (r1724448)
|
||||||
* ra_serf: fix deleting directories with many files (issue #4557)
|
* ra_serf: fix deleting directories with many files (issue #4557)
|
||||||
* svnlook: properly remove tempfiles on diff errors (r1711346)
|
|
||||||
* gpg-agent: properly handle passwords with percent characters (issue #4611)
|
* gpg-agent: properly handle passwords with percent characters (issue #4611)
|
||||||
* merge: fix crash when merging to a local add (r1702299 et al)
|
* merge: fix crash when merging to a local add (r1702299 et al)
|
||||||
|
|
||||||
- Server-side bugfixes:
|
- Server-side bugfixes:
|
||||||
* fsfs: fix possible data reconstruction error (issue #4658)
|
* fsfs: fix possible data reconstruction error (issue #4658)
|
||||||
|
* svnlook: properly remove tempfiles on diff errors (r1711346)
|
||||||
|
|
||||||
- Client-side and server-side bugfixes:
|
- Client-side and server-side bugfixes:
|
||||||
* fix potential memory access bugs (r1722860 et al)
|
* fix potential memory access bugs (r1722860 et al)
|
||||||
|
|
||||||
- Bindings bugfixes:
|
- Bindings bugfixes:
|
||||||
* javahl: fix temporary accepting SSL server certificates (r1764851)
|
* javahl: fix temporarily accepting SSL server certificates (r1764851)
|
||||||
* swig-pl: do not corrupt "{DATE}" revision variable (r1767768)
|
* swig-pl: do not corrupt "{DATE}" revision variable (r1767768)
|
||||||
* swig-pl: fix possible stack corruption (r1683266)
|
* swig-pl: fix possible stack corruption (r1683266)
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
Apache Subversion
|
Apache Subversion
|
||||||
Copyright 2016 The Apache Software Foundation
|
Copyright 2017 The Apache Software Foundation
|
||||||
|
|
||||||
This product includes software developed by many people, and distributed
|
This product includes software developed by many people, and distributed
|
||||||
under Contributor License Agreements to The Apache Software Foundation
|
under Contributor License Agreements to The Apache Software Foundation
|
||||||
|
@ -2782,7 +2782,7 @@ subversion/libsvn_ra_serf/util_error.lo: subversion/libsvn_ra_serf/util_error.c
|
|||||||
|
|
||||||
subversion/libsvn_ra_serf/xml.lo: subversion/libsvn_ra_serf/xml.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.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_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_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
|
subversion/libsvn_ra_serf/xml.lo: subversion/libsvn_ra_serf/xml.c subversion/include/private/svn_dav_protocol.h subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_string_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.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_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_ra.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/include/svn_xml.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra_serf/blncache.h subversion/libsvn_ra_serf/ra_serf.h subversion/svn_private_config.h
|
||||||
|
|
||||||
subversion/libsvn_ra_svn/client.lo: subversion/libsvn_ra_svn/client.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_ra_svn_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_compat.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_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_ra_svn.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra/wrapper_template.h subversion/libsvn_ra_svn/ra_svn.h subversion/svn_private_config.h
|
subversion/libsvn_ra_svn/client.lo: subversion/libsvn_ra_svn/client.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_fspath.h subversion/include/private/svn_ra_private.h subversion/include/private/svn_ra_svn_private.h subversion/include/private/svn_subr_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_compat.h subversion/include/svn_config.h subversion/include/svn_ctype.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_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_ra_svn.h subversion/include/svn_string.h subversion/include/svn_time.h subversion/include/svn_types.h subversion/include/svn_version.h subversion/libsvn_ra/ra_loader.h subversion/libsvn_ra/wrapper_template.h subversion/libsvn_ra_svn/ra_svn.h subversion/svn_private_config.h
|
||||||
|
|
||||||
subversion/libsvn_ra_svn/cram.lo: subversion/libsvn_ra_svn/cram.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_svn_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_ra.h subversion/include/svn_ra_svn.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra_svn/ra_svn.h subversion/svn_private_config.h
|
subversion/libsvn_ra_svn/cram.lo: subversion/libsvn_ra_svn/cram.c subversion/include/private/svn_debug.h subversion/include/private/svn_editor.h subversion/include/private/svn_ra_svn_private.h subversion/include/svn_auth.h subversion/include/svn_checksum.h subversion/include/svn_config.h subversion/include/svn_delta.h subversion/include/svn_error.h subversion/include/svn_error_codes.h subversion/include/svn_io.h subversion/include/svn_mergeinfo.h subversion/include/svn_ra.h subversion/include/svn_ra_svn.h subversion/include/svn_string.h subversion/include/svn_types.h subversion/libsvn_ra_svn/ra_svn.h subversion/svn_private_config.h
|
||||||
|
|
||||||
|
22
contrib/subversion/configure
vendored
22
contrib/subversion/configure
vendored
@ -1,6 +1,6 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.69 for subversion 1.9.5.
|
# Generated by GNU Autoconf 2.69 for subversion 1.9.7.
|
||||||
#
|
#
|
||||||
# Report bugs to <http://subversion.apache.org/>.
|
# Report bugs to <http://subversion.apache.org/>.
|
||||||
#
|
#
|
||||||
@ -590,8 +590,8 @@ MAKEFLAGS=
|
|||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='subversion'
|
PACKAGE_NAME='subversion'
|
||||||
PACKAGE_TARNAME='subversion'
|
PACKAGE_TARNAME='subversion'
|
||||||
PACKAGE_VERSION='1.9.5'
|
PACKAGE_VERSION='1.9.7'
|
||||||
PACKAGE_STRING='subversion 1.9.5'
|
PACKAGE_STRING='subversion 1.9.7'
|
||||||
PACKAGE_BUGREPORT='http://subversion.apache.org/'
|
PACKAGE_BUGREPORT='http://subversion.apache.org/'
|
||||||
PACKAGE_URL=''
|
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.
|
# 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.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures subversion 1.9.5 to adapt to many kinds of systems.
|
\`configure' configures subversion 1.9.7 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
@ -1537,7 +1537,7 @@ fi
|
|||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of subversion 1.9.5:";;
|
short | recursive ) echo "Configuration of subversion 1.9.7:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
@ -1751,7 +1751,7 @@ fi
|
|||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
subversion configure 1.9.5
|
subversion configure 1.9.7
|
||||||
generated by GNU Autoconf 2.69
|
generated by GNU Autoconf 2.69
|
||||||
|
|
||||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
@ -2295,7 +2295,7 @@ cat >config.log <<_ACEOF
|
|||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by subversion $as_me 1.9.5, which was
|
It was created by subversion $as_me 1.9.7, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
$ $0 $@
|
$ $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.5" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring Subversion 1.9.7" >&5
|
||||||
$as_echo "$as_me: Configuring Subversion 1.9.5" >&6;}
|
$as_echo "$as_me: Configuring Subversion 1.9.7" >&6;}
|
||||||
|
|
||||||
abs_srcdir="`cd $srcdir && pwd`"
|
abs_srcdir="`cd $srcdir && pwd`"
|
||||||
|
|
||||||
@ -26756,7 +26756,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by subversion $as_me 1.9.5, which was
|
This file was extended by subversion $as_me 1.9.7, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
@ -26822,7 +26822,7 @@ _ACEOF
|
|||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
subversion config.status 1.9.5
|
subversion config.status 1.9.7
|
||||||
configured by $0, generated by GNU Autoconf 2.69,
|
configured by $0, generated by GNU Autoconf 2.69,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ extern "C" {
|
|||||||
*
|
*
|
||||||
* @since New in 1.1.
|
* @since New in 1.1.
|
||||||
*/
|
*/
|
||||||
#define SVN_VER_PATCH 5
|
#define SVN_VER_PATCH 7
|
||||||
|
|
||||||
|
|
||||||
/** @deprecated Provided for backward compatibility with the 1.0 API. */
|
/** @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.
|
* Always change this at the same time as SVN_VER_NUMTAG.
|
||||||
*/
|
*/
|
||||||
#define SVN_VER_TAG " (r1770682)"
|
#define SVN_VER_TAG " (r1800392)"
|
||||||
|
|
||||||
|
|
||||||
/** Number tag: a string describing the version.
|
/** 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
|
* file version. Its value remains 0 in the repository except in release
|
||||||
* tags where it is the revision from which the tag was created.
|
* tags where it is the revision from which the tag was created.
|
||||||
*/
|
*/
|
||||||
#define SVN_VER_REVISION 1770682
|
#define SVN_VER_REVISION 1800392
|
||||||
|
|
||||||
|
|
||||||
/* Version strings composed from the above definitions. */
|
/* Version strings composed from the above definitions. */
|
||||||
|
@ -1057,10 +1057,24 @@ verify_wc_dsts(const apr_array_header_t *copy_pairs,
|
|||||||
ctx->wc_ctx, pair->dst_parent_abspath,
|
ctx->wc_ctx, pair->dst_parent_abspath,
|
||||||
FALSE, TRUE,
|
FALSE, TRUE,
|
||||||
iterpool));
|
iterpool));
|
||||||
if (make_parents && dst_parent_kind == svn_node_none)
|
if (dst_parent_kind == svn_node_none)
|
||||||
{
|
{
|
||||||
SVN_ERR(svn_client__make_local_parents(pair->dst_parent_abspath,
|
if (make_parents)
|
||||||
TRUE, ctx, iterpool));
|
SVN_ERR(svn_client__make_local_parents(pair->dst_parent_abspath,
|
||||||
|
TRUE, ctx, iterpool));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SVN_ERR(svn_io_check_path(pair->dst_parent_abspath,
|
||||||
|
&dst_parent_kind, scratch_pool));
|
||||||
|
return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
|
||||||
|
(dst_parent_kind == svn_node_dir)
|
||||||
|
? _("Directory '%s' is not under "
|
||||||
|
"version control")
|
||||||
|
: _("Path '%s' is not a directory"),
|
||||||
|
svn_dirent_local_style(
|
||||||
|
pair->dst_parent_abspath,
|
||||||
|
scratch_pool));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (dst_parent_kind != svn_node_dir)
|
else if (dst_parent_kind != svn_node_dir)
|
||||||
{
|
{
|
||||||
|
@ -6465,6 +6465,7 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
|
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
|
||||||
|
apr_pool_t *swmi_pool;
|
||||||
apr_hash_t *subtrees_with_mergeinfo;
|
apr_hash_t *subtrees_with_mergeinfo;
|
||||||
apr_hash_t *excluded_subtrees;
|
apr_hash_t *excluded_subtrees;
|
||||||
apr_hash_t *switched_subtrees;
|
apr_hash_t *switched_subtrees;
|
||||||
@ -6473,10 +6474,13 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
|
|||||||
struct pre_merge_status_baton_t pre_merge_status_baton;
|
struct pre_merge_status_baton_t pre_merge_status_baton;
|
||||||
|
|
||||||
/* Case 1: Subtrees with explicit mergeinfo. */
|
/* Case 1: Subtrees with explicit mergeinfo. */
|
||||||
|
/* Use a subpool for subtrees_with_mergeinfo, as it can be very large
|
||||||
|
and is temporary. */
|
||||||
|
swmi_pool = svn_pool_create(scratch_pool);
|
||||||
SVN_ERR(get_wc_explicit_mergeinfo_catalog(&subtrees_with_mergeinfo,
|
SVN_ERR(get_wc_explicit_mergeinfo_catalog(&subtrees_with_mergeinfo,
|
||||||
target->abspath,
|
target->abspath,
|
||||||
depth, ctx,
|
depth, ctx,
|
||||||
result_pool, scratch_pool));
|
swmi_pool, swmi_pool));
|
||||||
if (subtrees_with_mergeinfo)
|
if (subtrees_with_mergeinfo)
|
||||||
{
|
{
|
||||||
apr_hash_index_t *hi;
|
apr_hash_index_t *hi;
|
||||||
@ -6513,6 +6517,7 @@ get_mergeinfo_paths(apr_array_header_t *children_with_mergeinfo,
|
|||||||
children_with_mergeinfo->elt_size,
|
children_with_mergeinfo->elt_size,
|
||||||
compare_merge_path_t_as_paths);
|
compare_merge_path_t_as_paths);
|
||||||
}
|
}
|
||||||
|
svn_pool_destroy(swmi_pool);
|
||||||
|
|
||||||
/* Case 2: Switched subtrees
|
/* Case 2: Switched subtrees
|
||||||
Case 10: Paths at depths of 'empty' or 'files'
|
Case 10: Paths at depths of 'empty' or 'files'
|
||||||
@ -12331,6 +12336,10 @@ find_last_merged_location(svn_client__pathrev_t **base_p,
|
|||||||
svn_revnum_t youngest_merged_rev = SVN_INVALID_REVNUM;
|
svn_revnum_t youngest_merged_rev = SVN_INVALID_REVNUM;
|
||||||
svn_mergeinfo_catalog_t target_mergeinfo_cat = NULL;
|
svn_mergeinfo_catalog_t target_mergeinfo_cat = NULL;
|
||||||
|
|
||||||
|
/* Using a local subpool for 'target_mergeinfo_cat' can make a big
|
||||||
|
reduction in overall memory usage. */
|
||||||
|
apr_pool_t *tmic_pool = svn_pool_create(scratch_pool);
|
||||||
|
|
||||||
source_peg_rev.kind = svn_opt_revision_number;
|
source_peg_rev.kind = svn_opt_revision_number;
|
||||||
source_peg_rev.value.number = source_branch->tip->rev;
|
source_peg_rev.value.number = source_branch->tip->rev;
|
||||||
source_start_rev.kind = svn_opt_revision_number;
|
source_start_rev.kind = svn_opt_revision_number;
|
||||||
@ -12351,7 +12360,7 @@ find_last_merged_location(svn_client__pathrev_t **base_p,
|
|||||||
operative_rev_receiver,
|
operative_rev_receiver,
|
||||||
&youngest_merged_rev,
|
&youngest_merged_rev,
|
||||||
ctx, ra_session,
|
ctx, ra_session,
|
||||||
result_pool, scratch_pool));
|
tmic_pool, tmic_pool));
|
||||||
|
|
||||||
if (!SVN_IS_VALID_REVNUM(youngest_merged_rev))
|
if (!SVN_IS_VALID_REVNUM(youngest_merged_rev))
|
||||||
{
|
{
|
||||||
@ -12387,7 +12396,7 @@ find_last_merged_location(svn_client__pathrev_t **base_p,
|
|||||||
operative_rev_receiver,
|
operative_rev_receiver,
|
||||||
&oldest_eligible_rev,
|
&oldest_eligible_rev,
|
||||||
ctx, ra_session,
|
ctx, ra_session,
|
||||||
scratch_pool, scratch_pool));
|
tmic_pool, tmic_pool));
|
||||||
|
|
||||||
/* If there are revisions eligible for merging, use the oldest one
|
/* If there are revisions eligible for merging, use the oldest one
|
||||||
to calculate the base. Otherwise there are no operative revisions
|
to calculate the base. Otherwise there are no operative revisions
|
||||||
@ -12409,6 +12418,7 @@ find_last_merged_location(svn_client__pathrev_t **base_p,
|
|||||||
result_pool, scratch_pool));
|
result_pool, scratch_pool));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
svn_pool_destroy(tmic_pool);
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2029,8 +2029,13 @@ rep_read_contents(void *baton,
|
|||||||
SVN_ERR(skip_contents(rb, rb->fulltext_delivered));
|
SVN_ERR(skip_contents(rb, rb->fulltext_delivered));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the next block of data. */
|
/* Get the next block of data.
|
||||||
SVN_ERR(get_contents_from_windows(rb, buf, len));
|
* Keep in mind that the representation might be empty and leave us
|
||||||
|
* already positioned at the end of the rep. */
|
||||||
|
if (rb->off == rb->len)
|
||||||
|
*len = 0;
|
||||||
|
else
|
||||||
|
SVN_ERR(get_contents_from_windows(rb, buf, len));
|
||||||
|
|
||||||
if (rb->current_fulltext)
|
if (rb->current_fulltext)
|
||||||
svn_stringbuf_appendbytes(rb->current_fulltext, buf, *len);
|
svn_stringbuf_appendbytes(rb->current_fulltext, buf, *len);
|
||||||
@ -2123,6 +2128,96 @@ svn_fs_fs__get_contents(svn_stream_t **contents_p,
|
|||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
svn_error_t *
|
||||||
|
svn_fs_fs__get_contents_from_file(svn_stream_t **contents_p,
|
||||||
|
svn_fs_t *fs,
|
||||||
|
representation_t *rep,
|
||||||
|
apr_file_t *file,
|
||||||
|
apr_off_t offset,
|
||||||
|
apr_pool_t *pool)
|
||||||
|
{
|
||||||
|
struct rep_read_baton *rb;
|
||||||
|
pair_cache_key_t fulltext_cache_key = { SVN_INVALID_REVNUM, 0 };
|
||||||
|
rep_state_t *rs = apr_pcalloc(pool, sizeof(*rs));
|
||||||
|
svn_fs_fs__rep_header_t *rh;
|
||||||
|
|
||||||
|
/* Initialize the reader baton. Some members may added lazily
|
||||||
|
* while reading from the stream. */
|
||||||
|
SVN_ERR(rep_read_get_baton(&rb, fs, rep, fulltext_cache_key, pool));
|
||||||
|
|
||||||
|
/* Continue constructing RS. Leave caches as NULL. */
|
||||||
|
rs->size = rep->size;
|
||||||
|
rs->revision = SVN_INVALID_REVNUM;
|
||||||
|
rs->item_index = 0;
|
||||||
|
rs->ver = -1;
|
||||||
|
rs->start = -1;
|
||||||
|
|
||||||
|
/* Provide just enough file access info to allow for a basic read from
|
||||||
|
* FILE but leave all index / footer info with empty values b/c FILE
|
||||||
|
* probably is not a complete revision file. */
|
||||||
|
rs->sfile = apr_pcalloc(pool, sizeof(*rs->sfile));
|
||||||
|
rs->sfile->revision = rep->revision;
|
||||||
|
rs->sfile->pool = pool;
|
||||||
|
rs->sfile->fs = fs;
|
||||||
|
rs->sfile->rfile = apr_pcalloc(pool, sizeof(*rs->sfile->rfile));
|
||||||
|
rs->sfile->rfile->start_revision = SVN_INVALID_REVNUM;
|
||||||
|
rs->sfile->rfile->file = file;
|
||||||
|
rs->sfile->rfile->stream = svn_stream_from_aprfile2(file, TRUE, pool);
|
||||||
|
|
||||||
|
/* Read the rep header. */
|
||||||
|
SVN_ERR(aligned_seek(fs, file, NULL, offset, pool));
|
||||||
|
SVN_ERR(svn_fs_fs__read_rep_header(&rh, rs->sfile->rfile->stream,
|
||||||
|
pool, pool));
|
||||||
|
SVN_ERR(get_file_offset(&rs->start, rs, pool));
|
||||||
|
rs->header_size = rh->header_size;
|
||||||
|
|
||||||
|
/* Log the access. */
|
||||||
|
SVN_ERR(dbg_log_access(fs, SVN_INVALID_REVNUM, 0, rh,
|
||||||
|
SVN_FS_FS__ITEM_TYPE_ANY_REP, pool));
|
||||||
|
|
||||||
|
/* Build the representation list (delta chain). */
|
||||||
|
if (rh->type == svn_fs_fs__rep_plain)
|
||||||
|
{
|
||||||
|
rb->rs_list = apr_array_make(pool, 0, sizeof(rep_state_t *));
|
||||||
|
rb->src_state = rs;
|
||||||
|
}
|
||||||
|
else if (rh->type == svn_fs_fs__rep_self_delta)
|
||||||
|
{
|
||||||
|
rb->rs_list = apr_array_make(pool, 1, sizeof(rep_state_t *));
|
||||||
|
APR_ARRAY_PUSH(rb->rs_list, rep_state_t *) = rs;
|
||||||
|
rb->src_state = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
representation_t next_rep = { 0 };
|
||||||
|
|
||||||
|
/* skip "SVNx" diff marker */
|
||||||
|
rs->current = 4;
|
||||||
|
|
||||||
|
/* REP's base rep is inside a proper revision.
|
||||||
|
* It can be reconstructed in the usual way. */
|
||||||
|
next_rep.revision = rh->base_revision;
|
||||||
|
next_rep.item_index = rh->base_item_index;
|
||||||
|
next_rep.size = rh->base_length;
|
||||||
|
svn_fs_fs__id_txn_reset(&next_rep.txn_id);
|
||||||
|
|
||||||
|
SVN_ERR(build_rep_list(&rb->rs_list, &rb->base_window,
|
||||||
|
&rb->src_state, &rb->len, rb->fs, &next_rep,
|
||||||
|
rb->filehandle_pool));
|
||||||
|
|
||||||
|
/* Insert the access to REP as the first element of the delta chain. */
|
||||||
|
svn_sort__array_insert(rb->rs_list, &rs, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now, the baton is complete and we can assemble the stream around it. */
|
||||||
|
*contents_p = svn_stream_create(rb, pool);
|
||||||
|
svn_stream_set_read2(*contents_p, NULL /* only full read support */,
|
||||||
|
rep_read_contents);
|
||||||
|
svn_stream_set_close(*contents_p, rep_read_contents_close);
|
||||||
|
|
||||||
|
return SVN_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
/* Baton for cache_access_wrapper. Wraps the original parameters of
|
/* Baton for cache_access_wrapper. Wraps the original parameters of
|
||||||
* svn_fs_fs__try_process_file_content().
|
* svn_fs_fs__try_process_file_content().
|
||||||
*/
|
*/
|
||||||
|
@ -81,6 +81,18 @@ svn_fs_fs__get_contents(svn_stream_t **contents_p,
|
|||||||
svn_boolean_t cache_fulltext,
|
svn_boolean_t cache_fulltext,
|
||||||
apr_pool_t *pool);
|
apr_pool_t *pool);
|
||||||
|
|
||||||
|
/* Set *CONTENTS_P to be a readable svn_stream_t that receives the text
|
||||||
|
representation REP as seen in filesystem FS. Read the latest element
|
||||||
|
of the delta chain from FILE at offset OFFSET.
|
||||||
|
Use POOL for allocations. */
|
||||||
|
svn_error_t *
|
||||||
|
svn_fs_fs__get_contents_from_file(svn_stream_t **contents_p,
|
||||||
|
svn_fs_t *fs,
|
||||||
|
representation_t *rep,
|
||||||
|
apr_file_t *file,
|
||||||
|
apr_off_t offset,
|
||||||
|
apr_pool_t *pool);
|
||||||
|
|
||||||
/* Attempt to fetch the text representation of node-revision NODEREV as
|
/* Attempt to fetch the text representation of node-revision NODEREV as
|
||||||
seen in filesystem FS and pass it along with the BATON to the PROCESSOR.
|
seen in filesystem FS and pass it along with the BATON to the PROCESSOR.
|
||||||
Set *SUCCESS only of the data could be provided and the processing
|
Set *SUCCESS only of the data could be provided and the processing
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_fs_fs/token-map.h.
|
/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.7/subversion/libsvn_fs_fs/token-map.h.
|
||||||
* Do not edit this file -- edit the source and rerun gen-make.py */
|
* Do not edit this file -- edit the source and rerun gen-make.py */
|
||||||
|
|
||||||
#define STMT_CREATE_SCHEMA 0
|
#define STMT_CREATE_SCHEMA 0
|
||||||
|
@ -128,7 +128,10 @@ svn_fs_fs__open_rep_cache(svn_fs_t *fs,
|
|||||||
fs_fs_data_t *ffd = fs->fsap_data;
|
fs_fs_data_t *ffd = fs->fsap_data;
|
||||||
svn_error_t *err = svn_atomic__init_once(&ffd->rep_cache_db_opened,
|
svn_error_t *err = svn_atomic__init_once(&ffd->rep_cache_db_opened,
|
||||||
open_rep_cache, fs, pool);
|
open_rep_cache, fs, pool);
|
||||||
return svn_error_quick_wrap(err, _("Couldn't open rep-cache database"));
|
return svn_error_quick_wrapf(err,
|
||||||
|
_("Couldn't open rep-cache database '%s'"),
|
||||||
|
svn_dirent_local_style(
|
||||||
|
path_rep_cache_db(fs->path, pool), pool));
|
||||||
}
|
}
|
||||||
|
|
||||||
svn_error_t *
|
svn_error_t *
|
||||||
|
@ -2128,6 +2128,11 @@ rep_write_get_baton(struct rep_write_baton **wb_p,
|
|||||||
there may be new duplicate representations within the same uncommitted
|
there may be new duplicate representations within the same uncommitted
|
||||||
revision, those can be passed in REPS_HASH (maps a sha1 digest onto
|
revision, those can be passed in REPS_HASH (maps a sha1 digest onto
|
||||||
representation_t*), otherwise pass in NULL for REPS_HASH.
|
representation_t*), otherwise pass in NULL for REPS_HASH.
|
||||||
|
|
||||||
|
The content of both representations will be compared, taking REP's content
|
||||||
|
from FILE at OFFSET. Only if they actually match, will *OLD_REP not be
|
||||||
|
NULL.
|
||||||
|
|
||||||
Use RESULT_POOL for *OLD_REP allocations and SCRATCH_POOL for temporaries.
|
Use RESULT_POOL for *OLD_REP allocations and SCRATCH_POOL for temporaries.
|
||||||
The lifetime of *OLD_REP is limited by both, RESULT_POOL and REP lifetime.
|
The lifetime of *OLD_REP is limited by both, RESULT_POOL and REP lifetime.
|
||||||
*/
|
*/
|
||||||
@ -2135,6 +2140,8 @@ static svn_error_t *
|
|||||||
get_shared_rep(representation_t **old_rep,
|
get_shared_rep(representation_t **old_rep,
|
||||||
svn_fs_t *fs,
|
svn_fs_t *fs,
|
||||||
representation_t *rep,
|
representation_t *rep,
|
||||||
|
apr_file_t *file,
|
||||||
|
apr_off_t offset,
|
||||||
apr_hash_t *reps_hash,
|
apr_hash_t *reps_hash,
|
||||||
apr_pool_t *result_pool,
|
apr_pool_t *result_pool,
|
||||||
apr_pool_t *scratch_pool)
|
apr_pool_t *scratch_pool)
|
||||||
@ -2142,6 +2149,10 @@ get_shared_rep(representation_t **old_rep,
|
|||||||
svn_error_t *err;
|
svn_error_t *err;
|
||||||
fs_fs_data_t *ffd = fs->fsap_data;
|
fs_fs_data_t *ffd = fs->fsap_data;
|
||||||
|
|
||||||
|
svn_checksum_t checksum;
|
||||||
|
checksum.digest = rep->sha1_digest;
|
||||||
|
checksum.kind = svn_checksum_sha1;
|
||||||
|
|
||||||
/* Return NULL, if rep sharing has been disabled. */
|
/* Return NULL, if rep sharing has been disabled. */
|
||||||
*old_rep = NULL;
|
*old_rep = NULL;
|
||||||
if (!ffd->rep_sharing_allowed)
|
if (!ffd->rep_sharing_allowed)
|
||||||
@ -2158,9 +2169,6 @@ get_shared_rep(representation_t **old_rep,
|
|||||||
/* If we haven't found anything yet, try harder and consult our DB. */
|
/* If we haven't found anything yet, try harder and consult our DB. */
|
||||||
if (*old_rep == NULL)
|
if (*old_rep == NULL)
|
||||||
{
|
{
|
||||||
svn_checksum_t checksum;
|
|
||||||
checksum.digest = rep->sha1_digest;
|
|
||||||
checksum.kind = svn_checksum_sha1;
|
|
||||||
err = svn_fs_fs__get_rep_reference(old_rep, fs, &checksum, result_pool);
|
err = svn_fs_fs__get_rep_reference(old_rep, fs, &checksum, result_pool);
|
||||||
/* ### Other error codes that we shouldn't mask out? */
|
/* ### Other error codes that we shouldn't mask out? */
|
||||||
if (err == SVN_NO_ERROR)
|
if (err == SVN_NO_ERROR)
|
||||||
@ -2235,6 +2243,72 @@ get_shared_rep(representation_t **old_rep,
|
|||||||
(*old_rep)->uniquifier = rep->uniquifier;
|
(*old_rep)->uniquifier = rep->uniquifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we (very likely) found a matching representation, compare the actual
|
||||||
|
* contents such that we can be sure that no rep-cache.db corruption or
|
||||||
|
* hash collision produced a false positive. */
|
||||||
|
if (*old_rep)
|
||||||
|
{
|
||||||
|
apr_off_t old_position;
|
||||||
|
svn_stream_t *contents;
|
||||||
|
svn_stream_t *old_contents;
|
||||||
|
svn_boolean_t same;
|
||||||
|
|
||||||
|
/* The existing representation may itself be part of the current
|
||||||
|
* transaction. In that case, it may be in different stages of
|
||||||
|
* the commit finalization process.
|
||||||
|
*
|
||||||
|
* OLD_REP_NORM is the same as that OLD_REP but it is assigned
|
||||||
|
* explicitly to REP's transaction if OLD_REP does not point
|
||||||
|
* to an already committed revision. This then prevents the
|
||||||
|
* revision lookup and the txn data will be accessed.
|
||||||
|
*/
|
||||||
|
representation_t old_rep_norm = **old_rep;
|
||||||
|
if ( !SVN_IS_VALID_REVNUM(old_rep_norm.revision)
|
||||||
|
|| old_rep_norm.revision > ffd->youngest_rev_cache)
|
||||||
|
old_rep_norm.txn_id = rep->txn_id;
|
||||||
|
|
||||||
|
/* Make sure we can later restore FILE's current position. */
|
||||||
|
SVN_ERR(svn_fs_fs__get_file_offset(&old_position, file, scratch_pool));
|
||||||
|
|
||||||
|
/* Compare the two representations.
|
||||||
|
* Note that the stream comparison might also produce MD5 checksum
|
||||||
|
* errors or other failures in case of SHA1 collisions. */
|
||||||
|
SVN_ERR(svn_fs_fs__get_contents_from_file(&contents, fs, rep, file,
|
||||||
|
offset, scratch_pool));
|
||||||
|
SVN_ERR(svn_fs_fs__get_contents(&old_contents, fs, &old_rep_norm,
|
||||||
|
FALSE, scratch_pool));
|
||||||
|
err = svn_stream_contents_same2(&same, contents, old_contents,
|
||||||
|
scratch_pool);
|
||||||
|
|
||||||
|
/* A mismatch should be extremely rare.
|
||||||
|
* If it does happen, reject the commit. */
|
||||||
|
if (!same || err)
|
||||||
|
{
|
||||||
|
/* SHA1 collision or worse. */
|
||||||
|
svn_stringbuf_t *old_rep_str
|
||||||
|
= svn_fs_fs__unparse_representation(*old_rep,
|
||||||
|
ffd->format, FALSE,
|
||||||
|
scratch_pool,
|
||||||
|
scratch_pool);
|
||||||
|
svn_stringbuf_t *rep_str
|
||||||
|
= svn_fs_fs__unparse_representation(rep,
|
||||||
|
ffd->format, FALSE,
|
||||||
|
scratch_pool,
|
||||||
|
scratch_pool);
|
||||||
|
const char *checksum__str
|
||||||
|
= svn_checksum_to_cstring_display(&checksum, scratch_pool);
|
||||||
|
|
||||||
|
return svn_error_createf(SVN_ERR_FS_GENERAL,
|
||||||
|
err, "SHA1 of reps '%s' and '%s' "
|
||||||
|
"matches (%s) but contents differ",
|
||||||
|
old_rep_str->data, rep_str->data,
|
||||||
|
checksum__str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restore FILE's read / write position. */
|
||||||
|
SVN_ERR(svn_io_file_seek(file, APR_SET, &old_position, scratch_pool));
|
||||||
|
}
|
||||||
|
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2293,8 +2367,8 @@ rep_write_contents_close(void *baton)
|
|||||||
|
|
||||||
/* Check and see if we already have a representation somewhere that's
|
/* Check and see if we already have a representation somewhere that's
|
||||||
identical to the one we just wrote out. */
|
identical to the one we just wrote out. */
|
||||||
SVN_ERR(get_shared_rep(&old_rep, b->fs, rep, NULL, b->result_pool,
|
SVN_ERR(get_shared_rep(&old_rep, b->fs, rep, b->file, b->rep_offset, NULL,
|
||||||
b->scratch_pool));
|
b->result_pool, b->scratch_pool));
|
||||||
|
|
||||||
if (old_rep)
|
if (old_rep)
|
||||||
{
|
{
|
||||||
@ -2519,11 +2593,16 @@ write_directory_to_stream(svn_stream_t *stream,
|
|||||||
/* Write out the COLLECTION as a text representation to file FILE using
|
/* Write out the COLLECTION as a text representation to file FILE using
|
||||||
WRITER. In the process, record position, the total size of the dump and
|
WRITER. In the process, record position, the total size of the dump and
|
||||||
MD5 as well as SHA1 in REP. Add the representation of type ITEM_TYPE to
|
MD5 as well as SHA1 in REP. Add the representation of type ITEM_TYPE to
|
||||||
the indexes if necessary. If rep sharing has been enabled and REPS_HASH
|
the indexes if necessary.
|
||||||
is not NULL, it will be used in addition to the on-disk cache to find
|
|
||||||
earlier reps with the same content. When such existing reps can be
|
If ALLOW_REP_SHARING is FALSE, rep-sharing will not be used, regardless
|
||||||
found, we will truncate the one just written from the file and return
|
of any other option and rep-sharing settings. If rep sharing has been
|
||||||
the existing rep. Perform temporary allocations in SCRATCH_POOL. */
|
enabled and REPS_HASH is not NULL, it will be used in addition to the
|
||||||
|
on-disk cache to find earlier reps with the same content. If such
|
||||||
|
existing reps can be found, we will truncate the one just written from
|
||||||
|
the file and return the existing rep.
|
||||||
|
|
||||||
|
Perform temporary allocations in SCRATCH_POOL. */
|
||||||
static svn_error_t *
|
static svn_error_t *
|
||||||
write_container_rep(representation_t *rep,
|
write_container_rep(representation_t *rep,
|
||||||
apr_file_t *file,
|
apr_file_t *file,
|
||||||
@ -2531,14 +2610,15 @@ write_container_rep(representation_t *rep,
|
|||||||
collection_writer_t writer,
|
collection_writer_t writer,
|
||||||
svn_fs_t *fs,
|
svn_fs_t *fs,
|
||||||
apr_hash_t *reps_hash,
|
apr_hash_t *reps_hash,
|
||||||
|
svn_boolean_t allow_rep_sharing,
|
||||||
apr_uint32_t item_type,
|
apr_uint32_t item_type,
|
||||||
apr_pool_t *scratch_pool)
|
apr_pool_t *scratch_pool)
|
||||||
{
|
{
|
||||||
svn_stream_t *stream;
|
svn_stream_t *stream;
|
||||||
struct write_container_baton *whb;
|
struct write_container_baton *whb;
|
||||||
svn_checksum_ctx_t *fnv1a_checksum_ctx;
|
svn_checksum_ctx_t *fnv1a_checksum_ctx;
|
||||||
representation_t *old_rep;
|
|
||||||
apr_off_t offset = 0;
|
apr_off_t offset = 0;
|
||||||
|
svn_fs_fs__p2l_entry_t entry;
|
||||||
|
|
||||||
SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
|
SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
|
||||||
|
|
||||||
@ -2562,45 +2642,46 @@ write_container_rep(representation_t *rep,
|
|||||||
/* Store the results. */
|
/* Store the results. */
|
||||||
SVN_ERR(digests_final(rep, whb->md5_ctx, whb->sha1_ctx, scratch_pool));
|
SVN_ERR(digests_final(rep, whb->md5_ctx, whb->sha1_ctx, scratch_pool));
|
||||||
|
|
||||||
|
/* Update size info. */
|
||||||
|
rep->expanded_size = whb->size;
|
||||||
|
rep->size = whb->size;
|
||||||
|
|
||||||
/* Check and see if we already have a representation somewhere that's
|
/* Check and see if we already have a representation somewhere that's
|
||||||
identical to the one we just wrote out. */
|
identical to the one we just wrote out. */
|
||||||
SVN_ERR(get_shared_rep(&old_rep, fs, rep, reps_hash, scratch_pool,
|
if (allow_rep_sharing)
|
||||||
scratch_pool));
|
|
||||||
|
|
||||||
if (old_rep)
|
|
||||||
{
|
{
|
||||||
/* We need to erase from the protorev the data we just wrote. */
|
representation_t *old_rep;
|
||||||
SVN_ERR(svn_io_file_trunc(file, offset, scratch_pool));
|
SVN_ERR(get_shared_rep(&old_rep, fs, rep, file, offset, reps_hash,
|
||||||
|
scratch_pool, scratch_pool));
|
||||||
|
|
||||||
/* Use the old rep for this content. */
|
if (old_rep)
|
||||||
memcpy(rep, old_rep, sizeof (*rep));
|
{
|
||||||
|
/* We need to erase from the protorev the data we just wrote. */
|
||||||
|
SVN_ERR(svn_io_file_trunc(file, offset, scratch_pool));
|
||||||
|
|
||||||
|
/* Use the old rep for this content. */
|
||||||
|
memcpy(rep, old_rep, sizeof (*rep));
|
||||||
|
return SVN_NO_ERROR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
svn_fs_fs__p2l_entry_t entry;
|
|
||||||
|
|
||||||
/* Write out our cosmetic end marker. */
|
/* Write out our cosmetic end marker. */
|
||||||
SVN_ERR(svn_stream_puts(whb->stream, "ENDREP\n"));
|
SVN_ERR(svn_stream_puts(whb->stream, "ENDREP\n"));
|
||||||
|
|
||||||
SVN_ERR(allocate_item_index(&rep->item_index, fs, &rep->txn_id,
|
SVN_ERR(allocate_item_index(&rep->item_index, fs, &rep->txn_id,
|
||||||
offset, scratch_pool));
|
offset, scratch_pool));
|
||||||
|
|
||||||
entry.offset = offset;
|
entry.offset = offset;
|
||||||
SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
|
SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
|
||||||
entry.size = offset - entry.offset;
|
entry.size = offset - entry.offset;
|
||||||
entry.type = item_type;
|
entry.type = item_type;
|
||||||
entry.item.revision = SVN_INVALID_REVNUM;
|
entry.item.revision = SVN_INVALID_REVNUM;
|
||||||
entry.item.number = rep->item_index;
|
entry.item.number = rep->item_index;
|
||||||
SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
|
SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
|
||||||
fnv1a_checksum_ctx,
|
fnv1a_checksum_ctx,
|
||||||
scratch_pool));
|
scratch_pool));
|
||||||
|
|
||||||
SVN_ERR(store_p2l_index_entry(fs, &rep->txn_id, &entry, scratch_pool));
|
SVN_ERR(store_p2l_index_entry(fs, &rep->txn_id, &entry, scratch_pool));
|
||||||
|
|
||||||
/* update the representation */
|
|
||||||
rep->size = whb->size;
|
|
||||||
rep->expanded_size = whb->size;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
@ -2608,11 +2689,14 @@ write_container_rep(representation_t *rep,
|
|||||||
/* Write out the COLLECTION pertaining to the NODEREV in FS as a deltified
|
/* Write out the COLLECTION pertaining to the NODEREV in FS as a deltified
|
||||||
text representation to file FILE using WRITER. In the process, record the
|
text representation to file FILE using WRITER. In the process, record the
|
||||||
total size and the md5 digest in REP and add the representation of type
|
total size and the md5 digest in REP and add the representation of type
|
||||||
ITEM_TYPE to the indexes if necessary. If rep sharing has been enabled and
|
ITEM_TYPE to the indexes if necessary.
|
||||||
REPS_HASH is not NULL, it will be used in addition to the on-disk cache to
|
|
||||||
find earlier reps with the same content. When such existing reps can be
|
If ALLOW_REP_SHARING is FALSE, rep-sharing will not be used, regardless
|
||||||
found, we will truncate the one just written from the file and return the
|
of any other option and rep-sharing settings. If rep sharing has been
|
||||||
existing rep.
|
enabled and REPS_HASH is not NULL, it will be used in addition to the
|
||||||
|
on-disk cache to find earlier reps with the same content. If such
|
||||||
|
existing reps can be found, we will truncate the one just written from
|
||||||
|
the file and return the existing rep.
|
||||||
|
|
||||||
If ITEM_TYPE is IS_PROPS equals SVN_FS_FS__ITEM_TYPE_*_PROPS, assume
|
If ITEM_TYPE is IS_PROPS equals SVN_FS_FS__ITEM_TYPE_*_PROPS, assume
|
||||||
that we want to a props representation as the base for our delta.
|
that we want to a props representation as the base for our delta.
|
||||||
@ -2626,6 +2710,7 @@ write_container_delta_rep(representation_t *rep,
|
|||||||
svn_fs_t *fs,
|
svn_fs_t *fs,
|
||||||
node_revision_t *noderev,
|
node_revision_t *noderev,
|
||||||
apr_hash_t *reps_hash,
|
apr_hash_t *reps_hash,
|
||||||
|
svn_boolean_t allow_rep_sharing,
|
||||||
apr_uint32_t item_type,
|
apr_uint32_t item_type,
|
||||||
apr_pool_t *scratch_pool)
|
apr_pool_t *scratch_pool)
|
||||||
{
|
{
|
||||||
@ -2635,10 +2720,10 @@ write_container_delta_rep(representation_t *rep,
|
|||||||
svn_stream_t *file_stream;
|
svn_stream_t *file_stream;
|
||||||
svn_stream_t *stream;
|
svn_stream_t *stream;
|
||||||
representation_t *base_rep;
|
representation_t *base_rep;
|
||||||
representation_t *old_rep;
|
|
||||||
svn_checksum_ctx_t *fnv1a_checksum_ctx;
|
svn_checksum_ctx_t *fnv1a_checksum_ctx;
|
||||||
svn_stream_t *source;
|
svn_stream_t *source;
|
||||||
svn_fs_fs__rep_header_t header = { 0 };
|
svn_fs_fs__rep_header_t header = { 0 };
|
||||||
|
svn_fs_fs__p2l_entry_t entry;
|
||||||
|
|
||||||
apr_off_t rep_end = 0;
|
apr_off_t rep_end = 0;
|
||||||
apr_off_t delta_start = 0;
|
apr_off_t delta_start = 0;
|
||||||
@ -2701,46 +2786,47 @@ write_container_delta_rep(representation_t *rep,
|
|||||||
/* Store the results. */
|
/* Store the results. */
|
||||||
SVN_ERR(digests_final(rep, whb->md5_ctx, whb->sha1_ctx, scratch_pool));
|
SVN_ERR(digests_final(rep, whb->md5_ctx, whb->sha1_ctx, scratch_pool));
|
||||||
|
|
||||||
|
/* Update size info. */
|
||||||
|
SVN_ERR(svn_fs_fs__get_file_offset(&rep_end, file, scratch_pool));
|
||||||
|
rep->size = rep_end - delta_start;
|
||||||
|
rep->expanded_size = whb->size;
|
||||||
|
|
||||||
/* Check and see if we already have a representation somewhere that's
|
/* Check and see if we already have a representation somewhere that's
|
||||||
identical to the one we just wrote out. */
|
identical to the one we just wrote out. */
|
||||||
SVN_ERR(get_shared_rep(&old_rep, fs, rep, reps_hash, scratch_pool,
|
if (allow_rep_sharing)
|
||||||
scratch_pool));
|
|
||||||
|
|
||||||
if (old_rep)
|
|
||||||
{
|
{
|
||||||
/* We need to erase from the protorev the data we just wrote. */
|
representation_t *old_rep;
|
||||||
SVN_ERR(svn_io_file_trunc(file, offset, scratch_pool));
|
SVN_ERR(get_shared_rep(&old_rep, fs, rep, file, offset, reps_hash,
|
||||||
|
scratch_pool, scratch_pool));
|
||||||
|
|
||||||
/* Use the old rep for this content. */
|
if (old_rep)
|
||||||
memcpy(rep, old_rep, sizeof (*rep));
|
{
|
||||||
|
/* We need to erase from the protorev the data we just wrote. */
|
||||||
|
SVN_ERR(svn_io_file_trunc(file, offset, scratch_pool));
|
||||||
|
|
||||||
|
/* Use the old rep for this content. */
|
||||||
|
memcpy(rep, old_rep, sizeof (*rep));
|
||||||
|
return SVN_NO_ERROR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
svn_fs_fs__p2l_entry_t entry;
|
|
||||||
|
|
||||||
/* Write out our cosmetic end marker. */
|
/* Write out our cosmetic end marker. */
|
||||||
SVN_ERR(svn_fs_fs__get_file_offset(&rep_end, file, scratch_pool));
|
SVN_ERR(svn_stream_puts(file_stream, "ENDREP\n"));
|
||||||
SVN_ERR(svn_stream_puts(file_stream, "ENDREP\n"));
|
|
||||||
|
|
||||||
SVN_ERR(allocate_item_index(&rep->item_index, fs, &rep->txn_id,
|
SVN_ERR(allocate_item_index(&rep->item_index, fs, &rep->txn_id,
|
||||||
offset, scratch_pool));
|
offset, scratch_pool));
|
||||||
|
|
||||||
entry.offset = offset;
|
entry.offset = offset;
|
||||||
SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
|
SVN_ERR(svn_fs_fs__get_file_offset(&offset, file, scratch_pool));
|
||||||
entry.size = offset - entry.offset;
|
entry.size = offset - entry.offset;
|
||||||
entry.type = item_type;
|
entry.type = item_type;
|
||||||
entry.item.revision = SVN_INVALID_REVNUM;
|
entry.item.revision = SVN_INVALID_REVNUM;
|
||||||
entry.item.number = rep->item_index;
|
entry.item.number = rep->item_index;
|
||||||
SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
|
SVN_ERR(fnv1a_checksum_finalize(&entry.fnv1_checksum,
|
||||||
fnv1a_checksum_ctx,
|
fnv1a_checksum_ctx,
|
||||||
scratch_pool));
|
scratch_pool));
|
||||||
|
|
||||||
SVN_ERR(store_p2l_index_entry(fs, &rep->txn_id, &entry, scratch_pool));
|
SVN_ERR(store_p2l_index_entry(fs, &rep->txn_id, &entry, scratch_pool));
|
||||||
|
|
||||||
/* update the representation */
|
|
||||||
rep->expanded_size = whb->size;
|
|
||||||
rep->size = rep_end - delta_start;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
@ -2920,13 +3006,14 @@ write_final_rev(const svn_fs_id_t **new_id_p,
|
|||||||
SVN_ERR(write_container_delta_rep(noderev->data_rep, file,
|
SVN_ERR(write_container_delta_rep(noderev->data_rep, file,
|
||||||
entries,
|
entries,
|
||||||
write_directory_to_stream,
|
write_directory_to_stream,
|
||||||
fs, noderev, NULL,
|
fs, noderev, NULL, FALSE,
|
||||||
SVN_FS_FS__ITEM_TYPE_DIR_REP,
|
SVN_FS_FS__ITEM_TYPE_DIR_REP,
|
||||||
pool));
|
pool));
|
||||||
else
|
else
|
||||||
SVN_ERR(write_container_rep(noderev->data_rep, file, entries,
|
SVN_ERR(write_container_rep(noderev->data_rep, file, entries,
|
||||||
write_directory_to_stream, fs, NULL,
|
write_directory_to_stream, fs, NULL,
|
||||||
SVN_FS_FS__ITEM_TYPE_DIR_REP, pool));
|
FALSE, SVN_FS_FS__ITEM_TYPE_DIR_REP,
|
||||||
|
pool));
|
||||||
|
|
||||||
reset_txn_in_rep(noderev->data_rep);
|
reset_txn_in_rep(noderev->data_rep);
|
||||||
}
|
}
|
||||||
@ -2971,11 +3058,11 @@ write_final_rev(const svn_fs_id_t **new_id_p,
|
|||||||
if (ffd->deltify_properties)
|
if (ffd->deltify_properties)
|
||||||
SVN_ERR(write_container_delta_rep(noderev->prop_rep, file, proplist,
|
SVN_ERR(write_container_delta_rep(noderev->prop_rep, file, proplist,
|
||||||
write_hash_to_stream, fs, noderev,
|
write_hash_to_stream, fs, noderev,
|
||||||
reps_hash, item_type, pool));
|
reps_hash, TRUE, item_type, pool));
|
||||||
else
|
else
|
||||||
SVN_ERR(write_container_rep(noderev->prop_rep, file, proplist,
|
SVN_ERR(write_container_rep(noderev->prop_rep, file, proplist,
|
||||||
write_hash_to_stream, fs, reps_hash,
|
write_hash_to_stream, fs, reps_hash,
|
||||||
item_type, pool));
|
TRUE, item_type, pool));
|
||||||
|
|
||||||
reset_txn_in_rep(noderev->prop_rep);
|
reset_txn_in_rep(noderev->prop_rep);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_fs_x/token-map.h.
|
/* This file is automatically generated from rep-cache-db.sql and .dist_sandbox/subversion-1.9.7/subversion/libsvn_fs_x/token-map.h.
|
||||||
* Do not edit this file -- edit the source and rerun gen-make.py */
|
* Do not edit this file -- edit the source and rerun gen-make.py */
|
||||||
|
|
||||||
#define STMT_CREATE_SCHEMA 0
|
#define STMT_CREATE_SCHEMA 0
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
#include "svn_props.h"
|
#include "svn_props.h"
|
||||||
#include "svn_mergeinfo.h"
|
#include "svn_mergeinfo.h"
|
||||||
#include "svn_version.h"
|
#include "svn_version.h"
|
||||||
|
#include "svn_ctype.h"
|
||||||
|
|
||||||
#include "svn_private_config.h"
|
#include "svn_private_config.h"
|
||||||
|
|
||||||
@ -396,7 +397,7 @@ static svn_error_t *find_tunnel_agent(const char *tunnel,
|
|||||||
* versions have it too. If the user is using some other ssh
|
* versions have it too. If the user is using some other ssh
|
||||||
* implementation that doesn't accept it, they can override it
|
* implementation that doesn't accept it, they can override it
|
||||||
* in the [tunnels] section of the config. */
|
* in the [tunnels] section of the config. */
|
||||||
val = "$SVN_SSH ssh -q";
|
val = "$SVN_SSH ssh -q --";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!val || !*val)
|
if (!val || !*val)
|
||||||
@ -441,7 +442,7 @@ static svn_error_t *find_tunnel_agent(const char *tunnel,
|
|||||||
for (n = 0; cmd_argv[n] != NULL; n++)
|
for (n = 0; cmd_argv[n] != NULL; n++)
|
||||||
argv[n] = cmd_argv[n];
|
argv[n] = cmd_argv[n];
|
||||||
|
|
||||||
argv[n++] = svn_path_uri_decode(hostinfo, pool);
|
argv[n++] = hostinfo;
|
||||||
argv[n++] = "svnserve";
|
argv[n++] = "svnserve";
|
||||||
argv[n++] = "-t";
|
argv[n++] = "-t";
|
||||||
argv[n] = NULL;
|
argv[n] = NULL;
|
||||||
@ -802,6 +803,32 @@ ra_svn_get_schemes(apr_pool_t *pool)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* A simple whitelist to ensure the following are valid:
|
||||||
|
* user@server
|
||||||
|
* [::1]:22
|
||||||
|
* server-name
|
||||||
|
* server_name
|
||||||
|
* 127.0.0.1
|
||||||
|
* with an extra restriction that a leading '-' is invalid.
|
||||||
|
*/
|
||||||
|
static svn_boolean_t
|
||||||
|
is_valid_hostinfo(const char *hostinfo)
|
||||||
|
{
|
||||||
|
const char *p = hostinfo;
|
||||||
|
|
||||||
|
if (p[0] == '-')
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
if (!svn_ctype_isalnum(*p) && !strchr(":.-_[]@", *p))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static svn_error_t *ra_svn_open(svn_ra_session_t *session,
|
static svn_error_t *ra_svn_open(svn_ra_session_t *session,
|
||||||
const char **corrected_url,
|
const char **corrected_url,
|
||||||
@ -835,8 +862,18 @@ static svn_error_t *ra_svn_open(svn_ra_session_t *session,
|
|||||||
|| (callbacks->check_tunnel_func && callbacks->open_tunnel_func
|
|| (callbacks->check_tunnel_func && callbacks->open_tunnel_func
|
||||||
&& !callbacks->check_tunnel_func(callbacks->tunnel_baton,
|
&& !callbacks->check_tunnel_func(callbacks->tunnel_baton,
|
||||||
tunnel))))
|
tunnel))))
|
||||||
SVN_ERR(find_tunnel_agent(tunnel, uri.hostinfo, &tunnel_argv, config,
|
{
|
||||||
result_pool));
|
const char *decoded_hostinfo;
|
||||||
|
|
||||||
|
decoded_hostinfo = svn_path_uri_decode(uri.hostinfo, result_pool);
|
||||||
|
|
||||||
|
if (!is_valid_hostinfo(decoded_hostinfo))
|
||||||
|
return svn_error_createf(SVN_ERR_BAD_URL, NULL, _("Invalid host '%s'"),
|
||||||
|
uri.hostinfo);
|
||||||
|
|
||||||
|
SVN_ERR(find_tunnel_agent(tunnel, decoded_hostinfo, &tunnel_argv,
|
||||||
|
config, result_pool));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
tunnel_argv = NULL;
|
tunnel_argv = NULL;
|
||||||
|
|
||||||
|
@ -546,11 +546,15 @@ svn_repos__dump_revision_record(svn_stream_t *dump_stream,
|
|||||||
"%" APR_SIZE_T_FMT, propstring->len));
|
"%" APR_SIZE_T_FMT, propstring->len));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write out a regular Content-length header for the benefit of
|
if (propstring)
|
||||||
non-Subversion RFC-822 parsers. */
|
{
|
||||||
svn_hash_sets(headers, SVN_REPOS_DUMPFILE_CONTENT_LENGTH,
|
/* Write out a regular Content-length header for the benefit of
|
||||||
apr_psprintf(scratch_pool,
|
non-Subversion RFC-822 parsers. */
|
||||||
"%" APR_SIZE_T_FMT, propstring->len));
|
svn_hash_sets(headers, SVN_REPOS_DUMPFILE_CONTENT_LENGTH,
|
||||||
|
apr_psprintf(scratch_pool,
|
||||||
|
"%" APR_SIZE_T_FMT, propstring->len));
|
||||||
|
}
|
||||||
|
|
||||||
SVN_ERR(write_revision_headers(dump_stream, headers, scratch_pool));
|
SVN_ERR(write_revision_headers(dump_stream, headers, scratch_pool));
|
||||||
|
|
||||||
/* End of headers */
|
/* End of headers */
|
||||||
|
@ -1248,12 +1248,12 @@ svn_config_ensure(const char *config_dir, apr_pool_t *pool)
|
|||||||
"### passed to the tunnel agent as <user>@<hostname>.) If the" NL
|
"### passed to the tunnel agent as <user>@<hostname>.) If the" NL
|
||||||
"### built-in ssh scheme were not predefined, it could be defined" NL
|
"### built-in ssh scheme were not predefined, it could be defined" NL
|
||||||
"### as:" NL
|
"### as:" NL
|
||||||
"# ssh = $SVN_SSH ssh -q" NL
|
"# ssh = $SVN_SSH ssh -q --" NL
|
||||||
"### If you wanted to define a new 'rsh' scheme, to be used with" NL
|
"### If you wanted to define a new 'rsh' scheme, to be used with" NL
|
||||||
"### 'svn+rsh:' URLs, you could do so as follows:" NL
|
"### 'svn+rsh:' URLs, you could do so as follows:" NL
|
||||||
"# rsh = rsh" NL
|
"# rsh = rsh --" NL
|
||||||
"### Or, if you wanted to specify a full path and arguments:" NL
|
"### Or, if you wanted to specify a full path and arguments:" NL
|
||||||
"# rsh = /path/to/rsh -l myusername" NL
|
"# rsh = /path/to/rsh -l myusername --" NL
|
||||||
"### On Windows, if you are specifying a full path to a command," NL
|
"### On Windows, if you are specifying a full path to a command," NL
|
||||||
"### use a forward slash (/) or a paired backslash (\\\\) as the" NL
|
"### use a forward slash (/) or a paired backslash (\\\\) as the" NL
|
||||||
"### path separator. A single backslash will be treated as an" NL
|
"### path separator. A single backslash will be treated as an" NL
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* This file is automatically generated from internal_statements.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_subr/token-map.h.
|
/* This file is automatically generated from internal_statements.sql and .dist_sandbox/subversion-1.9.7/subversion/libsvn_subr/token-map.h.
|
||||||
* Do not edit this file -- edit the source and rerun gen-make.py */
|
* Do not edit this file -- edit the source and rerun gen-make.py */
|
||||||
|
|
||||||
#define STMT_INTERNAL_SAVEPOINT_SVN 0
|
#define STMT_INTERNAL_SAVEPOINT_SVN 0
|
||||||
|
@ -4044,6 +4044,26 @@ svn_io_write_atomic(const char *final_path,
|
|||||||
svn_error_t *
|
svn_error_t *
|
||||||
svn_io_file_trunc(apr_file_t *file, apr_off_t offset, apr_pool_t *pool)
|
svn_io_file_trunc(apr_file_t *file, apr_off_t offset, apr_pool_t *pool)
|
||||||
{
|
{
|
||||||
|
/* Workaround for yet another APR issue with trunc.
|
||||||
|
|
||||||
|
If the APR file internally is in read mode, the current buffer pointer
|
||||||
|
will not be clipped to the valid data range. get_file_offset may then
|
||||||
|
return an invalid position *after* new data was written to it.
|
||||||
|
|
||||||
|
To prevent this, write 1 dummy byte just after the OFFSET at which we
|
||||||
|
will trunc it. That will force the APR file into write mode
|
||||||
|
internally and the flush() work-around below becomes affective. */
|
||||||
|
apr_off_t position = 0;
|
||||||
|
|
||||||
|
/* A frequent usage is OFFSET==0, in which case we don't need to preserve
|
||||||
|
any file content or file pointer. */
|
||||||
|
if (offset)
|
||||||
|
{
|
||||||
|
SVN_ERR(svn_io_file_seek(file, APR_CUR, &position, pool));
|
||||||
|
SVN_ERR(svn_io_file_seek(file, APR_SET, &offset, pool));
|
||||||
|
}
|
||||||
|
SVN_ERR(svn_io_file_putc(0, file, pool));
|
||||||
|
|
||||||
/* This is a work-around. APR would flush the write buffer
|
/* This is a work-around. APR would flush the write buffer
|
||||||
_after_ truncating the file causing now invalid buffered
|
_after_ truncating the file causing now invalid buffered
|
||||||
data to be written behind OFFSET. */
|
data to be written behind OFFSET. */
|
||||||
@ -4052,10 +4072,17 @@ svn_io_file_trunc(apr_file_t *file, apr_off_t offset, apr_pool_t *pool)
|
|||||||
N_("Can't flush stream"),
|
N_("Can't flush stream"),
|
||||||
pool));
|
pool));
|
||||||
|
|
||||||
return do_io_file_wrapper_cleanup(file, apr_file_trunc(file, offset),
|
SVN_ERR(do_io_file_wrapper_cleanup(file, apr_file_trunc(file, offset),
|
||||||
N_("Can't truncate file '%s'"),
|
N_("Can't truncate file '%s'"),
|
||||||
N_("Can't truncate stream"),
|
N_("Can't truncate stream"),
|
||||||
pool);
|
pool));
|
||||||
|
|
||||||
|
/* Restore original file pointer, if necessary.
|
||||||
|
It's currently at OFFSET. */
|
||||||
|
if (position < offset)
|
||||||
|
SVN_ERR(svn_io_file_seek(file, APR_SET, &position, pool));
|
||||||
|
|
||||||
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ svn_version_extended(svn_boolean_t verbose,
|
|||||||
info->build_time = NULL;
|
info->build_time = NULL;
|
||||||
info->build_host = SVN_BUILD_HOST;
|
info->build_host = SVN_BUILD_HOST;
|
||||||
info->copyright = apr_pstrdup
|
info->copyright = apr_pstrdup
|
||||||
(pool, _("Copyright (C) 2016 The Apache Software Foundation.\n"
|
(pool, _("Copyright (C) 2017 The Apache Software Foundation.\n"
|
||||||
"This software consists of contributions made by many people;\n"
|
"This software consists of contributions made by many people;\n"
|
||||||
"see the NOTICE file for more information.\n"
|
"see the NOTICE file for more information.\n"
|
||||||
"Subversion is open source software, see "
|
"Subversion is open source software, see "
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* This file is automatically generated from wc-checks.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_wc/token-map.h.
|
/* This file is automatically generated from wc-checks.sql and .dist_sandbox/subversion-1.9.7/subversion/libsvn_wc/token-map.h.
|
||||||
* Do not edit this file -- edit the source and rerun gen-make.py */
|
* Do not edit this file -- edit the source and rerun gen-make.py */
|
||||||
|
|
||||||
#define STMT_VERIFICATION_TRIGGERS 0
|
#define STMT_VERIFICATION_TRIGGERS 0
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* This file is automatically generated from wc-metadata.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_wc/token-map.h.
|
/* This file is automatically generated from wc-metadata.sql and .dist_sandbox/subversion-1.9.7/subversion/libsvn_wc/token-map.h.
|
||||||
* Do not edit this file -- edit the source and rerun gen-make.py */
|
* Do not edit this file -- edit the source and rerun gen-make.py */
|
||||||
|
|
||||||
#define STMT_CREATE_SCHEMA 0
|
#define STMT_CREATE_SCHEMA 0
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* This file is automatically generated from wc-queries.sql and .dist_sandbox/subversion-1.9.5/subversion/libsvn_wc/token-map.h.
|
/* This file is automatically generated from wc-queries.sql and .dist_sandbox/subversion-1.9.7/subversion/libsvn_wc/token-map.h.
|
||||||
* Do not edit this file -- edit the source and rerun gen-make.py */
|
* Do not edit this file -- edit the source and rerun gen-make.py */
|
||||||
|
|
||||||
#define STMT_SELECT_NODE_INFO 0
|
#define STMT_SELECT_NODE_INFO 0
|
||||||
|
@ -396,6 +396,7 @@ static const svn_opt_subcommand_desc2_t cmd_table[] =
|
|||||||
("usage: 1. svnadmin freeze REPOS_PATH PROGRAM [ARG...]\n"
|
("usage: 1. svnadmin freeze REPOS_PATH PROGRAM [ARG...]\n"
|
||||||
" 2. svnadmin freeze -F FILE PROGRAM [ARG...]\n\n"
|
" 2. svnadmin freeze -F FILE PROGRAM [ARG...]\n\n"
|
||||||
"1. Run PROGRAM passing ARGS while holding a write-lock on REPOS_PATH.\n"
|
"1. Run PROGRAM passing ARGS while holding a write-lock on REPOS_PATH.\n"
|
||||||
|
" Allows safe use of third-party backup tools on a live repository.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"2. Like 1 except all repositories listed in FILE are locked. The file\n"
|
"2. Like 1 except all repositories listed in FILE are locked. The file\n"
|
||||||
" format is repository paths separated by newlines. Repositories are\n"
|
" format is repository paths separated by newlines. Repositories are\n"
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
For a list of options, run this script with the --help option.
|
For a list of options, run this script with the --help option.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# $HeadURL: http://svn.apache.org/repos/asf/subversion/branches/1.9.x/win-tests.py $
|
# $HeadURL: https://svn.apache.org/repos/asf/subversion/branches/1.9.x/win-tests.py $
|
||||||
# $LastChangedRevision: 1718291 $
|
# $LastChangedRevision: 1718291 $
|
||||||
|
|
||||||
import os, sys, subprocess
|
import os, sys, subprocess
|
||||||
|
Loading…
Reference in New Issue
Block a user