Vendor import of subversion-1.9.4.
This commit is contained in:
parent
dc5d469d65
commit
c94cceea9c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor/subversion/dist/; revision=298794 svn path=/vendor/subversion/subversion-1.9.4/; revision=298795; tag=vendor/subversion/subversion-1.9.4
135
CHANGES
135
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
|
Version 1.9.2
|
||||||
(30 Sep 2015, from /branches/1.9.x)
|
(30 Sep 2015, from /branches/1.9.x)
|
||||||
http://svn.apache.org/repos/asf/subversion/tags/1.9.2
|
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
|
* fsfs: enable dir and prop deltas by default for formats that support
|
||||||
it (r1555286)
|
it (r1555286)
|
||||||
* fsfs: avoid out of date errors from files in a directory changing when
|
* 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
|
* fsfs: temporary transaction properties are preserved when commit is
|
||||||
interrupted (r1549907 et al)
|
interrupted (r1549907 et al)
|
||||||
* fsfs: speed up transaction creation (r1544719)
|
* 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)
|
* 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
|
Version 1.8.14
|
||||||
(5 Aug 2015, from /branches/1.8.x)
|
(5 Aug 2015, from /branches/1.8.x)
|
||||||
http://svn.apache.org/repos/asf/subversion/tags/1.8.14
|
http://svn.apache.org/repos/asf/subversion/tags/1.8.14
|
||||||
|
88
INSTALL
88
INSTALL
@ -3,7 +3,7 @@
|
|||||||
A Quick Guide
|
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:
|
Contents:
|
||||||
@ -199,48 +199,6 @@ I. INTRODUCTION
|
|||||||
Apache Portable Runtime (APR) and the APR Utility (APR-util)
|
Apache Portable Runtime (APR) and the APR Utility (APR-util)
|
||||||
libraries.
|
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
|
If you do not have a pre-installed APR and APR-util, you will need
|
||||||
to get these yourself:
|
to get these yourself:
|
||||||
|
|
||||||
@ -960,14 +918,6 @@ II. INSTALLATION
|
|||||||
|
|
||||||
This step is only required for building the server dso modules.
|
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:>set APACHEDIR=C:\Program Files\Apache Group\Apache2
|
||||||
C:>msdev httpd-2.0.58\apache.dsw /MAKE "BuildBin - Win32 Release"
|
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:
|
The Apache/APR projects required by Subversion are:
|
||||||
apr-util\libaprutil.dsp, apr\libapr.dsp,
|
apr-util\libaprutil.dsp, apr\libapr.dsp,
|
||||||
apr-iconv\libapriconv.dsp, apr-util\xml\expat\lib\xml.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\ccs\libapriconv_ccs_modules.dsp, and
|
||||||
apr-iconv\ces\libapriconv_ces_modules.dsp.
|
apr-iconv\ces\libapriconv_ces_modules.dsp.
|
||||||
* If the server dso modules are being built and tested Apache must not
|
* 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
|
1. Obtaining and Installing Apache 2
|
||||||
|
|
||||||
Subversion tries to compile against the latest released version
|
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.
|
a source tarball of the latest release and unpack that.
|
||||||
|
|
||||||
|
If you have questions about the Apache httpd 2.2 build, please consult
|
||||||
****************************************************************
|
|
||||||
** 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
|
|
||||||
the httpd install documentation:
|
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:
|
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
|
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:
|
standard location, run:
|
||||||
|
|
||||||
$ ./configure
|
$ ./configure
|
||||||
@ -1250,7 +1179,7 @@ III. BUILDING A SUBVERSION SERVER
|
|||||||
look for other libsvn_*.so libraries on your system.
|
look for other libsvn_*.so libraries on your system.
|
||||||
|
|
||||||
If you see a warning message that the build of mod_dav_svn is
|
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
|
installed in a non-standard location. You can use the
|
||||||
"--with-apxs=" option to locate the apxs script:
|
"--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.
|
/usr/local/apache2/conf/httpd.conf to reflect your setup.
|
||||||
At a minimum you should look at the User, Group and ServerName
|
At a minimum you should look at the User, Group and ServerName
|
||||||
directives. Full details on setting up apache can be found at:
|
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.
|
First, your httpd.conf needs to load the mod_dav_svn module.
|
||||||
If you pass --enable-mod-activation to Subversion's configure,
|
If you pass --enable-mod-activation to Subversion's configure,
|
||||||
@ -1346,6 +1275,7 @@ III. BUILDING A SUBVERSION SERVER
|
|||||||
Require group svn_readers
|
Require group svn_readers
|
||||||
</Limit>
|
</Limit>
|
||||||
|
|
||||||
|
### FIXME Tutorials section refers to old 2.0 docs
|
||||||
These are only a few simple examples. For a complete tutorial
|
These are only a few simple examples. For a complete tutorial
|
||||||
on Apache access control, please consider taking a look at the
|
on Apache access control, please consider taking a look at the
|
||||||
tutorials found under "Security" on the following page:
|
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
|
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
|
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
|
NOTE: Make sure that the user 'nobody' (or whatever UID the
|
||||||
httpd process runs as) has permission to read and write the
|
httpd process runs as) has permission to read and write the
|
||||||
|
14
Makefile.in
14
Makefile.in
@ -917,13 +917,15 @@ swig-rb: autogen-swig-rb
|
|||||||
check-swig-rb: swig-rb svnserve
|
check-swig-rb: swig-rb svnserve
|
||||||
$(TEST_SHLIB_VAR_SWIG_RB) \
|
$(TEST_SHLIB_VAR_SWIG_RB) \
|
||||||
cd $(SWIG_RB_DIR); \
|
cd $(SWIG_RB_DIR); \
|
||||||
if [ "$(RUBY_MAJOR)" -eq 1 -a "$(RUBY_MINOR)" -lt 9 ] ; then \
|
check_rb() { \
|
||||||
$(RUBY) -I $(SWIG_RB_SRC_DIR) \
|
$(RUBY) -I $(SWIG_RB_SRC_DIR) $(SWIG_RB_SRC_DIR)/test/run-test.rb "$$@"; \
|
||||||
$(SWIG_RB_SRC_DIR)/test/run-test.rb \
|
}; \
|
||||||
--verbose=$(SWIG_RB_TEST_VERBOSE); \
|
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 \
|
else \
|
||||||
$(RUBY) -I $(SWIG_RB_SRC_DIR) \
|
check_rb; \
|
||||||
$(SWIG_RB_SRC_DIR)/test/run-test.rb; \
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
EXTRACLEAN_SWIG_RB=rm -f $(SWIG_RB_SRC_DIR)/svn_*.c $(SWIG_RB_SRC_DIR)/core.c
|
EXTRACLEAN_SWIG_RB=rm -f $(SWIG_RB_SRC_DIR)/svn_*.c $(SWIG_RB_SRC_DIR)/core.c
|
||||||
|
2
NOTICE
2
NOTICE
@ -1,5 +1,5 @@
|
|||||||
Apache Subversion
|
Apache Subversion
|
||||||
Copyright 2015 The Apache Software Foundation
|
Copyright 2016 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
|
||||||
|
File diff suppressed because one or more lines are too long
30
configure
vendored
30
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.2.
|
# Generated by GNU Autoconf 2.69 for subversion 1.9.4.
|
||||||
#
|
#
|
||||||
# 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.2'
|
PACKAGE_VERSION='1.9.4'
|
||||||
PACKAGE_STRING='subversion 1.9.2'
|
PACKAGE_STRING='subversion 1.9.4'
|
||||||
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.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]...
|
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.2:";;
|
short | recursive ) echo "Configuration of subversion 1.9.4:";;
|
||||||
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.2
|
subversion configure 1.9.4
|
||||||
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.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
|
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.2" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring Subversion 1.9.4" >&5
|
||||||
$as_echo "$as_me: Configuring Subversion 1.9.2" >&6;}
|
$as_echo "$as_me: Configuring Subversion 1.9.4" >&6;}
|
||||||
|
|
||||||
abs_srcdir="`cd $srcdir && pwd`"
|
abs_srcdir="`cd $srcdir && pwd`"
|
||||||
|
|
||||||
@ -20314,16 +20314,16 @@ $as_echo_n "checking for KWallet... " >&6; }
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
qt_include_dirs="`$PKG_CONFIG --cflags-only-I QtCore QtDBus QtGui`"
|
qt_include_dirs="`$PKG_CONFIG --cflags-only-I QtCore QtDBus QtGui`"
|
||||||
kde_dir="`$KDE4_CONFIG --prefix`"
|
kde_incdir="`$KDE4_CONFIG --install include`"
|
||||||
SVN_KWALLET_INCLUDES="$DBUS_CPPFLAGS $qt_include_dirs -I$kde_dir/include"
|
SVN_KWALLET_INCLUDES="$DBUS_CPPFLAGS $qt_include_dirs -I$kde_incdir"
|
||||||
qt_libs_other_options="`$PKG_CONFIG --libs-only-other QtCore QtDBus QtGui`"
|
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"
|
SVN_KWALLET_LIBS="$DBUS_LIBS -lQtCore -lQtDBus -lQtGui -lkdecore -lkdeui $qt_libs_other_options"
|
||||||
CXXFLAGS="$CXXFLAGS $SVN_KWALLET_INCLUDES"
|
CXXFLAGS="$CXXFLAGS $SVN_KWALLET_INCLUDES"
|
||||||
LIBS="$LIBS $SVN_KWALLET_LIBS"
|
LIBS="$LIBS $SVN_KWALLET_LIBS"
|
||||||
qt_lib_dirs="`$PKG_CONFIG --libs-only-L QtCore QtDBus QtGui`"
|
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 `
|
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=""
|
output_flags=""
|
||||||
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
|
filtered_dirs="/lib /lib64 /usr/lib /usr/lib64"
|
||||||
for flag in $input_flags; do
|
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
|
# 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.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
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
@ -26816,7 +26816,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.2
|
subversion config.status 1.9.4
|
||||||
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\\"
|
||||||
|
|
||||||
|
@ -4098,16 +4098,16 @@ svn_client_mergeinfo_log_eligible(const char *path_or_url,
|
|||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** Recursively vacuum a working copy directory @a dir, removing unnecessary
|
/** Recursively vacuum a working copy directory @a dir_abspath,
|
||||||
* data.
|
* removing unnecessary data.
|
||||||
*
|
*
|
||||||
* If @a include_externals is @c TRUE, recurse into externals and vacuum them
|
* If @a include_externals is @c TRUE, recurse into externals and vacuum them
|
||||||
* as well.
|
* as well.
|
||||||
*
|
*
|
||||||
* If @a remove_unversioned_items is @c TRUE, remove unversioned items
|
* 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
|
* 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
|
* If @a fix_recorded_timestamps is @c TRUE, this function fixes recorded
|
||||||
* timestamps for unmodified files in the working copy, reducing comparision
|
* timestamps for unmodified files in the working copy, reducing comparision
|
||||||
|
@ -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_PROXY_EXCEPTIONS "http-proxy-exceptions"
|
||||||
#define SVN_CONFIG_OPTION_HTTP_TIMEOUT "http-timeout"
|
#define SVN_CONFIG_OPTION_HTTP_TIMEOUT "http-timeout"
|
||||||
#define SVN_CONFIG_OPTION_HTTP_COMPRESSION "http-compression"
|
#define SVN_CONFIG_OPTION_HTTP_COMPRESSION "http-compression"
|
||||||
|
/** @deprecated Not used since 1.8. */
|
||||||
#define SVN_CONFIG_OPTION_NEON_DEBUG_MASK "neon-debug-mask"
|
#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_HTTP_AUTH_TYPES "http-auth-types"
|
||||||
#define SVN_CONFIG_OPTION_SSL_AUTHORITY_FILES "ssl-authority-files"
|
#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_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_FILE "ssl-client-cert-file"
|
||||||
#define SVN_CONFIG_OPTION_SSL_CLIENT_CERT_PASSWORD "ssl-client-cert-password"
|
#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"
|
#define SVN_CONFIG_OPTION_SSL_PKCS11_PROVIDER "ssl-pkcs11-provider"
|
||||||
|
/** @since New in 1.5. */
|
||||||
#define SVN_CONFIG_OPTION_HTTP_LIBRARY "http-library"
|
#define SVN_CONFIG_OPTION_HTTP_LIBRARY "http-library"
|
||||||
|
/** @since New in 1.1. */
|
||||||
#define SVN_CONFIG_OPTION_STORE_PASSWORDS "store-passwords"
|
#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_PLAINTEXT_PASSWORDS "store-plaintext-passwords"
|
||||||
#define SVN_CONFIG_OPTION_STORE_AUTH_CREDS "store-auth-creds"
|
#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"
|
#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 \
|
#define SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT \
|
||||||
"store-ssl-client-cert-pp-plaintext"
|
"store-ssl-client-cert-pp-plaintext"
|
||||||
#define SVN_CONFIG_OPTION_USERNAME "username"
|
#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_DIFF_EXTENSIONS "diff-extensions"
|
||||||
#define SVN_CONFIG_OPTION_DIFF3_CMD "diff3-cmd"
|
#define SVN_CONFIG_OPTION_DIFF3_CMD "diff3-cmd"
|
||||||
#define SVN_CONFIG_OPTION_DIFF3_HAS_PROGRAM_ARG "diff3-has-program-arg"
|
#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_OPTION_MERGE_TOOL_CMD "merge-tool-cmd"
|
||||||
#define SVN_CONFIG_SECTION_MISCELLANY "miscellany"
|
#define SVN_CONFIG_SECTION_MISCELLANY "miscellany"
|
||||||
#define SVN_CONFIG_OPTION_GLOBAL_IGNORES "global-ignores"
|
#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"
|
#define SVN_CONFIG_OPTION_ENABLE_AUTO_PROPS "enable-auto-props"
|
||||||
/** @since New in 1.9. */
|
/** @since New in 1.9. */
|
||||||
#define SVN_CONFIG_OPTION_ENABLE_MAGIC_FILE "enable-magic-file"
|
#define SVN_CONFIG_OPTION_ENABLE_MAGIC_FILE "enable-magic-file"
|
||||||
|
/** @since New in 1.2. */
|
||||||
#define SVN_CONFIG_OPTION_NO_UNLOCK "no-unlock"
|
#define SVN_CONFIG_OPTION_NO_UNLOCK "no-unlock"
|
||||||
|
/** @since New in 1.5. */
|
||||||
#define SVN_CONFIG_OPTION_MIMETYPES_FILE "mime-types-file"
|
#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"
|
#define SVN_CONFIG_OPTION_PRESERVED_CF_EXTS "preserved-conflict-file-exts"
|
||||||
/** @since New in 1.7. */
|
/** @since New in 1.7. */
|
||||||
#define SVN_CONFIG_OPTION_INTERACTIVE_CONFLICTS "interactive-conflicts"
|
#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"
|
#define SVN_CONFIG_OPTION_FORCE_USERNAME_CASE "force-username-case"
|
||||||
/** @since New in 1.8. */
|
/** @since New in 1.8. */
|
||||||
#define SVN_CONFIG_OPTION_HOOKS_ENV "hooks-env"
|
#define SVN_CONFIG_OPTION_HOOKS_ENV "hooks-env"
|
||||||
|
/** @since New in 1.5. */
|
||||||
#define SVN_CONFIG_SECTION_SASL "sasl"
|
#define SVN_CONFIG_SECTION_SASL "sasl"
|
||||||
|
/** @since New in 1.5. */
|
||||||
#define SVN_CONFIG_OPTION_USE_SASL "use-sasl"
|
#define SVN_CONFIG_OPTION_USE_SASL "use-sasl"
|
||||||
|
/** @since New in 1.5. */
|
||||||
#define SVN_CONFIG_OPTION_MIN_SSF "min-encryption"
|
#define SVN_CONFIG_OPTION_MIN_SSF "min-encryption"
|
||||||
|
/** @since New in 1.5. */
|
||||||
#define SVN_CONFIG_OPTION_MAX_SSF "max-encryption"
|
#define SVN_CONFIG_OPTION_MAX_SSF "max-encryption"
|
||||||
|
|
||||||
/* For repository password database */
|
/* For repository password database */
|
||||||
|
@ -1759,12 +1759,15 @@ svn_fs_node_relation(svn_fs_node_relation_t *relation,
|
|||||||
const char *path_b,
|
const char *path_b,
|
||||||
apr_pool_t *scratch_pool);
|
apr_pool_t *scratch_pool);
|
||||||
|
|
||||||
/** Set @a *revision to the revision in which @a path under @a root was
|
/** Set @a *revision to the revision in which the node-revision identified
|
||||||
* created. Use @a pool for any temporary allocations. @a *revision will
|
* 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
|
* 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
|
* 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
|
* is not itself considered to be modified; in that case, return the revision
|
||||||
* upon which the transaction was based.
|
* upon which the transaction was based.
|
||||||
|
*
|
||||||
|
* Use @a pool for any temporary allocations.
|
||||||
*/
|
*/
|
||||||
svn_error_t *
|
svn_error_t *
|
||||||
svn_fs_node_created_rev(svn_revnum_t *revision,
|
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.
|
* both roots must be in the same filesystem.
|
||||||
* Do any necessary temporary allocation in @a scratch_pool.
|
* 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.
|
* @since New in 1.9.
|
||||||
*/
|
*/
|
||||||
svn_error_t *
|
svn_error_t *
|
||||||
@ -1872,9 +1884,7 @@ svn_fs_props_different(svn_boolean_t *different_p,
|
|||||||
apr_pool_t *scratch_pool);
|
apr_pool_t *scratch_pool);
|
||||||
|
|
||||||
|
|
||||||
/** Determine if the properties of two path/root combinations are different.
|
/** Determine if the properties of two path/root combinations have changed.
|
||||||
* In contrast to #svn_fs_props_different, we only perform a quick test and
|
|
||||||
* allow for false positives.
|
|
||||||
*
|
*
|
||||||
* Set @a *changed_p to #TRUE if the properties at @a path1 under @a root1
|
* 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
|
* 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.
|
* both roots must be in the same filesystem.
|
||||||
* Do any necessary temporary allocation in @a pool.
|
* Do any necessary temporary allocation in @a pool.
|
||||||
*
|
*
|
||||||
* @note The behavior is implementation dependent in that the false
|
* @note For the purposes of preserving accurate history, certain bits of
|
||||||
* positives reported may differ from release to release and backend to
|
* code (such as the repository dump code) need to care about the distinction
|
||||||
* backend. There is also no guarantee that there will be false positives
|
* between situations when the properties are "different" and "have changed
|
||||||
* at all.
|
* 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
|
* @note This function can currently return false negatives for FSFS:
|
||||||
* for FSFS: If @a root1 and @a root2 were both transaction roots
|
* If @a root1 and @a root2 were both transaction roots and the proplists
|
||||||
* and the proplists of both paths had been changed in their respective
|
* of both paths had been changed in their respective transactions,
|
||||||
* transactions, @a changed_p would be set to #FALSE.
|
* @a changed_p would be set to #FALSE.
|
||||||
|
*
|
||||||
|
* @see svn_fs_props_different
|
||||||
*/
|
*/
|
||||||
svn_error_t *
|
svn_error_t *
|
||||||
svn_fs_props_changed(svn_boolean_t *changed_p,
|
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);
|
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
|
* 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
|
* @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.
|
* respective roots, and both roots must be in the same filesystem.
|
||||||
* Do any necessary temporary allocation in @a scratch_pool.
|
* 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.
|
* @since New in 1.9.
|
||||||
*/
|
*/
|
||||||
svn_error_t *
|
svn_error_t *
|
||||||
@ -2428,9 +2452,7 @@ svn_fs_contents_different(svn_boolean_t *different_p,
|
|||||||
const char *path2,
|
const char *path2,
|
||||||
apr_pool_t *scratch_pool);
|
apr_pool_t *scratch_pool);
|
||||||
|
|
||||||
/** Check if the contents of two root/path combos have changed. In
|
/** Check if the contents of two root/path combos have changed.
|
||||||
* contrast to #svn_fs_contents_different, we only perform a quick test
|
|
||||||
* and allow for false positives.
|
|
||||||
*
|
*
|
||||||
* Set @a *changed_p to #TRUE if the file contents at @a path1 under
|
* 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
|
* @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.
|
* respective roots, and both roots must be in the same filesystem.
|
||||||
* Do any necessary temporary allocation in @a pool.
|
* Do any necessary temporary allocation in @a pool.
|
||||||
*
|
*
|
||||||
* @note The behavior is implementation dependent in that the false
|
* @note svn_fs_contents_changed() was not designed to be used to detect
|
||||||
* positives reported may differ from release to release and backend to
|
* when two files have different content, but really to detect when the
|
||||||
* backend. There is also no guarantee that there will be false positives
|
* contents of a given file have changed across two points in its history.
|
||||||
* at all.
|
* 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_error_t *
|
||||||
svn_fs_contents_changed(svn_boolean_t *changed_p,
|
svn_fs_contents_changed(svn_boolean_t *changed_p,
|
||||||
|
@ -70,7 +70,7 @@ extern "C" {
|
|||||||
*
|
*
|
||||||
* @since New in 1.1.
|
* @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. */
|
/** @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 " (r1703836)"
|
#define SVN_VER_TAG " (r1740329)"
|
||||||
|
|
||||||
|
|
||||||
/** 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 1703836
|
#define SVN_VER_REVISION 1740329
|
||||||
|
|
||||||
|
|
||||||
/* Version strings composed from the above definitions. */
|
/* Version strings composed from the above definitions. */
|
||||||
|
@ -231,6 +231,42 @@ switch_dir_external(const char *local_abspath,
|
|||||||
|
|
||||||
if (node_url)
|
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
|
/* If we have what appears to be a version controlled
|
||||||
subdir, and its top-level URL matches that of our
|
subdir, and its top-level URL matches that of our
|
||||||
externals definition, perform an update. */
|
externals definition, perform an update. */
|
||||||
|
@ -2349,18 +2349,48 @@ files_same_p(svn_boolean_t *same,
|
|||||||
{
|
{
|
||||||
svn_stream_t *mine_stream;
|
svn_stream_t *mine_stream;
|
||||||
svn_stream_t *older_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. */
|
/* 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,
|
SVN_ERR(svn_subst_read_specialfile(&mine_stream, mine_abspath,
|
||||||
scratch_pool, scratch_pool));
|
scratch_pool, scratch_pool));
|
||||||
else
|
else
|
||||||
SVN_ERR(svn_client__get_normalized_stream(&mine_stream, wc_ctx,
|
SVN_ERR(svn_stream_open_readonly(&mine_stream, mine_abspath,
|
||||||
mine_abspath, &working_rev,
|
|
||||||
FALSE, TRUE, NULL, NULL,
|
|
||||||
scratch_pool, scratch_pool));
|
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,
|
SVN_ERR(svn_stream_open_readonly(&older_stream, older_abspath,
|
||||||
scratch_pool, scratch_pool));
|
scratch_pool, scratch_pool));
|
||||||
|
|
||||||
|
@ -209,9 +209,6 @@ typedef struct patch_target_t {
|
|||||||
/* True if the target had to be skipped for some reason. */
|
/* True if the target had to be skipped for some reason. */
|
||||||
svn_boolean_t skipped;
|
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. */
|
/* True if at least one hunk was rejected. */
|
||||||
svn_boolean_t had_rejects;
|
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,
|
SVN_ERR(svn_wc__node_was_moved_away(&moved_to_abspath, NULL,
|
||||||
wc_ctx, target->local_abspath,
|
wc_ctx, target->local_abspath,
|
||||||
result_pool, scratch_pool));
|
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)
|
if (moved_to_abspath)
|
||||||
{
|
{
|
||||||
target->local_abspath = 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,
|
int strip_count,
|
||||||
svn_boolean_t ignore_whitespace,
|
svn_boolean_t ignore_whitespace,
|
||||||
svn_boolean_t remove_tempfiles,
|
svn_boolean_t remove_tempfiles,
|
||||||
svn_client_patch_func_t patch_func,
|
|
||||||
void *patch_baton,
|
|
||||||
svn_cancel_func_t cancel_func,
|
svn_cancel_func_t cancel_func,
|
||||||
void *cancel_baton,
|
void *cancel_baton,
|
||||||
apr_pool_t *result_pool, apr_pool_t *scratch_pool)
|
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;
|
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);
|
iterpool = svn_pool_create(scratch_pool);
|
||||||
/* Match hunks. */
|
/* Match hunks. */
|
||||||
for (i = 0; i < patch->hunks->nelts; i++)
|
for (i = 0; i < patch->hunks->nelts; i++)
|
||||||
@ -3164,14 +3148,23 @@ apply_patches(/* The path to the patch file. */
|
|||||||
if (patch)
|
if (patch)
|
||||||
{
|
{
|
||||||
patch_target_t *target;
|
patch_target_t *target;
|
||||||
|
svn_boolean_t filtered = FALSE;
|
||||||
|
|
||||||
SVN_ERR(apply_one_patch(&target, patch, abs_wc_path,
|
SVN_ERR(apply_one_patch(&target, patch, abs_wc_path,
|
||||||
ctx->wc_ctx, strip_count,
|
ctx->wc_ctx, strip_count,
|
||||||
ignore_whitespace, remove_tempfiles,
|
ignore_whitespace, remove_tempfiles,
|
||||||
patch_func, patch_baton,
|
|
||||||
ctx->cancel_func, ctx->cancel_baton,
|
ctx->cancel_func, ctx->cancel_baton,
|
||||||
iterpool, iterpool));
|
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. */
|
/* Save info we'll still need when we're done patching. */
|
||||||
patch_target_info_t *target_info =
|
patch_target_info_t *target_info =
|
||||||
|
@ -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));
|
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
|
shorter than the zipped data. For now lets assume that it is not
|
||||||
and just dump the literal data */
|
and just dump the literal data */
|
||||||
SVN_ERR(write_literal(original_full,
|
SVN_ERR(write_literal(latest_full,
|
||||||
svn_stream_from_aprfile2(original_apr, FALSE, subpool),
|
svn_stream_from_aprfile2(latest_apr, FALSE, subpool),
|
||||||
output_stream,
|
output_stream,
|
||||||
cancel_func, cancel_baton,
|
cancel_func, cancel_baton,
|
||||||
scratch_pool));
|
scratch_pool));
|
||||||
svn_pool_clear(subpool);
|
svn_pool_clear(subpool);
|
||||||
SVN_ERR(svn_stream_puts(output_stream, APR_EOL_STR));
|
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
|
shorter than the zipped data. For now lets assume that it is not
|
||||||
and just dump the literal data */
|
and just dump the literal data */
|
||||||
SVN_ERR(write_literal(latest_full,
|
SVN_ERR(write_literal(original_full,
|
||||||
svn_stream_from_aprfile2(latest_apr, FALSE, subpool),
|
svn_stream_from_aprfile2(original_apr, FALSE, subpool),
|
||||||
output_stream,
|
output_stream,
|
||||||
cancel_func, cancel_baton,
|
cancel_func, cancel_baton,
|
||||||
scratch_pool));
|
scratch_pool));
|
||||||
|
@ -1657,8 +1657,14 @@ svn_fs_base__things_different(svn_boolean_t *props_changed,
|
|||||||
|
|
||||||
/* Compare contents keys and their (optional) uniquifiers. */
|
/* Compare contents keys and their (optional) uniquifiers. */
|
||||||
if (contents_changed != NULL)
|
if (contents_changed != NULL)
|
||||||
*contents_changed = (! svn_fs_base__same_keys(noderev1->data_key,
|
*contents_changed =
|
||||||
noderev2->data_key));
|
(! (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;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -195,11 +195,7 @@ typedef struct node_revision_t
|
|||||||
only because one or both of us decided to pick up a shared
|
only because one or both of us decided to pick up a shared
|
||||||
representation after-the-fact." May be NULL (if this node
|
representation after-the-fact." May be NULL (if this node
|
||||||
revision isn't using a shared rep, or isn't the original
|
revision isn't using a shared rep, or isn't the original
|
||||||
"assignee" of a shared rep).
|
"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. */
|
|
||||||
const char *data_key_uniquifier;
|
const char *data_key_uniquifier;
|
||||||
|
|
||||||
/* representation key for this node's text-data-in-progess (files
|
/* representation key for this node's text-data-in-progess (files
|
||||||
|
@ -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,
|
SVN_ERR(get_dir_contents(entries_p, fs, noderev, result_pool,
|
||||||
scratch_pool));
|
scratch_pool));
|
||||||
|
|
||||||
/* Update the cache, if we are to use one. */
|
/* Update the cache, if we are to use one.
|
||||||
if (cache)
|
*
|
||||||
|
* 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));
|
SVN_ERR(svn_cache__set(cache, key, *entries_p, scratch_pool));
|
||||||
|
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
|
@ -1307,35 +1307,59 @@ svn_fs_fs__dag_things_different(svn_boolean_t *props_changed,
|
|||||||
apr_pool_t *pool)
|
apr_pool_t *pool)
|
||||||
{
|
{
|
||||||
node_revision_t *noderev1, *noderev2;
|
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
|
/* If we have no place to store our results, don't bother doing
|
||||||
anything. */
|
anything. */
|
||||||
if (! props_changed && ! contents_changed)
|
if (! props_changed && ! contents_changed)
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
|
|
||||||
fs = svn_fs_fs__dag_get_fs(node1);
|
|
||||||
|
|
||||||
/* The node revision skels for these two nodes. */
|
/* The node revision skels for these two nodes. */
|
||||||
SVN_ERR(get_node_revision(&noderev1, node1));
|
SVN_ERR(get_node_revision(&noderev1, node1));
|
||||||
SVN_ERR(get_node_revision(&noderev2, node2));
|
SVN_ERR(get_node_revision(&noderev2, node2));
|
||||||
|
|
||||||
|
if (strict)
|
||||||
|
{
|
||||||
|
/* In strict mode, compare text and property representations in the
|
||||||
|
svn_fs_contents_different() / svn_fs_props_different() manner.
|
||||||
|
|
||||||
|
See the "No-op changes no longer dumped by 'svnadmin dump' in 1.9"
|
||||||
|
discussion (http://svn.haxx.se/dev/archive-2015-09/0269.shtml) and
|
||||||
|
issue #4598 (https://issues.apache.org/jira/browse/SVN-4598). */
|
||||||
|
svn_fs_t *fs = svn_fs_fs__dag_get_fs(node1);
|
||||||
|
svn_boolean_t same;
|
||||||
|
|
||||||
/* Compare property keys. */
|
/* Compare property keys. */
|
||||||
if (props_changed != NULL)
|
if (props_changed != NULL)
|
||||||
{
|
{
|
||||||
SVN_ERR(svn_fs_fs__prop_rep_equal(&same, fs, noderev1, noderev2,
|
SVN_ERR(svn_fs_fs__prop_rep_equal(&same, fs, noderev1,
|
||||||
strict, pool));
|
noderev2, pool));
|
||||||
*props_changed = !same;
|
*props_changed = !same;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compare contents keys. */
|
/* Compare contents keys. */
|
||||||
if (contents_changed != NULL)
|
if (contents_changed != NULL)
|
||||||
{
|
{
|
||||||
SVN_ERR(svn_fs_fs__file_text_rep_equal(&same, fs, noderev1, noderev2,
|
SVN_ERR(svn_fs_fs__file_text_rep_equal(&same, fs, noderev1,
|
||||||
strict, pool));
|
noderev2, pool));
|
||||||
*contents_changed = !same;
|
*contents_changed = !same;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Otherwise, compare representation keys -- as in Subversion 1.8. */
|
||||||
|
|
||||||
|
/* Compare property keys. */
|
||||||
|
if (props_changed != NULL)
|
||||||
|
*props_changed =
|
||||||
|
!svn_fs_fs__noderev_same_rep_key(noderev1->prop_rep,
|
||||||
|
noderev2->prop_rep);
|
||||||
|
|
||||||
|
/* Compare contents keys. */
|
||||||
|
if (contents_changed != NULL)
|
||||||
|
*contents_changed =
|
||||||
|
!svn_fs_fs__noderev_same_rep_key(noderev1->data_rep,
|
||||||
|
noderev2->data_rep);
|
||||||
|
}
|
||||||
|
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -478,10 +478,6 @@ typedef struct fs_fs_data_t
|
|||||||
/*** Filesystem Transaction ***/
|
/*** Filesystem Transaction ***/
|
||||||
typedef struct transaction_t
|
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. */
|
/* node revision id of the root node. */
|
||||||
const svn_fs_id_t *root_id;
|
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
|
/* 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
|
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
|
store the original txn of the node rev (not the rep!), along with some
|
||||||
intra-node uniqification content.
|
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. */
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
/* unique context, i.e. txn ID, in which the noderev (!) got created */
|
/* unique context, i.e. txn ID, in which the noderev (!) got created */
|
||||||
|
@ -1414,19 +1414,37 @@ svn_fs_fs__file_length(svn_filesize_t *length,
|
|||||||
return SVN_NO_ERROR;
|
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_error_t *
|
||||||
svn_fs_fs__file_text_rep_equal(svn_boolean_t *equal,
|
svn_fs_fs__file_text_rep_equal(svn_boolean_t *equal,
|
||||||
svn_fs_t *fs,
|
svn_fs_t *fs,
|
||||||
node_revision_t *a,
|
node_revision_t *a,
|
||||||
node_revision_t *b,
|
node_revision_t *b,
|
||||||
svn_boolean_t strict,
|
|
||||||
apr_pool_t *scratch_pool)
|
apr_pool_t *scratch_pool)
|
||||||
{
|
{
|
||||||
svn_stream_t *contents_a, *contents_b;
|
svn_stream_t *contents_a, *contents_b;
|
||||||
representation_t *rep_a = a->data_rep;
|
representation_t *rep_a = a->data_rep;
|
||||||
representation_t *rep_b = b->data_rep;
|
representation_t *rep_b = b->data_rep;
|
||||||
svn_boolean_t a_empty = !rep_a || rep_a->expanded_size == 0;
|
svn_boolean_t a_empty = !rep_a;
|
||||||
svn_boolean_t b_empty = !rep_b || rep_b->expanded_size == 0;
|
svn_boolean_t b_empty = !rep_b;
|
||||||
|
|
||||||
/* This makes sure that neither rep will be NULL later on */
|
/* This makes sure that neither rep will be NULL later on */
|
||||||
if (a_empty && b_empty)
|
if (a_empty && b_empty)
|
||||||
@ -1435,14 +1453,22 @@ svn_fs_fs__file_text_rep_equal(svn_boolean_t *equal,
|
|||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a_empty != b_empty)
|
/* Same path in same rev or txn? */
|
||||||
|
if (svn_fs_fs__id_eq(a->id, b->id))
|
||||||
{
|
{
|
||||||
*equal = FALSE;
|
*equal = TRUE;
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* File text representations always know their checksums - even in a txn. */
|
/* Beware of the combination NULL rep and possibly empty rep.
|
||||||
if (memcmp(rep_a->md5_digest, rep_b->md5_digest, sizeof(rep_a->md5_digest)))
|
* 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)
|
||||||
|
{
|
||||||
|
/* 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;
|
*equal = FALSE;
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
@ -1456,25 +1482,6 @@ svn_fs_fs__file_text_rep_equal(svn_boolean_t *equal,
|
|||||||
sizeof(rep_a->sha1_digest)) == 0;
|
sizeof(rep_a->sha1_digest)) == 0;
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Same path in same rev or txn? */
|
|
||||||
if (svn_fs_fs__id_eq(a->id, b->id))
|
|
||||||
{
|
|
||||||
*equal = TRUE;
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
*equal = FALSE;
|
|
||||||
return SVN_NO_ERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SVN_ERR(svn_fs_fs__get_contents(&contents_a, fs, rep_a, TRUE,
|
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,
|
svn_fs_t *fs,
|
||||||
node_revision_t *a,
|
node_revision_t *a,
|
||||||
node_revision_t *b,
|
node_revision_t *b,
|
||||||
svn_boolean_t strict,
|
|
||||||
apr_pool_t *scratch_pool)
|
apr_pool_t *scratch_pool)
|
||||||
{
|
{
|
||||||
representation_t *rep_a = a->prop_rep;
|
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;
|
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.
|
/* At least one of the reps has been modified in a txn.
|
||||||
Fetch and compare them. */
|
Fetch and compare them. */
|
||||||
SVN_ERR(svn_fs_fs__get_proplist(&proplist_a, fs, a, scratch_pool));
|
SVN_ERR(svn_fs_fs__get_proplist(&proplist_a, fs, a, scratch_pool));
|
||||||
|
@ -81,28 +81,29 @@ svn_error_t *svn_fs_fs__file_length(svn_filesize_t *length,
|
|||||||
node_revision_t *noderev,
|
node_revision_t *noderev,
|
||||||
apr_pool_t *pool);
|
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
|
/* 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
|
have equal contents, else set it to FALSE.
|
||||||
for false negatives.
|
|
||||||
Use SCRATCH_POOL for temporary allocations. */
|
Use SCRATCH_POOL for temporary allocations. */
|
||||||
svn_error_t *
|
svn_error_t *
|
||||||
svn_fs_fs__file_text_rep_equal(svn_boolean_t *equal,
|
svn_fs_fs__file_text_rep_equal(svn_boolean_t *equal,
|
||||||
svn_fs_t *fs,
|
svn_fs_t *fs,
|
||||||
node_revision_t *a,
|
node_revision_t *a,
|
||||||
node_revision_t *b,
|
node_revision_t *b,
|
||||||
svn_boolean_t strict,
|
|
||||||
apr_pool_t *scratch_pool);
|
apr_pool_t *scratch_pool);
|
||||||
|
|
||||||
/* Set *EQUAL to TRUE if the property representations in A and B within FS
|
/* 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
|
have equal contents, else set it to FALSE.
|
||||||
for false negatives.
|
|
||||||
Use SCRATCH_POOL for temporary allocations. */
|
Use SCRATCH_POOL for temporary allocations. */
|
||||||
svn_error_t *
|
svn_error_t *
|
||||||
svn_fs_fs__prop_rep_equal(svn_boolean_t *equal,
|
svn_fs_fs__prop_rep_equal(svn_boolean_t *equal,
|
||||||
svn_fs_t *fs,
|
svn_fs_t *fs,
|
||||||
node_revision_t *a,
|
node_revision_t *a,
|
||||||
node_revision_t *b,
|
node_revision_t *b,
|
||||||
svn_boolean_t strict,
|
|
||||||
apr_pool_t *scratch_pool);
|
apr_pool_t *scratch_pool);
|
||||||
|
|
||||||
|
|
||||||
|
@ -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 */
|
* Do not edit this file -- edit the source and rerun gen-make.py */
|
||||||
|
|
||||||
#define STMT_CREATE_SCHEMA 0
|
#define STMT_CREATE_SCHEMA 0
|
||||||
|
@ -1247,9 +1247,6 @@ svn_fs_fs__get_txn(transaction_t **txn_p,
|
|||||||
svn_fs_id_t *root_id;
|
svn_fs_id_t *root_id;
|
||||||
|
|
||||||
txn = apr_pcalloc(pool, sizeof(*txn));
|
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);
|
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));
|
SVN_ERR(svn_fs_fs__get_node_revision(&noderev, fs, root_id, pool, pool));
|
||||||
|
@ -1900,13 +1900,13 @@ merge(svn_stringbuf_t *conflict_p,
|
|||||||
/* Now compare the prop-keys of the skels. Note that just because
|
/* Now compare the prop-keys of the skels. Note that just because
|
||||||
the keys are different -doesn't- mean the proplists have
|
the keys are different -doesn't- mean the proplists have
|
||||||
different contents. */
|
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)
|
if (! same)
|
||||||
return conflict_err(conflict_p, target_path);
|
return conflict_err(conflict_p, target_path);
|
||||||
|
|
||||||
/* The directory entries got changed in the repository but the directory
|
/* The directory entries got changed in the repository but the directory
|
||||||
properties did not. */
|
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)
|
if (! same)
|
||||||
{
|
{
|
||||||
/* There is an incoming prop change for this directory.
|
/* There is an incoming prop change for this directory.
|
||||||
|
@ -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 */
|
* Do not edit this file -- edit the source and rerun gen-make.py */
|
||||||
|
|
||||||
#define STMT_CREATE_SCHEMA 0
|
#define STMT_CREATE_SCHEMA 0
|
||||||
|
@ -360,8 +360,13 @@ make_reporter(svn_ra_session_t *session,
|
|||||||
edit_baton,
|
edit_baton,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
1024 * 1024, /* process-local transfers
|
0, /* Disable zero-copy codepath, because
|
||||||
should be fast */
|
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));
|
result_pool));
|
||||||
|
|
||||||
/* Wrap the report baton given us by the repos layer with our own
|
/* Wrap the report baton given us by the repos layer with our own
|
||||||
|
@ -101,6 +101,8 @@ typedef struct delete_context_t {
|
|||||||
svn_revnum_t revision;
|
svn_revnum_t revision;
|
||||||
|
|
||||||
commit_context_t *commit_ctx;
|
commit_context_t *commit_ctx;
|
||||||
|
|
||||||
|
svn_boolean_t non_recursive_if; /* Only create a non-recursive If header */
|
||||||
} delete_context_t;
|
} delete_context_t;
|
||||||
|
|
||||||
/* Represents a directory. */
|
/* Represents a directory. */
|
||||||
@ -841,6 +843,7 @@ proppatch_resource(svn_ra_serf__session_t *session,
|
|||||||
|
|
||||||
handler->body_delegate = create_proppatch_body;
|
handler->body_delegate = create_proppatch_body;
|
||||||
handler->body_delegate_baton = proppatch;
|
handler->body_delegate_baton = proppatch;
|
||||||
|
handler->body_type = "text/xml";
|
||||||
|
|
||||||
handler->response_handler = svn_ra_serf__handle_multistatus_only;
|
handler->response_handler = svn_ra_serf__handle_multistatus_only;
|
||||||
handler->response_baton = handler;
|
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,
|
serf_bucket_headers_set(headers, SVN_DAV_VERSION_NAME_HEADER,
|
||||||
apr_ltoa(pool, del->revision));
|
apr_ltoa(pool, del->revision));
|
||||||
|
|
||||||
|
if (! del->non_recursive_if)
|
||||||
SVN_ERR(setup_if_header_recursive(&added, headers, del->commit_ctx,
|
SVN_ERR(setup_if_header_recursive(&added, headers, del->commit_ctx,
|
||||||
del->relpath, pool));
|
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)
|
if (added && del->commit_ctx->keep_locks)
|
||||||
serf_bucket_headers_setn(headers, SVN_DAV_OPTIONS_HEADER,
|
serf_bucket_headers_setn(headers, SVN_DAV_OPTIONS_HEADER,
|
||||||
@ -1402,6 +1412,28 @@ open_root(void *edit_baton,
|
|||||||
return SVN_NO_ERROR;
|
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 *
|
static svn_error_t *
|
||||||
delete_entry(const char *path,
|
delete_entry(const char *path,
|
||||||
svn_revnum_t revision,
|
svn_revnum_t revision,
|
||||||
@ -1445,9 +1477,37 @@ delete_entry(const char *path,
|
|||||||
|
|
||||||
handler->method = "DELETE";
|
handler->method = "DELETE";
|
||||||
handler->path = delete_target;
|
handler->path = delete_target;
|
||||||
|
handler->no_fail_on_http_failure_status = TRUE;
|
||||||
|
|
||||||
SVN_ERR(svn_ra_serf__context_run_one(handler, pool));
|
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 */
|
/* 204 No Content: item successfully deleted */
|
||||||
if (handler->sline.code != 204)
|
if (handler->sline.code != 204)
|
||||||
return svn_error_trace(svn_ra_serf__unexpected_status(handler));
|
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 = setup_copy_dir_headers;
|
||||||
handler->header_delegate_baton = dir;
|
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));
|
SVN_ERR(svn_ra_serf__context_run_one(handler, dir->pool));
|
||||||
|
|
||||||
if (handler->sline.code != 201)
|
if (handler->sline.code != 201)
|
||||||
|
@ -143,9 +143,7 @@ iprops_closed(svn_ra_serf__xml_estate_t *xes,
|
|||||||
return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
|
return svn_error_create(SVN_ERR_XML_MALFORMED, NULL, NULL);
|
||||||
|
|
||||||
iprops_ctx->curr_iprop->path_or_url =
|
iprops_ctx->curr_iprop->path_or_url =
|
||||||
svn_path_url_add_component2(iprops_ctx->repos_root_url,
|
apr_pstrdup(iprops_ctx->pool, cdata->data);
|
||||||
cdata->data,
|
|
||||||
iprops_ctx->pool);
|
|
||||||
}
|
}
|
||||||
else if (leaving_state == IPROPS_PROPNAME)
|
else if (leaving_state == IPROPS_PROPNAME)
|
||||||
{
|
{
|
||||||
|
@ -285,8 +285,8 @@ setup_merge_headers(serf_bucket_t *headers,
|
|||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
merge_lock_token_list(apr_hash_t *lock_tokens,
|
svn_ra_serf__merge_lock_token_list(apr_hash_t *lock_tokens,
|
||||||
const char *parent,
|
const char *parent,
|
||||||
serf_bucket_t *body,
|
serf_bucket_t *body,
|
||||||
serf_bucket_alloc_t *alloc,
|
serf_bucket_alloc_t *alloc,
|
||||||
@ -378,7 +378,8 @@ create_merge_body(serf_bucket_t **bkt,
|
|||||||
"D:creator-displayname", SVN_VA_NULL);
|
"D:creator-displayname", SVN_VA_NULL);
|
||||||
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D:prop");
|
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, "D: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");
|
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->path = merge_ctx->merge_url;
|
||||||
handler->body_delegate = create_merge_body;
|
handler->body_delegate = create_merge_body;
|
||||||
handler->body_delegate_baton = merge_ctx;
|
handler->body_delegate_baton = merge_ctx;
|
||||||
|
handler->body_type = "text/xml";
|
||||||
|
|
||||||
handler->header_delegate = setup_merge_headers;
|
handler->header_delegate = setup_merge_headers;
|
||||||
handler->header_delegate_baton = merge_ctx;
|
handler->header_delegate_baton = merge_ctx;
|
||||||
|
@ -315,7 +315,7 @@ multistatus_closed(svn_ra_serf__xml_estate_t *xes,
|
|||||||
svn_ra_serf__xml_note(xes, MS_RESPONSE, "errcode", errcode);
|
svn_ra_serf__xml_note(xes, MS_RESPONSE, "errcode", errcode);
|
||||||
break;
|
break;
|
||||||
case MS_RESPONSE:
|
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;
|
error_item_t *item;
|
||||||
|
|
||||||
@ -369,7 +369,7 @@ multistatus_closed(svn_ra_serf__xml_estate_t *xes,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MS_PROPSTAT:
|
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;
|
apr_hash_t *response_attrs;
|
||||||
error_item_t *item;
|
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;
|
item->http_status = server_error->handler->sline.code;
|
||||||
|
|
||||||
/* Do we have a mod_dav specific message? */
|
/* 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)
|
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);
|
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;
|
APR_ARRAY_PUSH(server_error->items, error_item_t *) = item;
|
||||||
|
@ -1022,6 +1022,13 @@ svn_ra_serf__svnname_from_wirename(const char *ns,
|
|||||||
|
|
||||||
/** MERGE-related functions **/
|
/** 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
|
/* Create an MERGE request aimed at the SESSION url, requesting the
|
||||||
merge of the resource identified by MERGE_RESOURCE_URL.
|
merge of the resource identified by MERGE_RESOURCE_URL.
|
||||||
LOCK_TOKENS is a hash mapping paths to lock tokens owned by the
|
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,
|
apr_size_t len,
|
||||||
serf_bucket_alloc_t *allocator);
|
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)
|
#if defined(SVN_DEBUG)
|
||||||
|
@ -756,6 +756,7 @@ svn_ra_serf__replay_range(svn_ra_session_t *ra_session,
|
|||||||
handler->path = replay_target;
|
handler->path = replay_target;
|
||||||
handler->body_delegate = create_replay_body;
|
handler->body_delegate = create_replay_body;
|
||||||
handler->body_delegate_baton = rev_ctx;
|
handler->body_delegate_baton = rev_ctx;
|
||||||
|
handler->body_type = "text/xml";
|
||||||
|
|
||||||
handler->done_delegate = replay_done;
|
handler->done_delegate = replay_done;
|
||||||
handler->done_delegate_baton = rev_ctx;
|
handler->done_delegate_baton = rev_ctx;
|
||||||
|
@ -64,7 +64,7 @@ ra_serf_version(void)
|
|||||||
|
|
||||||
#define RA_SERF_DESCRIPTION_VER \
|
#define RA_SERF_DESCRIPTION_VER \
|
||||||
N_("Module for accessing a repository via WebDAV protocol using serf.\n" \
|
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(). */
|
/* Implements svn_ra__vtable_t.get_description(). */
|
||||||
static const char *
|
static const char *
|
||||||
@ -73,7 +73,12 @@ ra_serf_get_description(apr_pool_t *pool)
|
|||||||
int major, minor, patch;
|
int major, minor, patch;
|
||||||
|
|
||||||
serf_lib_version(&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(). */
|
/* Implements svn_ra__vtable_t.get_schemes(). */
|
||||||
@ -509,19 +514,8 @@ svn_ra_serf__open(svn_ra_session_t *session,
|
|||||||
serf_sess->pool));
|
serf_sess->pool));
|
||||||
|
|
||||||
|
|
||||||
status = apr_uri_parse(serf_sess->pool, session_URL, &url);
|
SVN_ERR(svn_ra_serf__uri_parse(&url, session_URL, serf_sess->pool));
|
||||||
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, "/");
|
|
||||||
}
|
|
||||||
if (!url.port)
|
if (!url.port)
|
||||||
{
|
{
|
||||||
url.port = apr_uri_port_of_scheme(url.scheme);
|
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 = apr_pstrdup(result_pool,
|
||||||
new_sess->repos_root_str);
|
new_sess->repos_root_str);
|
||||||
status = apr_uri_parse(result_pool, new_sess->repos_root_str,
|
SVN_ERR(svn_ra_serf__uri_parse(&new_sess->repos_root,
|
||||||
&new_sess->repos_root);
|
new_sess->repos_root_str,
|
||||||
if (status)
|
result_pool));
|
||||||
return svn_ra_serf__wrap_err(status, NULL);
|
|
||||||
|
|
||||||
new_sess->session_url_str = apr_pstrdup(result_pool, new_session_url);
|
new_sess->session_url_str = apr_pstrdup(result_pool, new_session_url);
|
||||||
|
|
||||||
status = apr_uri_parse(result_pool, new_sess->session_url_str,
|
SVN_ERR(svn_ra_serf__uri_parse(&new_sess->session_url,
|
||||||
&new_sess->session_url);
|
new_sess->session_url_str,
|
||||||
|
result_pool));
|
||||||
if (status)
|
|
||||||
return svn_ra_serf__wrap_err(status, NULL);
|
|
||||||
|
|
||||||
/* svn_boolean_t supports_inline_props */
|
/* svn_boolean_t supports_inline_props */
|
||||||
/* supports_rev_rsrc_replay */
|
/* 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;
|
svn_ra_serf__session_t *session = ra_session->priv;
|
||||||
apr_uri_t new_url;
|
apr_uri_t new_url;
|
||||||
apr_status_t status;
|
|
||||||
|
|
||||||
/* If it's the URL we already have, wave our hands and do nothing. */
|
/* If it's the URL we already have, wave our hands and do nothing. */
|
||||||
if (strcmp(session->session_url_str, url) == 0)
|
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);
|
"URL '%s'"), url, session->repos_root_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
status = apr_uri_parse(pool, url, &new_url);
|
SVN_ERR(svn_ra_serf__uri_parse(&new_url, url, pool));
|
||||||
if (status)
|
|
||||||
{
|
|
||||||
return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
|
|
||||||
_("Illegal repository URL '%s'"), url);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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
|
/* ### Maybe we should use a string buffer for these strings so we
|
||||||
### don't allocate memory in the session on every reparent? */
|
### 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);
|
session->session_url_str = apr_pstrdup(session->pool, url);
|
||||||
|
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
|
@ -1949,3 +1949,29 @@ svn_ra_serf__create_handler(svn_ra_serf__session_t *session,
|
|||||||
return handler;
|
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;
|
||||||
|
}
|
||||||
|
@ -1191,7 +1191,6 @@ parse_iproplist(apr_array_header_t **inherited_props,
|
|||||||
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
const char *repos_root_url;
|
|
||||||
apr_pool_t *iterpool;
|
apr_pool_t *iterpool;
|
||||||
|
|
||||||
if (iproplist == NULL)
|
if (iproplist == NULL)
|
||||||
@ -1204,8 +1203,6 @@ parse_iproplist(apr_array_header_t **inherited_props,
|
|||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
SVN_ERR(ra_svn_get_repos_root(session, &repos_root_url, scratch_pool));
|
|
||||||
|
|
||||||
*inherited_props = apr_array_make(
|
*inherited_props = apr_array_make(
|
||||||
result_pool, iproplist->nelts, sizeof(svn_prop_inherited_item_t *));
|
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",
|
SVN_ERR(svn_ra_svn__parse_tuple(elt->u.list, iterpool, "cl",
|
||||||
&parent_rel_path, &iprop_list));
|
&parent_rel_path, &iprop_list));
|
||||||
SVN_ERR(svn_ra_svn__parse_proplist(iprop_list, iterpool, &iprops));
|
SVN_ERR(svn_ra_svn__parse_proplist(iprop_list, iterpool, &iprops));
|
||||||
new_iprop->path_or_url = svn_path_url_add_component2(repos_root_url,
|
new_iprop->path_or_url = apr_pstrdup(result_pool, parent_rel_path);
|
||||||
parent_rel_path,
|
|
||||||
result_pool);
|
|
||||||
new_iprop->prop_hash = svn_hash__make(result_pool);
|
new_iprop->prop_hash = svn_hash__make(result_pool);
|
||||||
for (hi = apr_hash_first(iterpool, iprops);
|
for (hi = apr_hash_first(iterpool, iprops);
|
||||||
hi;
|
hi;
|
||||||
|
@ -256,7 +256,8 @@ svn_ra_svn_create_conn3(apr_socket_t *sock,
|
|||||||
out_stream = svn_stream_from_aprfile2(out_file, FALSE, pool);
|
out_stream = svn_stream_from_aprfile2(out_file, FALSE, pool);
|
||||||
|
|
||||||
return svn_ra_svn_create_conn4(sock, in_stream, out_stream,
|
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 *
|
svn_ra_svn_conn_t *
|
||||||
|
@ -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 len = (apr_size_t)len64;
|
||||||
apr_size_t readbuf_len;
|
apr_size_t readbuf_len;
|
||||||
char *dest;
|
char *dest;
|
||||||
|
apr_size_t buflen;
|
||||||
|
|
||||||
/* We can't store strings longer than the maximum size of apr_size_t,
|
/* We can't store strings longer than the maximum size of apr_size_t,
|
||||||
* so check for wrapping */
|
* 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,
|
return svn_error_create(SVN_ERR_RA_SVN_MALFORMED_DATA, NULL,
|
||||||
_("String length larger than maximum"));
|
_("String length larger than maximum"));
|
||||||
|
|
||||||
|
buflen = conn->read_end - conn->read_ptr;
|
||||||
/* Shorter strings can be copied directly from the read buffer. */
|
/* 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->kind = SVN_RA_SVN_STRING;
|
||||||
item->u.string = svn_string_ncreate(conn->read_ptr, len, pool);
|
item->u.string = svn_string_ncreate(conn->read_ptr, len, pool);
|
||||||
|
@ -1164,11 +1164,11 @@ dump_node(struct edit_baton *eb,
|
|||||||
svn_fs_root_fs(eb->fs_root),
|
svn_fs_root_fs(eb->fs_root),
|
||||||
compare_rev, pool));
|
compare_rev, pool));
|
||||||
|
|
||||||
SVN_ERR(svn_fs_props_different(&must_dump_props,
|
SVN_ERR(svn_fs_props_changed(&must_dump_props,
|
||||||
compare_root, compare_path,
|
compare_root, compare_path,
|
||||||
eb->fs_root, path, pool));
|
eb->fs_root, path, pool));
|
||||||
if (kind == svn_node_file)
|
if (kind == svn_node_file)
|
||||||
SVN_ERR(svn_fs_contents_different(&must_dump_text,
|
SVN_ERR(svn_fs_contents_changed(&must_dump_text,
|
||||||
compare_root, compare_path,
|
compare_root, compare_path,
|
||||||
eb->fs_root, path, pool));
|
eb->fs_root, path, pool));
|
||||||
break;
|
break;
|
||||||
@ -1293,14 +1293,14 @@ dump_node(struct edit_baton *eb,
|
|||||||
|
|
||||||
/* Need to decide if the copied node had any extra textual or
|
/* Need to decide if the copied node had any extra textual or
|
||||||
property mods as well. */
|
property mods as well. */
|
||||||
SVN_ERR(svn_fs_props_different(&must_dump_props,
|
SVN_ERR(svn_fs_props_changed(&must_dump_props,
|
||||||
compare_root, compare_path,
|
compare_root, compare_path,
|
||||||
eb->fs_root, path, pool));
|
eb->fs_root, path, pool));
|
||||||
if (kind == svn_node_file)
|
if (kind == svn_node_file)
|
||||||
{
|
{
|
||||||
svn_checksum_t *checksum;
|
svn_checksum_t *checksum;
|
||||||
const char *hex_digest;
|
const char *hex_digest;
|
||||||
SVN_ERR(svn_fs_contents_different(&must_dump_text,
|
SVN_ERR(svn_fs_contents_changed(&must_dump_text,
|
||||||
compare_root, compare_path,
|
compare_root, compare_path,
|
||||||
eb->fs_root, path, pool));
|
eb->fs_root, path, pool));
|
||||||
|
|
||||||
|
@ -2127,7 +2127,7 @@ do_logs(svn_fs_t *fs,
|
|||||||
if (added_mergeinfo || deleted_mergeinfo)
|
if (added_mergeinfo || deleted_mergeinfo)
|
||||||
{
|
{
|
||||||
svn_revnum_t *cur_rev =
|
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 =
|
struct added_deleted_mergeinfo *add_and_del_mergeinfo =
|
||||||
apr_palloc(pool, sizeof(*add_and_del_mergeinfo));
|
apr_palloc(pool, sizeof(*add_and_del_mergeinfo));
|
||||||
|
|
||||||
|
@ -848,11 +848,16 @@ create_conf(svn_repos_t *repos, apr_pool_t *pool)
|
|||||||
"### no path-based access control is done." NL
|
"### no path-based access control is done." NL
|
||||||
"### Uncomment the line below to use the default authorization file." NL
|
"### Uncomment the line below to use the default authorization file." NL
|
||||||
"# authz-db = " SVN_REPOS__CONF_AUTHZ NL
|
"# authz-db = " SVN_REPOS__CONF_AUTHZ NL
|
||||||
"### The groups-db option controls the location of the groups file." NL
|
"### The groups-db option controls the location of the file with the" NL
|
||||||
"### Unless you specify a path starting with a /, the file's location is" NL
|
"### group definitions and allows maintaining groups separately from the" NL
|
||||||
"### relative to the directory containing this file. The specified path" NL
|
"### authorization rules. The groups-db file is of the same format as the" NL
|
||||||
"### may be a repository relative URL (^/) or an absolute file:// URL to a" NL
|
"### authz-db file and should contain a single [groups] section with the" NL
|
||||||
"### text file in a Subversion repository." 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
|
"# groups-db = " SVN_REPOS__CONF_GROUPS NL
|
||||||
"### This option specifies the authentication realm of the repository." NL
|
"### This option specifies the authentication realm of the repository." NL
|
||||||
"### If two repositories have the same authentication realm, they should" NL
|
"### If two repositories have the same authentication realm, they should" NL
|
||||||
|
@ -371,7 +371,9 @@ svn_auth_next_credentials(void **credentials,
|
|||||||
if (creds != NULL)
|
if (creds != NULL)
|
||||||
{
|
{
|
||||||
/* Put the creds in the cache */
|
/* 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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,6 +139,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* For more efficient copy operations, let's align all data items properly.
|
/* 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.
|
* Must be a power of 2.
|
||||||
*/
|
*/
|
||||||
#define ITEM_ALIGNMENT 16
|
#define ITEM_ALIGNMENT 16
|
||||||
@ -632,10 +636,6 @@ struct svn_membuffer_t
|
|||||||
*/
|
*/
|
||||||
#define ALIGN_VALUE(value) (((value) + ITEM_ALIGNMENT-1) & -ITEM_ALIGNMENT)
|
#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.
|
/* If locking is supported for CACHE, acquire a read lock for it.
|
||||||
*/
|
*/
|
||||||
static svn_error_t *
|
static svn_error_t *
|
||||||
@ -1643,28 +1643,6 @@ ensure_data_insertable_l1(svn_membuffer_t *cache, apr_size_t size)
|
|||||||
* right answer. */
|
* 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_error_t *
|
||||||
svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
|
svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
|
||||||
apr_size_t total_size,
|
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.last = NO_INDEX;
|
||||||
c[seg].l2.next = NO_INDEX;
|
c[seg].l2.next = NO_INDEX;
|
||||||
c[seg].l2.start_offset = c[seg].l1.size;
|
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].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].data_used = 0;
|
||||||
c[seg].max_entry_size = max_entry_size;
|
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;
|
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);
|
memcpy(*buffer, cache->data + entry->offset + entry->key.key_len, size);
|
||||||
|
|
||||||
#ifdef SVN_DEBUG_CACHE_MEMBUFFER
|
#ifdef SVN_DEBUG_CACHE_MEMBUFFER
|
||||||
|
@ -33,20 +33,7 @@
|
|||||||
char *
|
char *
|
||||||
svn_eol__find_eol_start(char *buf, apr_size_t len)
|
svn_eol__find_eol_start(char *buf, apr_size_t len)
|
||||||
{
|
{
|
||||||
#if !SVN_UNALIGNED_ACCESS_IS_OK
|
#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
|
|
||||||
|
|
||||||
/* Scan the input one machine word at a time. */
|
/* Scan the input one machine word at a time. */
|
||||||
for (; len > sizeof(apr_uintptr_t)
|
for (; len > sizeof(apr_uintptr_t)
|
||||||
@ -71,6 +58,8 @@ svn_eol__find_eol_start(char *buf, apr_size_t len)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The remaining odd bytes will be examined the naive way: */
|
/* The remaining odd bytes will be examined the naive way: */
|
||||||
for (; len > 0; ++buf, --len)
|
for (; len > 0; ++buf, --len)
|
||||||
{
|
{
|
||||||
|
@ -103,6 +103,40 @@ escape_blanks(char *str)
|
|||||||
return 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
|
/* Generate the string CACHE_ID_P based on the REALMSTRING allocated in
|
||||||
* RESULT_POOL using SCRATCH_POOL for temporary allocations. This is similar
|
* RESULT_POOL using SCRATCH_POOL for temporary allocations. This is similar
|
||||||
* to other password caching mechanisms. */
|
* to other password caching mechanisms. */
|
||||||
@ -379,7 +413,7 @@ password_get_gpg_agent(svn_boolean_t *done,
|
|||||||
apr_pool_t *pool)
|
apr_pool_t *pool)
|
||||||
{
|
{
|
||||||
int sd;
|
int sd;
|
||||||
const char *p = NULL;
|
char *p = NULL;
|
||||||
char *ep = NULL;
|
char *ep = NULL;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
const char *request = NULL;
|
const char *request = NULL;
|
||||||
@ -452,7 +486,7 @@ password_get_gpg_agent(svn_boolean_t *done,
|
|||||||
if (ep != NULL)
|
if (ep != NULL)
|
||||||
*ep = '\0';
|
*ep = '\0';
|
||||||
|
|
||||||
*password = p;
|
*password = unescape_assuan(p);
|
||||||
|
|
||||||
*done = TRUE;
|
*done = TRUE;
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
|
@ -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 */
|
* 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
|
||||||
|
@ -831,9 +831,8 @@ plaintext_prompt_helper(svn_boolean_t *may_save_plaintext,
|
|||||||
{
|
{
|
||||||
if (err->apr_err == SVN_ERR_CANCELLED)
|
if (err->apr_err == SVN_ERR_CANCELLED)
|
||||||
{
|
{
|
||||||
svn_error_clear(err);
|
|
||||||
*may_save_plaintext = FALSE;
|
*may_save_plaintext = FALSE;
|
||||||
return SVN_NO_ERROR;
|
return err;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return err;
|
return err;
|
||||||
|
@ -1171,6 +1171,7 @@ svn_sqlite__open(svn_sqlite__db_t **db, const char *path,
|
|||||||
affects application(read: Subversion) performance/behavior. */
|
affects application(read: Subversion) performance/behavior. */
|
||||||
"PRAGMA foreign_keys=OFF;" /* SQLITE_DEFAULT_FOREIGN_KEYS*/
|
"PRAGMA foreign_keys=OFF;" /* SQLITE_DEFAULT_FOREIGN_KEYS*/
|
||||||
"PRAGMA locking_mode = NORMAL;" /* SQLITE_DEFAULT_LOCKING_MODE */
|
"PRAGMA locking_mode = NORMAL;" /* SQLITE_DEFAULT_LOCKING_MODE */
|
||||||
|
/* Testing shows TRUNCATE is faster than DELETE on Windows. */
|
||||||
"PRAGMA journal_mode = TRUNCATE;"
|
"PRAGMA journal_mode = TRUNCATE;"
|
||||||
),
|
),
|
||||||
*db);
|
*db);
|
||||||
|
@ -677,7 +677,7 @@ svn_stringbuf_remove(svn_stringbuf_t *str,
|
|||||||
{
|
{
|
||||||
if (pos > str->len)
|
if (pos > str->len)
|
||||||
pos = str->len;
|
pos = str->len;
|
||||||
if (pos + count > str->len)
|
if (count > str->len - pos)
|
||||||
count = str->len - pos;
|
count = str->len - pos;
|
||||||
|
|
||||||
memmove(str->data + pos, str->data + pos + count, str->len - pos - count + 1);
|
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)
|
if (pos > str->len)
|
||||||
pos = str->len;
|
pos = str->len;
|
||||||
if (pos + old_count > str->len)
|
if (old_count > str->len - pos)
|
||||||
old_count = str->len - pos;
|
old_count = str->len - pos;
|
||||||
|
|
||||||
if (old_count < new_count)
|
if (old_count < new_count)
|
||||||
|
@ -258,24 +258,7 @@ static const char machine [9][14] = {
|
|||||||
static const char *
|
static const char *
|
||||||
first_non_fsm_start_char(const char *data, apr_size_t max_len)
|
first_non_fsm_start_char(const char *data, apr_size_t max_len)
|
||||||
{
|
{
|
||||||
#if !SVN_UNALIGNED_ACCESS_IS_OK
|
#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
|
|
||||||
|
|
||||||
/* Scan the input one machine word at a time. */
|
/* Scan the input one machine word at a time. */
|
||||||
for (; max_len > sizeof(apr_uintptr_t)
|
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)
|
if (*(const apr_uintptr_t *)data & SVN__BIT_7_SET)
|
||||||
break;
|
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
|
#endif
|
||||||
|
|
||||||
/* The remaining odd bytes will be examined the naive way: */
|
/* The remaining odd bytes will be examined the naive way: */
|
||||||
for (; ; ++data)
|
for (; max_len > 0; ++data, --max_len)
|
||||||
if (*data == 0 || (unsigned char)*data >= 0x80)
|
if ((unsigned char)*data >= 0x80)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
@ -359,20 +298,10 @@ svn_utf__last_valid(const char *data, apr_size_t len)
|
|||||||
svn_boolean_t
|
svn_boolean_t
|
||||||
svn_utf__cstring_is_valid(const char *data)
|
svn_utf__cstring_is_valid(const char *data)
|
||||||
{
|
{
|
||||||
int state = FSM_START;
|
|
||||||
|
|
||||||
if (!data)
|
if (!data)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
data = first_non_fsm_start_char_cstring(data);
|
return svn_utf__is_valid(data, strlen(data));
|
||||||
|
|
||||||
while (*data)
|
|
||||||
{
|
|
||||||
unsigned char octet = *data++;
|
|
||||||
int category = octet_category[octet];
|
|
||||||
state = machine[state][category];
|
|
||||||
}
|
|
||||||
return state == FSM_START;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
svn_boolean_t
|
svn_boolean_t
|
||||||
|
@ -136,7 +136,7 @@ svn_version_extended(svn_boolean_t verbose,
|
|||||||
info->build_time = __TIME__;
|
info->build_time = __TIME__;
|
||||||
info->build_host = SVN_BUILD_HOST;
|
info->build_host = SVN_BUILD_HOST;
|
||||||
info->copyright = apr_pstrdup
|
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"
|
"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 "
|
||||||
|
@ -2051,7 +2051,7 @@ svn_wc_get_diff_editor6(const svn_delta_editor_t **editor,
|
|||||||
wc_ctx,
|
wc_ctx,
|
||||||
anchor_abspath, target,
|
anchor_abspath, target,
|
||||||
depth,
|
depth,
|
||||||
use_git_diff_format, use_text_base,
|
ignore_ancestry, use_text_base,
|
||||||
reverse_order, server_performs_filtering,
|
reverse_order, server_performs_filtering,
|
||||||
changelist_filter,
|
changelist_filter,
|
||||||
diff_processor,
|
diff_processor,
|
||||||
|
@ -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 */
|
* 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.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 */
|
* 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.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 */
|
* 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
|
||||||
@ -1623,7 +1623,8 @@
|
|||||||
#define STMT_PRAGMA_LOCKING_MODE 151
|
#define STMT_PRAGMA_LOCKING_MODE 151
|
||||||
#define STMT_151_INFO {"STMT_PRAGMA_LOCKING_MODE", NULL}
|
#define STMT_151_INFO {"STMT_PRAGMA_LOCKING_MODE", NULL}
|
||||||
#define STMT_151 \
|
#define STMT_151 \
|
||||||
"PRAGMA locking_mode = exclusive " \
|
"PRAGMA locking_mode = exclusive; " \
|
||||||
|
"PRAGMA journal_mode = DELETE " \
|
||||||
""
|
""
|
||||||
|
|
||||||
#define STMT_INSERT_ACTUAL_NODE 152
|
#define STMT_INSERT_ACTUAL_NODE 152
|
||||||
|
@ -1286,7 +1286,10 @@ WHERE (wc_id = ?1 AND local_relpath = ?2)
|
|||||||
OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
|
OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
|
||||||
|
|
||||||
-- STMT_PRAGMA_LOCKING_MODE
|
-- 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
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
@ -870,6 +870,7 @@ pristine_cleanup_wcroot(svn_wc__db_wcroot_t *wcroot,
|
|||||||
{
|
{
|
||||||
svn_sqlite__stmt_t *stmt;
|
svn_sqlite__stmt_t *stmt;
|
||||||
svn_error_t *err = NULL;
|
svn_error_t *err = NULL;
|
||||||
|
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
|
||||||
|
|
||||||
/* Find each unreferenced pristine in the DB and remove it. */
|
/* Find each unreferenced pristine in the DB and remove it. */
|
||||||
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
|
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;
|
svn_boolean_t have_row;
|
||||||
const svn_checksum_t *sha1_checksum;
|
const svn_checksum_t *sha1_checksum;
|
||||||
|
|
||||||
|
svn_pool_clear(iterpool);
|
||||||
|
|
||||||
SVN_ERR(svn_sqlite__step(&have_row, stmt));
|
SVN_ERR(svn_sqlite__step(&have_row, stmt));
|
||||||
if (! have_row)
|
if (! have_row)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
SVN_ERR(svn_sqlite__column_checksum(&sha1_checksum, stmt, 0,
|
SVN_ERR(svn_sqlite__column_checksum(&sha1_checksum, stmt, 0,
|
||||||
scratch_pool));
|
iterpool));
|
||||||
err = pristine_remove_if_unreferenced(wcroot, sha1_checksum,
|
err = pristine_remove_if_unreferenced(wcroot, sha1_checksum,
|
||||||
scratch_pool);
|
iterpool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
svn_pool_destroy(iterpool);
|
||||||
|
|
||||||
return svn_error_trace(
|
return svn_error_trace(
|
||||||
svn_error_compose_create(err, svn_sqlite__reset(stmt)));
|
svn_error_compose_create(err, svn_sqlite__reset(stmt)));
|
||||||
}
|
}
|
||||||
|
@ -775,7 +775,7 @@ handle_text_conflict(svn_wc_conflict_result_t *result,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (knows_something)
|
if (knows_something || desc->is_binary)
|
||||||
*next_option++ = "r";
|
*next_option++ = "r";
|
||||||
|
|
||||||
/* The 'mine-full' option selects the ".mine" file so only offer
|
/* 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 file if they've edited it, or at least looked at
|
||||||
the diff. */
|
the diff. */
|
||||||
if (opt->choice == svn_wc_conflict_choose_merged
|
if (opt->choice == svn_wc_conflict_choose_merged
|
||||||
&& ! knows_something)
|
&& ! knows_something && diff_allowed)
|
||||||
{
|
{
|
||||||
SVN_ERR(svn_cmdline_fprintf(
|
SVN_ERR(svn_cmdline_fprintf(
|
||||||
stderr, iterpool,
|
stderr, iterpool,
|
||||||
|
@ -82,6 +82,7 @@ kind_to_word(svn_client_diff_summarize_kind_t kind)
|
|||||||
struct summarize_baton_t
|
struct summarize_baton_t
|
||||||
{
|
{
|
||||||
const char *anchor;
|
const char *anchor;
|
||||||
|
svn_boolean_t ignore_properties;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Print summary information about a given change as XML, implements the
|
/* 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. */
|
* baton, and appending the target's relative path. */
|
||||||
const char *path = b->anchor;
|
const char *path = b->anchor;
|
||||||
svn_stringbuf_t *sb = svn_stringbuf_create_empty(pool);
|
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
|
/* Tack on the target path, so we can differentiate between different parts
|
||||||
* of the output when we're given multiple targets. */
|
* 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);
|
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",
|
svn_xml_make_open_tag(&sb, pool, svn_xml_protect_pcdata, "path",
|
||||||
"kind", svn_cl__node_kind_str_xml(summary->node_kind),
|
"kind", svn_cl__node_kind_str_xml(summary->node_kind),
|
||||||
"item", kind_to_word(summary->summarize_kind),
|
"item", kind_to_word(summary->summarize_kind),
|
||||||
"props", summary->prop_changed ? "modified" : "none",
|
"props", prop_change,
|
||||||
SVN_VA_NULL);
|
SVN_VA_NULL);
|
||||||
|
|
||||||
svn_xml_escape_cdata_cstring(&sb, path, pool);
|
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;
|
struct summarize_baton_t *b = baton;
|
||||||
const char *path = b->anchor;
|
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
|
/* Tack on the target path, so we can differentiate between different parts
|
||||||
* of the output when we're given multiple targets. */
|
* 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
|
* thus the blank spaces where information that is not relevant to
|
||||||
* a diff summary would go. */
|
* a diff summary would go. */
|
||||||
|
|
||||||
SVN_ERR(svn_cmdline_printf(pool,
|
prop_change = summary->prop_changed ? 'M' : ' ';
|
||||||
"%c%c %s\n",
|
if (b->ignore_properties)
|
||||||
|
prop_change = ' ';
|
||||||
|
|
||||||
|
SVN_ERR(svn_cmdline_printf(pool, "%c%c %s\n",
|
||||||
kind_to_char(summary->summarize_kind),
|
kind_to_char(summary->summarize_kind),
|
||||||
summary->prop_changed ? 'M' : ' ',
|
prop_change, path));
|
||||||
path));
|
|
||||||
|
|
||||||
return svn_cmdline_fflush(stdout);
|
return svn_cmdline_fflush(stdout);
|
||||||
}
|
}
|
||||||
@ -395,6 +412,7 @@ svn_cl__diff(apr_getopt_t *os,
|
|||||||
if (opt_state->diff.summarize)
|
if (opt_state->diff.summarize)
|
||||||
{
|
{
|
||||||
summarize_baton.anchor = target1;
|
summarize_baton.anchor = target1;
|
||||||
|
summarize_baton.ignore_properties = ignore_properties;
|
||||||
|
|
||||||
SVN_ERR(svn_client_diff_summarize2(
|
SVN_ERR(svn_client_diff_summarize2(
|
||||||
target1,
|
target1,
|
||||||
@ -447,6 +465,7 @@ svn_cl__diff(apr_getopt_t *os,
|
|||||||
if (opt_state->diff.summarize)
|
if (opt_state->diff.summarize)
|
||||||
{
|
{
|
||||||
summarize_baton.anchor = truepath;
|
summarize_baton.anchor = truepath;
|
||||||
|
summarize_baton.ignore_properties = ignore_properties;
|
||||||
SVN_ERR(svn_client_diff_summarize_peg2(
|
SVN_ERR(svn_client_diff_summarize_peg2(
|
||||||
truepath,
|
truepath,
|
||||||
&peg_revision,
|
&peg_revision,
|
||||||
|
@ -80,6 +80,29 @@ get_comment(const char **comment, svn_client_ctx_t *ctx,
|
|||||||
return SVN_NO_ERROR;
|
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. */
|
/* This implements the `svn_opt_subcommand_t' interface. */
|
||||||
svn_error_t *
|
svn_error_t *
|
||||||
svn_cl__lock(apr_getopt_t *os,
|
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;
|
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
|
||||||
apr_array_header_t *targets;
|
apr_array_header_t *targets;
|
||||||
const char *comment;
|
const char *comment;
|
||||||
|
struct notify_lock_baton_t nlb;
|
||||||
|
|
||||||
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
|
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
|
||||||
opt_state->targets,
|
opt_state->targets,
|
||||||
@ -106,5 +130,18 @@ svn_cl__lock(apr_getopt_t *os,
|
|||||||
|
|
||||||
SVN_ERR(svn_cl__eat_peg_revisions(&targets, targets, pool));
|
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;
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,29 @@
|
|||||||
|
|
||||||
/*** Code. ***/
|
/*** 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. */
|
/* This implements the `svn_opt_subcommand_t' interface. */
|
||||||
svn_error_t *
|
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_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;
|
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
|
||||||
apr_array_header_t *targets;
|
apr_array_header_t *targets;
|
||||||
|
struct notify_unlock_baton_t nub;
|
||||||
|
|
||||||
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
|
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
|
||||||
opt_state->targets,
|
opt_state->targets,
|
||||||
@ -63,6 +87,18 @@ svn_cl__unlock(apr_getopt_t *os,
|
|||||||
|
|
||||||
SVN_ERR(svn_cl__assert_homogeneous_target_type(targets));
|
SVN_ERR(svn_cl__assert_homogeneous_target_type(targets));
|
||||||
|
|
||||||
return svn_error_trace(
|
nub.inner_notify = ctx->notify_func2;
|
||||||
svn_client_unlock(targets, opt_state->force, ctx, scratch_pool));
|
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;
|
||||||
}
|
}
|
||||||
|
@ -674,7 +674,8 @@ dump_contents(svn_stream_t *stream,
|
|||||||
non-textual data -- in this case, the *IS_BINARY flag is set and no
|
non-textual data -- in this case, the *IS_BINARY flag is set and no
|
||||||
temporary files are created.
|
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 *
|
static svn_error_t *
|
||||||
prepare_tmpfiles(const char **tmpfile1,
|
prepare_tmpfiles(const char **tmpfile1,
|
||||||
const char **tmpfile2,
|
const char **tmpfile2,
|
||||||
@ -683,8 +684,8 @@ prepare_tmpfiles(const char **tmpfile1,
|
|||||||
const char *path1,
|
const char *path1,
|
||||||
svn_fs_root_t *root2,
|
svn_fs_root_t *root2,
|
||||||
const char *path2,
|
const char *path2,
|
||||||
const char *tmpdir,
|
apr_pool_t *result_pool,
|
||||||
apr_pool_t *pool)
|
apr_pool_t *scratch_pool)
|
||||||
{
|
{
|
||||||
svn_string_t *mimetype;
|
svn_string_t *mimetype;
|
||||||
svn_stream_t *stream;
|
svn_stream_t *stream;
|
||||||
@ -701,7 +702,7 @@ prepare_tmpfiles(const char **tmpfile1,
|
|||||||
if (root1)
|
if (root1)
|
||||||
{
|
{
|
||||||
SVN_ERR(svn_fs_node_prop(&mimetype, root1, path1,
|
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))
|
if (mimetype && svn_mime_type_is_binary(mimetype->data))
|
||||||
{
|
{
|
||||||
*is_binary = TRUE;
|
*is_binary = TRUE;
|
||||||
@ -711,7 +712,7 @@ prepare_tmpfiles(const char **tmpfile1,
|
|||||||
if (root2)
|
if (root2)
|
||||||
{
|
{
|
||||||
SVN_ERR(svn_fs_node_prop(&mimetype, root2, path2,
|
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))
|
if (mimetype && svn_mime_type_is_binary(mimetype->data))
|
||||||
{
|
{
|
||||||
*is_binary = TRUE;
|
*is_binary = TRUE;
|
||||||
@ -721,17 +722,15 @@ prepare_tmpfiles(const char **tmpfile1,
|
|||||||
|
|
||||||
/* Now, prepare the two temporary files, each of which will either
|
/* Now, prepare the two temporary files, each of which will either
|
||||||
be empty, or will have real contents. */
|
be empty, or will have real contents. */
|
||||||
SVN_ERR(svn_stream_open_unique(&stream, tmpfile1,
|
SVN_ERR(svn_stream_open_unique(&stream, tmpfile1, NULL,
|
||||||
tmpdir,
|
svn_io_file_del_on_pool_cleanup,
|
||||||
svn_io_file_del_none,
|
result_pool, scratch_pool));
|
||||||
pool, pool));
|
SVN_ERR(dump_contents(stream, root1, path1, scratch_pool));
|
||||||
SVN_ERR(dump_contents(stream, root1, path1, pool));
|
|
||||||
|
|
||||||
SVN_ERR(svn_stream_open_unique(&stream, tmpfile2,
|
SVN_ERR(svn_stream_open_unique(&stream, tmpfile2, NULL,
|
||||||
tmpdir,
|
svn_io_file_del_on_pool_cleanup,
|
||||||
svn_io_file_del_none,
|
result_pool, scratch_pool));
|
||||||
pool, pool));
|
SVN_ERR(dump_contents(stream, root2, path2, scratch_pool));
|
||||||
SVN_ERR(dump_contents(stream, root2, path2, pool));
|
|
||||||
|
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
@ -830,7 +829,6 @@ print_diff_tree(svn_stream_t *out_stream,
|
|||||||
const char *path /* UTF-8! */,
|
const char *path /* UTF-8! */,
|
||||||
const char *base_path /* UTF-8! */,
|
const char *base_path /* UTF-8! */,
|
||||||
const svnlook_ctxt_t *c,
|
const svnlook_ctxt_t *c,
|
||||||
const char *tmpdir,
|
|
||||||
apr_pool_t *pool)
|
apr_pool_t *pool)
|
||||||
{
|
{
|
||||||
const char *orig_path = NULL, *new_path = NULL;
|
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 is_copy = FALSE;
|
||||||
svn_boolean_t binary = FALSE;
|
svn_boolean_t binary = FALSE;
|
||||||
svn_boolean_t diff_header_printed = FALSE;
|
svn_boolean_t diff_header_printed = FALSE;
|
||||||
apr_pool_t *subpool;
|
apr_pool_t *iterpool;
|
||||||
svn_stringbuf_t *header;
|
svn_stringbuf_t *header;
|
||||||
|
|
||||||
SVN_ERR(check_cancel(NULL));
|
SVN_ERR(check_cancel(NULL));
|
||||||
@ -900,7 +898,7 @@ print_diff_tree(svn_stream_t *out_stream,
|
|||||||
do_diff = TRUE;
|
do_diff = TRUE;
|
||||||
SVN_ERR(prepare_tmpfiles(&orig_path, &new_path, &binary,
|
SVN_ERR(prepare_tmpfiles(&orig_path, &new_path, &binary,
|
||||||
base_root, base_path, root, path,
|
base_root, base_path, root, path,
|
||||||
tmpdir, pool));
|
pool, pool));
|
||||||
}
|
}
|
||||||
else if (c->diff_copy_from && node->action == 'A' && is_copy)
|
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;
|
do_diff = TRUE;
|
||||||
SVN_ERR(prepare_tmpfiles(&orig_path, &new_path, &binary,
|
SVN_ERR(prepare_tmpfiles(&orig_path, &new_path, &binary,
|
||||||
base_root, base_path, root, path,
|
base_root, base_path, root, path,
|
||||||
tmpdir, pool));
|
pool, pool));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (! c->no_diff_added && node->action == 'A')
|
else if (! c->no_diff_added && node->action == 'A')
|
||||||
@ -918,14 +916,14 @@ print_diff_tree(svn_stream_t *out_stream,
|
|||||||
orig_empty = TRUE;
|
orig_empty = TRUE;
|
||||||
SVN_ERR(prepare_tmpfiles(&orig_path, &new_path, &binary,
|
SVN_ERR(prepare_tmpfiles(&orig_path, &new_path, &binary,
|
||||||
NULL, base_path, root, path,
|
NULL, base_path, root, path,
|
||||||
tmpdir, pool));
|
pool, pool));
|
||||||
}
|
}
|
||||||
else if (! c->no_diff_deleted && node->action == 'D')
|
else if (! c->no_diff_deleted && node->action == 'D')
|
||||||
{
|
{
|
||||||
do_diff = TRUE;
|
do_diff = TRUE;
|
||||||
SVN_ERR(prepare_tmpfiles(&orig_path, &new_path, &binary,
|
SVN_ERR(prepare_tmpfiles(&orig_path, &new_path, &binary,
|
||||||
base_root, base_path, NULL, path,
|
base_root, base_path, NULL, path,
|
||||||
tmpdir, pool));
|
pool, pool));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The header for the copy case has already been created, and we don't
|
/* 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 ***/
|
/*** Now handle property diffs ***/
|
||||||
if ((node->prop_mod) && (node->action != 'D') && (! c->ignore_properties))
|
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. */
|
/* Return here if the node has no children. */
|
||||||
node = node->child;
|
if (! node->child)
|
||||||
if (! node)
|
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
|
|
||||||
/* Recursively handle the node's children. */
|
/* Recursively handle the node's children. */
|
||||||
subpool = svn_pool_create(pool);
|
iterpool = svn_pool_create(pool);
|
||||||
SVN_ERR(print_diff_tree(out_stream, encoding, root, base_root, node,
|
for (node = node->child; node; node = node->sibling)
|
||||||
svn_dirent_join(path, node->name, subpool),
|
|
||||||
svn_dirent_join(base_path, node->name, subpool),
|
|
||||||
c, tmpdir, subpool));
|
|
||||||
while (node->sibling)
|
|
||||||
{
|
{
|
||||||
svn_pool_clear(subpool);
|
svn_pool_clear(iterpool);
|
||||||
node = node->sibling;
|
|
||||||
SVN_ERR(print_diff_tree(out_stream, encoding, root, base_root, node,
|
SVN_ERR(print_diff_tree(out_stream, encoding, root, base_root, node,
|
||||||
svn_dirent_join(path, node->name, subpool),
|
svn_dirent_join(path, node->name, iterpool),
|
||||||
svn_dirent_join(base_path, node->name, subpool),
|
svn_dirent_join(base_path, node->name, iterpool),
|
||||||
c, tmpdir, subpool));
|
c, iterpool));
|
||||||
}
|
}
|
||||||
svn_pool_destroy(subpool);
|
svn_pool_destroy(iterpool);
|
||||||
|
|
||||||
return SVN_NO_ERROR;
|
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));
|
SVN_ERR(generate_delta_tree(&tree, c->repos, root, base_rev_id, pool));
|
||||||
if (tree)
|
if (tree)
|
||||||
{
|
{
|
||||||
const char *tmpdir;
|
|
||||||
svn_stream_t *out_stream;
|
svn_stream_t *out_stream;
|
||||||
const char *encoding = svn_cmdline_output_encoding(pool);
|
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_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
|
/* This fflush() might seem odd, but it was added to deal
|
||||||
with this bug report:
|
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(svn_stream_for_stdout(&out_stream, pool));
|
||||||
|
|
||||||
SVN_ERR(print_diff_tree(out_stream, encoding, root, base_root, tree,
|
SVN_ERR(print_diff_tree(out_stream, encoding, root, base_root, tree,
|
||||||
"", "", c, tmpdir, pool));
|
"", "", c, pool));
|
||||||
}
|
}
|
||||||
return SVN_NO_ERROR;
|
return SVN_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -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).
|
/* The only valid realm is user_realm (i.e. the repository's realm).
|
||||||
If the user gave us another realm, complain. */
|
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)
|
if (strncmp(pos+1, user_realm, inlen-(pos-in+1)) != 0)
|
||||||
return SASL_BADPROT;
|
return SASL_BADPROT;
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# $HeadURL: http://svn.apache.org/repos/asf/subversion/branches/1.9.x/win-tests.py $
|
# $HeadURL: http://svn.apache.org/repos/asf/subversion/branches/1.9.x/win-tests.py $
|
||||||
# $LastChangedRevision: 1703828 $
|
# $LastChangedRevision: 1718291 $
|
||||||
|
|
||||||
import os, sys, subprocess
|
import os, sys, subprocess
|
||||||
import filecmp
|
import filecmp
|
||||||
@ -226,7 +226,7 @@ def _usage_exit():
|
|||||||
enable_sasl = 1
|
enable_sasl = 1
|
||||||
base_url = "svn://localhost/"
|
base_url = "svn://localhost/"
|
||||||
elif opt == '--server-minor-version':
|
elif opt == '--server-minor-version':
|
||||||
server_minor_version = val
|
server_minor_version = int(val)
|
||||||
elif opt == '--bin':
|
elif opt == '--bin':
|
||||||
svn_bin = val
|
svn_bin = val
|
||||||
elif opt in ('-p', '--parallel'):
|
elif opt in ('-p', '--parallel'):
|
||||||
|
Loading…
Reference in New Issue
Block a user