Author: kotkov
Date: Wed Mar 22 15:08:00 2023
New Revision: 1908636
URL: http://svn.apache.org/viewvc?rev=1908636&view=rev
Log:
On the 'pristine-checksum-kind' branch: Sync with trunk@1908635.
Modified:
subversion/branches/pristine-checksum-kind/ (props changed)
subversion/branches/pristine-checksum-kind/Makefile.in
subversion/branches/pristine-checksum-kind/build.conf
subversion/branches/pristine-checksum-kind/build/ac-macros/apr_memcache.m4
subversion/branches/pristine-checksum-kind/build/ac-macros/serf.m4
subversion/branches/pristine-checksum-kind/build/ac-macros/svn-macros.m4
subversion/branches/pristine-checksum-kind/build/run_tests.py
subversion/branches/pristine-checksum-kind/configure.ac
subversion/branches/pristine-checksum-kind/subversion/include/private/svn_wc_private.h
subversion/branches/pristine-checksum-kind/subversion/include/svn_client.h
subversion/branches/pristine-checksum-kind/subversion/include/svn_config.h
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/checkout.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/client.h
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/copy.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/deprecated.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/externals.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/shelf.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/upgrade.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_fs_fs/tree.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_fs_x/ (props
changed)
subversion/branches/pristine-checksum-kind/subversion/libsvn_fs_x/tree.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_subr/config_file.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_subr/time.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/copy.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/deprecated.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/upgrade.c
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc-queries.sql
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc.h
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc_db.h
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc_db_pristine.c
subversion/branches/pristine-checksum-kind/subversion/svn/upgrade-cmd.c
subversion/branches/pristine-checksum-kind/subversion/svnserve/svnserve.c
subversion/branches/pristine-checksum-kind/subversion/tests/README
subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/checkout_tests.py
subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/externals_tests.py
subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/store_pristine_tests.py
subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/svntest/main.py
subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/upgrade_tests.py
subversion/branches/pristine-checksum-kind/subversion/tests/libsvn_client/client-test.c
subversion/branches/pristine-checksum-kind/subversion/tests/libsvn_fs/fs-test.c
subversion/branches/pristine-checksum-kind/subversion/tests/libsvn_wc/wc-queries-test.c
Propchange: subversion/branches/pristine-checksum-kind/
------------------------------------------------------------------------------
Merged /subversion/trunk:r1906817-1908635
Modified: subversion/branches/pristine-checksum-kind/Makefile.in
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/Makefile.in?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/Makefile.in (original)
+++ subversion/branches/pristine-checksum-kind/Makefile.in Wed Mar 22 15:08:00
2023
@@ -632,6 +632,12 @@ check: bin @TRANSFORM_LIBTOOL_SCRIPTS@ $
if test "$(STORE_PRISTINE)" != ""; then \
flags="--store-pristine $(STORE_PRISTINE) $$flags"; \
fi; \
+ if test "$(VALGRIND)" != ""; then \
+ flags="--valgrind $(VALGRIND) $$flags"; \
+ fi; \
+ if test "$(VALGRIND_OPTS)" != ""; then \
+ flags="--valgrind-opts $(VALGRIND_OPTS) $$flags"; \
+ fi; \
LD_LIBRARY_PATH='$(auth_plugin_dirs):$(LD_LIBRARY_PATH)' \
$(PYTHON) $(top_srcdir)/build/run_tests.py \
--config-file $(top_srcdir)/subversion/tests/tests.conf \
Modified: subversion/branches/pristine-checksum-kind/build.conf
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/build.conf?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/build.conf (original)
+++ subversion/branches/pristine-checksum-kind/build.conf Wed Mar 22 15:08:00
2023
@@ -1337,7 +1337,7 @@ msvc-force-static = yes
description = Test Sqlite query evaluation
type = exe
path = subversion/tests/libsvn_wc
-sources = wc-queries-test.c ../../libsvn_subr/sqlite3wrapper.c
+sources = wc-queries-test.c
install = test
libs = libsvn_test libsvn_wc libsvn_subr apriconv apr sqlite
Modified:
subversion/branches/pristine-checksum-kind/build/ac-macros/apr_memcache.m4
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/build/ac-macros/apr_memcache.m4?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/build/ac-macros/apr_memcache.m4
(original)
+++ subversion/branches/pristine-checksum-kind/build/ac-macros/apr_memcache.m4
Wed Mar 22 15:08:00 2023
@@ -29,7 +29,7 @@ AC_DEFUN(SVN_LIB_APR_MEMCACHE,
[
apr_memcache_found=no
- AC_ARG_WITH(apr_memcache,AC_HELP_STRING([--with-apr_memcache=PREFIX],
+ AC_ARG_WITH(apr_memcache,AS_HELP_STRING([--with-apr_memcache=PREFIX],
[Standalone apr_memcache client library]),
[
if test "$withval" = "yes" ; then
Modified: subversion/branches/pristine-checksum-kind/build/ac-macros/serf.m4
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/build/ac-macros/serf.m4?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/build/ac-macros/serf.m4
(original)
+++ subversion/branches/pristine-checksum-kind/build/ac-macros/serf.m4 Wed Mar
22 15:08:00 2023
@@ -107,10 +107,10 @@ AC_DEFUN(SVN_SERF_PREFIX_CONFIG,
save_ldflags="$LDFLAGS"
LDFLAGS="$LDFLAGS `SVN_REMOVE_STANDARD_LIB_DIRS(-L$serf_prefix/lib)`"
AC_CHECK_LIB($serf_major, serf_context_create,[
- AC_TRY_COMPILE([
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#include <stdlib.h>
#include "serf.h"
-],[
+]])],[
#if ! SERF_VERSION_AT_LEAST($serf_check_major, $serf_check_minor,
$serf_check_patch)
#error Serf version too old: need $serf_check_version
#endif
Modified:
subversion/branches/pristine-checksum-kind/build/ac-macros/svn-macros.m4
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/build/ac-macros/svn-macros.m4?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/build/ac-macros/svn-macros.m4
(original)
+++ subversion/branches/pristine-checksum-kind/build/ac-macros/svn-macros.m4
Wed Mar 22 15:08:00 2023
@@ -126,7 +126,7 @@ AC_DEFUN([SVN_REMOVE_STANDARD_LIB_DIRS],
AC_DEFUN([SVN_CHECK_FOR_ATOMIC_BUILTINS],
[
AC_CACHE_CHECK([whether the compiler provides atomic builtins],
[svn_cv_atomic_builtins],
- [AC_TRY_RUN([
+ [AC_RUN_IFELSE([AC_LANG_SOURCE([[
int main()
{
unsigned long long val = 1010, tmp, *mem = &val;
@@ -161,5 +161,5 @@ AC_DEFUN([SVN_CHECK_FOR_ATOMIC_BUILTINS]
return 1;
return 0;
- }], [svn_cv_atomic_builtins=yes], [svn_cv_atomic_builtins=no],
[svn_cv_atomic_builtins=no])])
+ }]])], [svn_cv_atomic_builtins=yes], [svn_cv_atomic_builtins=no],
[svn_cv_atomic_builtins=no])])
])
Modified: subversion/branches/pristine-checksum-kind/build/run_tests.py
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/build/run_tests.py?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/build/run_tests.py (original)
+++ subversion/branches/pristine-checksum-kind/build/run_tests.py Wed Mar 22
15:08:00 2023
@@ -266,6 +266,10 @@ class TestHarness:
cmdline.append('--parallel')
if self.opts.store_pristine is not None:
cmdline.append('--store-pristine=%s' % self.opts.store_pristine)
+ if self.opts.valgrind is not None:
+ cmdline.append('--valgrind=%s' % self.opts.valgrind)
+ if self.opts.valgrind_opts is not None:
+ cmdline.append('--valgrind-opts=%s' % self.opts.valgrind_opts)
self.c_test_cmdline = cmdline
@@ -335,6 +339,10 @@ class TestHarness:
cmdline.append('--allow-remote-http-connection')
if self.opts.store_pristine is not None:
cmdline.append('--store-pristine=%s' % self.opts.store_pristine)
+ if self.opts.valgrind is not None:
+ cmdline.append('--valgrind=%s' % self.opts.valgrind)
+ if self.opts.valgrind_opts is not None:
+ cmdline.append('--valgrind-opts=%s' % self.opts.valgrind_opts)
self.py_test_cmdline = cmdline
@@ -814,6 +822,17 @@ class TestHarness:
log.write('FAIL: %s: Unknown test failure (%s).\n'
% (progbase, test_failed))
+ def _maybe_prepend_valgrind(self, cmdline, progbase):
+ if self.opts.valgrind:
+ if (progbase in self.opts.valgrind.split(',')
+ or 'C' in self.opts.valgrind.split(',')):
+ valgrind = [os.path.join(self.builddir, 'libtool'), '--mode=execute',
+ 'valgrind', '--quiet', '--error-exitcode=1']
+ if self.opts.valgrind_opts:
+ valgrind += self.opts.valgrind_opts.split(' ')
+ cmdline = valgrind + cmdline
+ return cmdline
+
def _run_c_test(self, progabs, progdir, progbase, test_nums, dot_count):
'Run a c test, escaping parameters as required.'
if self.opts.list_tests and self.opts.milestone_filter:
@@ -849,6 +868,7 @@ class TestHarness:
self.dots_written = dots
tests_completed = 0
+ cmdline = self._maybe_prepend_valgrind(cmdline, progbase)
with Popen(cmdline, stdout=subprocess.PIPE, stderr=self.log) as prog:
line = prog.stdout.readline()
while line:
@@ -1095,6 +1115,10 @@ def create_parser():
help='Run tests that connect to remote HTTP(S) servers')
parser.add_option('--store-pristine', action='store', type='str',
help='Set the WC pristine mode')
+ parser.add_option('--valgrind', action='store',
+ help='programs to run under valgrind')
+ parser.add_option('--valgrind-opts', action='store',
+ help='options to pass valgrind')
parser.set_defaults(set_log_level=None)
return parser
Modified: subversion/branches/pristine-checksum-kind/configure.ac
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/configure.ac?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/configure.ac (original)
+++ subversion/branches/pristine-checksum-kind/configure.ac Wed Mar 22 15:08:00
2023
@@ -379,7 +379,7 @@ fi
dnl Check for doxygen
doxygen=yes
AC_ARG_WITH(doxygen,
-AC_HELP_STRING([--with-doxygen=PATH],
+AS_HELP_STRING([--with-doxygen=PATH],
[Specify the command to run doxygen]),
[
doxygen="$withval"
@@ -934,9 +934,6 @@ AC_SUBST(BDB_TEST_PROGRAMS)
dnl Check for header files ----------------
-dnl Standard C headers
-AC_HEADER_STDC
-
dnl Check for typedefs, structures, and compiler characteristics ----------
dnl if compiler doesn't understand `const', then define it empty
@@ -1249,7 +1246,7 @@ AC_SUBST(MOD_ACTIVATION)
AC_ARG_ENABLE(gcov,
-AC_HELP_STRING([--enable-gcov],
+AS_HELP_STRING([--enable-gcov],
[Turn on gcov coverage testing (GCC only).]),
[
if test "$enableval" = "yes" ; then
Modified:
subversion/branches/pristine-checksum-kind/subversion/include/private/svn_wc_private.h
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/include/private/svn_wc_private.h?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-kind/subversion/include/private/svn_wc_private.h
(original)
+++
subversion/branches/pristine-checksum-kind/subversion/include/private/svn_wc_private.h
Wed Mar 22 15:08:00 2023
@@ -2194,6 +2194,16 @@ svn_wc__format_from_version(int *format,
const svn_version_t* version,
apr_pool_t *scratch_pool);
+/* Return a string indicating the released version (or versions) of
+ * Subversion that used WC format number WC_FORMAT, or some other
+ * suitable string if no released version used WC_FORMAT.
+ *
+ * ### It's not ideal to encode this sort of knowledge in this low-level
+ * library. On the other hand, it doesn't need to be updated often and
+ * should be easily found when it does need to be updated. */
+const char *
+svn_wc__version_string_from_format(int wc_format);
+
/**
* Return true iff @a format is a supported format.
*/
@@ -2290,6 +2300,9 @@ svn_wc__ensure_adm(svn_wc_context_t *wc_
* format indicated by @a target_format. @a local_abspath should be
* an absolute path to the root of the working copy.
*
+ * If @a result_format_p is non-NULL, it will be set to the resulting
+ * format of the working copy after the upgrade.
+ *
* If @a cancel_func is non-NULL, invoke it with @a cancel_baton at
* various points during the operation. If it returns an error
* (typically #SVN_ERR_CANCELLED), return that error immediately.
@@ -2306,7 +2319,8 @@ svn_wc__ensure_adm(svn_wc_context_t *wc_
* @since New in 1.15.
*/
svn_error_t *
-svn_wc__upgrade(svn_wc_context_t *wc_ctx,
+svn_wc__upgrade(int *result_format_p,
+ svn_wc_context_t *wc_ctx,
const char *local_abspath,
int target_format,
svn_wc_upgrade_get_repos_info_t repos_info_func,
Modified:
subversion/branches/pristine-checksum-kind/subversion/include/svn_client.h
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/include/svn_client.h?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/include/svn_client.h
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/include/svn_client.h
Wed Mar 22 15:08:00 2023
@@ -1242,7 +1242,7 @@ svn_client_args_to_target_array(apr_arra
* obstructing items.
* @param[in] wc_format_version is the version number of the oldest Subversion
* client with which the created working copy should be
compatible;
- * @c NULL means the library's version.
+ * @c NULL means the default version.
* See svn_client_default_wc_version(),
* svn_client_get_wc_formats_supported().
* @param[in] store_pristine If #svn_tristate_true, the pristine contents of
@@ -1284,8 +1284,8 @@ svn_client_checkout4(svn_revnum_t *resul
apr_pool_t *pool);
/**
- * Similar to svn_client_checkout4() but always creates the newest
- * supported working copy format.
+ * Similar to svn_client_checkout4() but with @a wc_format_version set
+ * to @c NULL.
*
* @since New in 1.5.
* @deprecated Provided for backward compatibility with the 1.10 API.
@@ -4403,12 +4403,27 @@ svn_client_cleanup(const char *dir,
/**
* Recursively upgrade a working copy and nested externals working
* copies from any older format to a WC metadata storage
- * format supported by Subversion @a wc_format_version.
+ * format supported by Subversion @a target_format_version.
*
- * If @a wc_format_version is @c NULL, the library's version is used.
+ * If @a target_format_version is @c NULL, the default version is used.
+ *
+ * If the working copy already has a supported format newer than
+ * @a target_format_version, the behavior is as follows:
+ *
+ * - If @a target_format_version is @c NULL, meaning the default version
+ * should be used, the upgrade is no-op and the working copy is left
+ * at its current format.
+ *
+ * - If @a target_format_version is not @c NULL, meaning that a specific
+ * format version should be used, the upgrade results in an error.
*
* @a wcroot_dir is the path to the WC root.
*
+ * If @a result_format_version_p is not @c NULL, it will be set to the
+ * resulting format version of the upgraded working copy, allocated from
+ * @a result_pool. If this information is not required, @a result_pool
+ * may be passed as @c NULL.
+ *
* @see svn_client_default_wc_version(),
* svn_client_get_wc_formats_supported().
*
@@ -4417,14 +4432,16 @@ svn_client_cleanup(const char *dir,
* @since New in 1.15.
*/
svn_error_t *
-svn_client_upgrade2(const char *wcroot_dir,
- const svn_version_t *wc_format_version,
+svn_client_upgrade2(const svn_version_t **result_format_version_p,
+ const char *wcroot_dir,
+ const svn_version_t *target_format_version,
svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/**
- * Like svn_client_upgrade2(), but always upgrades to the newest
- * supported format.
+ * Like svn_client_upgrade2(), but with @a result_format_version_p,
+ * @a target_format_version and @a result_pool set to @c NULL.
*
* @since New in 1.7.
* @deprecated Provided for backward compatibility with the 1.14 API.
@@ -4445,13 +4462,17 @@ const svn_version_t *
svn_client_oldest_wc_version(apr_pool_t *result_pool);
/**
- * Returns the first version that supported the library's default
- * working copy metadata format.
+ * Set @a *version_p to the version of a working copy format that should
+ * be used by default for @a ctx, according to its configuration.
+ * Allocate the result in @a result_pool.
*
* @since New in 1.15.
*/
-const svn_version_t *
-svn_client_default_wc_version(apr_pool_t *result_pool);
+svn_error_t *
+svn_client_default_wc_version(const svn_version_t **version_p,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/**
* Returns the first version that supported the library's latest
Modified:
subversion/branches/pristine-checksum-kind/subversion/include/svn_config.h
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/include/svn_config.h?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/include/svn_config.h
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/include/svn_config.h
Wed Mar 22 15:08:00 2023
@@ -171,6 +171,8 @@ typedef struct svn_config_t svn_config_t
#define SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE_CLIENTS "exclusive-locking-clients"
/** @since New in 1.9. */
#define SVN_CONFIG_OPTION_SQLITE_BUSY_TIMEOUT "busy-timeout"
+/** @since New in 1.15. */
+#define SVN_CONFIG_OPTION_COMPATIBLE_VERSION "compatible-version"
/** @} */
/** @name Repository conf directory configuration files strings
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/checkout.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_client/checkout.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/checkout.c
(original)
+++
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/checkout.c
Wed Mar 22 15:08:00 2023
@@ -80,6 +80,7 @@ svn_client__checkout_internal(svn_revnum
svn_depth_t depth,
svn_boolean_t ignore_externals,
svn_boolean_t allow_unver_obstructions,
+ svn_boolean_t settings_from_context,
const svn_version_t *wc_format_version,
svn_tristate_t store_pristine,
svn_ra_session_t *ra_session,
@@ -88,6 +89,7 @@ svn_client__checkout_internal(svn_revnum
{
int target_format;
svn_boolean_t target_store_pristine;
+ svn_boolean_t fail_on_format_mismatch;
svn_node_kind_t kind;
svn_client__pathrev_t *pathrev;
svn_opt_revision_t resolved_rev = { svn_opt_revision_number };
@@ -103,26 +105,56 @@ svn_client__checkout_internal(svn_revnum
&& (revision->kind != svn_opt_revision_head))
return svn_error_create(SVN_ERR_CLIENT_BAD_REVISION, NULL, NULL);
- if (wc_format_version == NULL && store_pristine == svn_tristate_unknown)
+ if (settings_from_context)
{
SVN_ERR(svn_wc__settings_from_context(&target_format,
&target_store_pristine,
ctx->wc_ctx, local_abspath,
scratch_pool));
+ fail_on_format_mismatch = FALSE;
}
else
{
- SVN_ERR_ASSERT(wc_format_version != NULL);
+ const svn_version_t *target_format_version;
- SVN_ERR(svn_wc__format_from_version(&target_format, wc_format_version,
- scratch_pool));
-
- SVN_ERR_ASSERT(store_pristine != svn_tristate_unknown);
-
- if (store_pristine == svn_tristate_true)
+ if (store_pristine == svn_tristate_unknown)
+ target_store_pristine = TRUE;
+ else if (store_pristine == svn_tristate_true)
target_store_pristine = TRUE;
else
target_store_pristine = FALSE;
+
+ if (wc_format_version)
+ {
+ target_format_version = wc_format_version;
+ /* Fail if the existing WC's format is different than requested. */
+ fail_on_format_mismatch = TRUE;
+ }
+ else
+ {
+ /* A NULL wc_format_version translates to the minimum compatible
+ version. */
+ SVN_ERR(svn_client_default_wc_version(&target_format_version, ctx,
+ scratch_pool, scratch_pool));
+
+ if (!target_store_pristine)
+ {
+ const svn_version_t *required_version =
+
svn_client__compatible_wc_version_optional_pristine(scratch_pool);
+
+ if (!svn_version__at_least(target_format_version,
+ required_version->major,
+ required_version->minor,
+ required_version->patch))
+ target_format_version = required_version;
+ }
+
+ fail_on_format_mismatch = FALSE;
+ }
+
+ SVN_ERR(svn_wc__format_from_version(&target_format,
+ target_format_version,
+ scratch_pool));
}
/* Get the RA connection, if needed. */
@@ -221,8 +253,7 @@ svn_client__checkout_internal(svn_revnum
_("'%s' is already a working copy for a different URL"),
svn_dirent_local_style(local_abspath, scratch_pool));
- /* Warn if the existing WC's format is different than requested. */
- if (present_format != target_format)
+ if (fail_on_format_mismatch && present_format != target_format)
return svn_error_createf(
SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
_("'%s' is already a working copy for the same URL"
@@ -271,32 +302,12 @@ svn_client_checkout4(svn_revnum_t *resul
SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
- if (store_pristine == svn_tristate_unknown)
- store_pristine = svn_tristate_true;
-
- /* A NULL wc_format_version translates to the minimum compatible version. */
- if (!wc_format_version)
- {
- wc_format_version = svn_client_default_wc_version(pool);
-
- if (store_pristine == svn_tristate_false)
- {
- const svn_version_t *required_version =
- svn_client__compatible_wc_version_optional_pristine(pool);
-
- if (!svn_version__at_least(wc_format_version,
- required_version->major,
- required_version->minor,
- required_version->patch))
- wc_format_version = required_version;
- }
- }
-
err = svn_client__checkout_internal(result_rev, &sleep_here,
URL, local_abspath,
peg_revision, revision, depth,
ignore_externals,
allow_unver_obstructions,
+ FALSE, /* settings_from_context */
wc_format_version,
store_pristine,
NULL /* ra_session */,
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/client.h
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_client/client.h?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/client.h
(original)
+++
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/client.h
Wed Mar 22 15:08:00 2023
@@ -539,18 +539,20 @@ svn_client__update_internal(svn_revnum_t
the repos are tolerated; if FALSE, these obstructions cause the checkout
to fail.
- A new working copy, if needed, will be created in the format corresponding
- to the WC_FORMAT_VERSION of the client. The format of any existing working
- copy will remain unchanged.
+ If SETTINGS_FROM_CONTEXT is TRUE, the working copy settings such as
+ WC_FORMAT_VERSION and STORE_PRISTINE will be determined from context
+ (see svn_wc__settings_from_context) and the values of the corresponding
+ arguments are ignored. Otherwise, their values take effect as described
+ below:
- If STORE_PRISTINE is svn_tristate_true, the pristine contents of all
- files in the working copy will be stored on disk. If STORE_PRISTINE is
- svn_tristate_false, the pristine contents will be fetched on-demand when
- required by the operation.
+ - A new working copy, if needed, will be created in the format corresponding
+ to the WC_FORMAT_VERSION of the client. The format of any existing
+ working copy will remain unchanged.
- If WC_FORMAT_VERSION is NULL and STORE_PRISTINE is svn_tristate_unknown, the
- settings will be determined from context (see
svn_wc__settings_from_context).
- Otherwise, both WC_FORMAT_VERSION and STORE_PRISTINE must be defined.
+ - If STORE_PRISTINE is svn_tristate_true, the pristine contents of all
+ files in the working copy will be stored on disk. If STORE_PRISTINE is
+ svn_tristate_false, the pristine contents will be fetched on-demand when
+ required by the operation.
If RA_SESSION is NOT NULL, it may be used to avoid creating a new
session. The session may point to a different URL after returning.
@@ -565,6 +567,7 @@ svn_client__checkout_internal(svn_revnum
svn_depth_t depth,
svn_boolean_t ignore_externals,
svn_boolean_t allow_unver_obstructions,
+ svn_boolean_t settings_from_context,
const svn_version_t *wc_format_version,
svn_tristate_t store_pristine,
svn_ra_session_t *ra_session,
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/copy.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_client/copy.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/libsvn_client/copy.c
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/libsvn_client/copy.c
Wed Mar 22 15:08:00 2023
@@ -2487,8 +2487,8 @@ svn_client__repos_to_wc_copy_dir(svn_boo
svn_depth_infinity,
TRUE /*ignore_externals*/,
FALSE, /* we don't allow obstructions
*/
- NULL, /* default WC format */
- svn_tristate_unknown,
+ TRUE, /*settings_from_context*/
+ NULL, svn_tristate_unknown,
ra_session, ctx, scratch_pool);
ctx->notify_func2 = old_notify_func2;
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/deprecated.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_client/deprecated.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/deprecated.c
(original)
+++
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/deprecated.c
Wed Mar 22 15:08:00 2023
@@ -3287,5 +3287,6 @@ svn_client_upgrade(const char *path,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
{
- return svn_error_trace(svn_client_upgrade2(path, NULL, ctx, scratch_pool));
+ return svn_error_trace(svn_client_upgrade2(NULL, path, NULL, ctx,
+ NULL, scratch_pool));
}
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/externals.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_client/externals.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/externals.c
(original)
+++
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/externals.c
Wed Mar 22 15:08:00 2023
@@ -412,8 +412,8 @@ switch_dir_external(const char *local_ab
url, local_abspath, peg_revision,
revision, svn_depth_infinity,
FALSE, FALSE,
- NULL, /* default WC format */
- svn_tristate_unknown,
+ TRUE, /*settings_from_context*/
+ NULL, svn_tristate_unknown,
ra_session,
ctx, pool));
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/shelf.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_client/shelf.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/libsvn_client/shelf.c
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/libsvn_client/shelf.c
Wed Mar 22 15:08:00 2023
@@ -1036,8 +1036,8 @@ shelf_copy_base(svn_client__shelf_versio
svn_depth_infinity,
TRUE /*ignore_externals*/,
FALSE /*allow_unver_obstructions*/,
- NULL, /* default WC format */
- svn_tristate_unknown,
+ TRUE, /*settings_from_context*/
+ NULL, svn_tristate_unknown,
ra_session,
ctx, scratch_pool));
/* ### hopefully we won't eventually need to sleep_here... */
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/upgrade.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_client/upgrade.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/upgrade.c
(original)
+++
subversion/branches/pristine-checksum-kind/subversion/libsvn_client/upgrade.c
Wed Mar 22 15:08:00 2023
@@ -36,11 +36,13 @@
#include "svn_pools.h"
#include "svn_props.h"
#include "svn_version.h"
+#include "svn_hash.h"
#include "client.h"
#include "svn_private_config.h"
#include "private/svn_wc_private.h"
+#include "private/svn_subr_private.h"
#include "../libsvn_wc/wc.h"
@@ -97,8 +99,9 @@ upgrade_externals_from_properties(svn_cl
apr_pool_t *scratch_pool);
static svn_error_t *
-upgrade_internal(const char *path,
- int wc_format,
+upgrade_internal(int *result_format_p,
+ const char *path,
+ int target_format,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
{
@@ -116,7 +119,8 @@ upgrade_internal(const char *path,
_("'%s' is not a local path"), path);
SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, scratch_pool));
- SVN_ERR(svn_wc__upgrade(ctx->wc_ctx, local_abspath, wc_format,
+ SVN_ERR(svn_wc__upgrade(result_format_p, ctx->wc_ctx,
+ local_abspath, target_format,
fetch_repos_info, &info_baton,
ctx->cancel_func, ctx->cancel_baton,
ctx->notify_func2, ctx->notify_baton2,
@@ -154,8 +158,9 @@ upgrade_internal(const char *path,
if (kind == svn_node_dir)
{
- svn_error_t *err = upgrade_internal(ext_abspath, wc_format,
- ctx, iterpool);
+ svn_error_t *err = upgrade_internal(NULL, ext_abspath,
+ target_format, ctx,
+ iterpool);
if (err)
{
@@ -179,8 +184,9 @@ upgrade_internal(const char *path,
/* Upgrading from <= 1.6, or no svn:properties defined.
(There is no way to detect the difference from libsvn_client :( ) */
- SVN_ERR(upgrade_externals_from_properties(ctx, local_abspath, wc_format,
- &info_baton, scratch_pool));
+ SVN_ERR(upgrade_externals_from_properties(ctx, local_abspath,
+ target_format, &info_baton,
+ scratch_pool));
}
SVN_ERR(svn_client__textbase_sync(NULL, local_abspath, FALSE, TRUE, ctx,
@@ -190,17 +196,54 @@ upgrade_internal(const char *path,
}
svn_error_t *
-svn_client_upgrade2(const char *path,
- const svn_version_t *wc_format_version,
+svn_client_upgrade2(const svn_version_t **result_format_version_p,
+ const char *path,
+ const svn_version_t *target_format_version,
svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- int wc_format;
+ int result_format;
+ int target_format;
+ svn_boolean_t fail_on_downgrade;
+
+ if (target_format_version)
+ {
+ SVN_ERR(svn_wc__format_from_version(&target_format,
+ target_format_version,
+ scratch_pool));
+ /* Fail on downgrade attempts if format version was passed explicitly. */
+ fail_on_downgrade = TRUE;
+ }
+ else
+ {
+ const svn_version_t *default_version;
+
+ SVN_ERR(svn_client_default_wc_version(&default_version, ctx,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__format_from_version(&target_format, default_version,
+ scratch_pool));
+ fail_on_downgrade = FALSE;
+ }
+
+ SVN_ERR(upgrade_internal(&result_format, path, target_format,
+ ctx, scratch_pool));
+
+ if (fail_on_downgrade && result_format > target_format)
+ return svn_error_createf(SVN_ERR_WC_UNSUPPORTED_FORMAT, NULL,
+ _("Working copy '%s' is already at version %s "
+ "(format %d) and cannot be downgraded to "
+ "version %s (format %d)"),
+ svn_dirent_local_style(path, scratch_pool),
+ svn_wc__version_string_from_format(result_format),
+ result_format,
+ svn_wc__version_string_from_format(target_format),
+ target_format);
+
+ if (result_format_version_p)
+ *result_format_version_p = svn_client_wc_version_from_format(
+ result_format, result_pool);
- SVN_ERR(svn_wc__format_from_version(&wc_format,
- wc_format_version,
- scratch_pool));
- SVN_ERR(upgrade_internal(path, wc_format, ctx, scratch_pool));
return SVN_NO_ERROR;
}
@@ -251,13 +294,42 @@ svn_client_oldest_wc_version(apr_pool_t
return &version;
}
-const svn_version_t *
-svn_client_default_wc_version(apr_pool_t *result_pool)
-{
- /* NOTE: For consistency, always return the version of the client
- that first introduced the format. */
- static const svn_version_t version = { 1, 8, 0, NULL };
- return &version;
+svn_error_t *
+svn_client_default_wc_version(const svn_version_t **version_p,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ svn_config_t *config;
+ const char *value;
+ svn_version_t *version;
+
+ if (ctx->config)
+ config = svn_hash_gets(ctx->config, SVN_CONFIG_CATEGORY_CONFIG);
+ else
+ config = NULL;
+
+ svn_config_get(config, &value,
+ SVN_CONFIG_SECTION_WORKING_COPY,
+ SVN_CONFIG_OPTION_COMPATIBLE_VERSION,
+ NULL);
+ if (value)
+ {
+ SVN_ERR(svn_version__parse_version_string(&version, value, result_pool));
+ }
+ else
+ {
+ /* NOTE: For consistency, always return the version of the client
+ that first introduced the format. */
+ version = apr_pcalloc(result_pool, sizeof(*version));
+ version->major = 1;
+ version->minor = 8;
+ version->patch = 0;
+ version->tag = NULL;
+ }
+
+ *version_p = version;
+ return SVN_NO_ERROR;
}
const svn_version_t *
@@ -325,7 +397,8 @@ upgrade_external_item(svn_client_ctx_t *
{
svn_error_clear(err);
- SVN_ERR(upgrade_internal(external_abspath, wc_format, ctx,
scratch_pool));
+ SVN_ERR(upgrade_internal(NULL, external_abspath, wc_format, ctx,
+ scratch_pool));
}
else if (err)
return svn_error_trace(err);
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_fs_fs/tree.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_fs_fs/tree.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/libsvn_fs_fs/tree.c
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/libsvn_fs_fs/tree.c
Wed Mar 22 15:08:00 2023
@@ -1977,7 +1977,30 @@ merge(svn_stringbuf_t *conflict_p,
different contents. */
SVN_ERR(svn_fs_fs__prop_rep_equal(&same, fs, src_nr, anc_nr, pool));
if (! same)
- return conflict_err(conflict_p, target_path);
+ {
+ apr_hash_t *proplist;
+
+ /* There is a prop difference between source and ancestor, if
+ there is no property difference between target and ancestor
+ then this txn didn't change props and we can simply update
+ target to match source.
+
+ Commit calls merge in a loop until it manages to get the
+ write lock with source=head. Copying the properties like
+ this will only work on the first iteration as later
+ iterations will see tgt.prop!=anc.prop and won't know that
+ the txn did not change properties. This means we
+ successfully handle a race between this txn and a
+ propchange txn while building this txn, but we don't handle
+ a race that occurs after the first iteration of the merge
+ loop -- we will raise an unwanted conflict. */
+ SVN_ERR(svn_fs_fs__prop_rep_equal(&same, fs, tgt_nr, anc_nr, pool));
+ if (! same)
+ return conflict_err(conflict_p, target_path);
+
+ SVN_ERR(svn_fs_fs__dag_get_proplist(&proplist, source, pool));
+ SVN_ERR(svn_fs_fs__dag_set_proplist(target, proplist, pool));
+ }
/* The directory entries got changed in the repository but the directory
properties did not. */
Propchange: subversion/branches/pristine-checksum-kind/subversion/libsvn_fs_x/
------------------------------------------------------------------------------
Merged /subversion/trunk/subversion/libsvn_fs_x:r1906817-1908635
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_fs_x/tree.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_fs_x/tree.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/libsvn_fs_x/tree.c
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/libsvn_fs_x/tree.c
Wed Mar 22 15:08:00 2023
@@ -890,7 +890,32 @@ merge(svn_stringbuf_t *conflict_p,
different contents. */
SVN_ERR(svn_fs_x__prop_rep_equal(&same, fs, src_nr, anc_nr, TRUE, pool));
if (! same)
- return conflict_err(conflict_p, target_path);
+ {
+ apr_hash_t *proplist;
+
+ /* There is a prop difference between source and ancestor, if
+ there is no property difference between target and ancestor
+ then this txn didn't change props and we can simply update
+ target to match source.
+
+ Commit calls merge in a loop until it manages to get the
+ write lock with source=head. Copying the properties like
+ this will only work on the first iteration as later
+ iterations will see tgt.prop!=anc.prop and won't know that
+ the txn did not change properties. This means we
+ successfully handle a race between this txn and a
+ propchange txn while building this txn, but we don't handle
+ a race that occurs after the first iteration of the merge
+ loop -- we will raise an unwanted conflict. */
+ SVN_ERR(svn_fs_x__prop_rep_equal(&same, fs, tgt_nr, anc_nr,
+ TRUE, pool));
+ if (! same)
+ return conflict_err(conflict_p, target_path);
+
+ SVN_ERR(svn_fs_x__dag_get_proplist(&proplist, source, pool, pool));
+ SVN_ERR(svn_fs_x__dag_set_proplist(target, proplist, pool));
+ }
+
/* The directory entries got changed in the repository but the directory
properties did not. */
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_subr/config_file.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_subr/config_file.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-kind/subversion/libsvn_subr/config_file.c
(original)
+++
subversion/branches/pristine-checksum-kind/subversion/libsvn_subr/config_file.c
Wed Mar 22 15:08:00 2023
@@ -1553,6 +1553,10 @@ svn_config_ensure(const char *config_dir
"### returning an error. The default is 10000, i.e. 10 seconds." NL
"### Longer values may be useful when exclusive locking is enabled." NL
"# busy-timeout = 10000" NL
+ "### Set the default working copy format version. Newly created" NL
+ "### and upgraded working copies will by default be compatible with" NL
+ "### the specified Subversion version." NL
+ "# compatible-version = 1.8" NL
;
err = svn_io_file_open(&f, path,
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_subr/time.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_subr/time.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/libsvn_subr/time.c
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/libsvn_subr/time.c
Wed Mar 22 15:08:00 2023
@@ -124,7 +124,7 @@ find_matching_string(char *str, apr_size
apr_size_t i;
for (i = 0; i < size; i++)
- if (strings[i] && (strcmp(str, strings[i]) == 0))
+ if (strcmp(str, strings[i]) == 0)
return (apr_int32_t) i;
return -1;
Modified: subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/copy.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/copy.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/copy.c
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/copy.c Wed
Mar 22 15:08:00 2023
@@ -215,6 +215,8 @@ copy_to_tmpdir(svn_skel_t **work_item,
If IS_MOVE is true, record move information in working copy meta
data in addition to copying the file.
+ WITHIN_ONE_WC is TRUE if the copy/move is within a single working copy
(root)
+
If the versioned file has a text conflict, and the .mine file exists in
the filesystem, copy the .mine file to DST_ABSPATH. Otherwise, copy the
versioned file itself.
@@ -237,6 +239,7 @@ copy_versioned_file(svn_wc__db_t *db,
svn_boolean_t metadata_only,
svn_boolean_t conflicted,
svn_boolean_t is_move,
+ svn_boolean_t within_one_wc,
const svn_io_dirent2_t *dirent,
svn_filesize_t recorded_size,
apr_time_t recorded_time,
@@ -248,8 +251,45 @@ copy_versioned_file(svn_wc__db_t *db,
{
svn_skel_t *work_items = NULL;
- /* In case we are copying from one WC to another (e.g. an external dir),
- ensure the destination WC has a copy of the pristine text. */
+ if (within_one_wc)
+ {
+ /* In case we are copying within one WC, it already has the pristine. */
+ }
+ else
+ {
+ /* In case we are copying from one WC to another (e.g. an external dir),
+ ensure the destination WC has a copy of the pristine text. */
+
+ svn_stream_t *contents;
+
+ SVN_ERR(svn_wc__textbase_get_contents(&contents, db, src_abspath, NULL,
+ TRUE, scratch_pool, scratch_pool));
+ if (contents)
+ {
+ svn_stream_t *install_stream;
+ svn_wc__db_install_data_t *install_data;
+ svn_checksum_t *install_checksum;
+ svn_checksum_t *install_md5_checksum;
+ svn_error_t *err;
+
+ SVN_ERR(svn_wc__textbase_prepare_install(&install_stream,
+ &install_data,
+ &install_checksum,
+ &install_md5_checksum,
+ db, dst_abspath, FALSE,
+ scratch_pool,
scratch_pool));
+
+ err = svn_stream_copy3(contents, install_stream, NULL, NULL,
scratch_pool);
+ if (err)
+ return svn_error_compose_create(err,
+ svn_wc__db_pristine_install_abort(install_data,
scratch_pool));
+
+ SVN_ERR(svn_wc__db_pristine_install(install_data,
+ install_checksum,
+ install_md5_checksum,
+ scratch_pool));
+ }
+ }
/* Prepare a temp copy of the filesystem node. It is usually a file, but
copy recursively if it's a dir. */
@@ -349,6 +389,7 @@ copy_versioned_dir(svn_wc__db_t *db,
const char *tmpdir_abspath,
svn_boolean_t metadata_only,
svn_boolean_t is_move,
+ svn_boolean_t within_one_wc,
const svn_io_dirent2_t *dirent,
svn_cancel_func_t cancel_func,
void *cancel_baton,
@@ -454,7 +495,7 @@ copy_versioned_dir(svn_wc__db_t *db,
dst_op_root_abspath,
tmpdir_abspath,
metadata_only, info->conflicted,
- is_move,
+ is_move, within_one_wc,
disk_children
? svn_hash_gets(disk_children,
child_name)
@@ -469,7 +510,7 @@ copy_versioned_dir(svn_wc__db_t *db,
SVN_ERR(copy_versioned_dir(db,
child_src_abspath, child_dst_abspath,
dst_op_root_abspath, tmpdir_abspath,
- metadata_only, is_move,
+ metadata_only, is_move, within_one_wc,
disk_children
? svn_hash_gets(disk_children,
child_name)
@@ -839,17 +880,12 @@ copy_or_move(svn_boolean_t *record_move_
is_move = FALSE;
}
- if (!within_one_wc)
- SVN_ERR(svn_wc__db_pristine_transfer(db, src_abspath, dst_wcroot_abspath,
- cancel_func, cancel_baton,
- scratch_pool));
-
if (src_db_kind == svn_node_file
|| src_db_kind == svn_node_symlink)
{
err = copy_versioned_file(db, src_abspath, dst_abspath, dst_abspath,
- tmpdir_abspath,
- metadata_only, conflicted, is_move,
+ tmpdir_abspath, metadata_only, conflicted,
+ is_move, within_one_wc,
NULL, recorded_size, recorded_time,
cancel_func, cancel_baton,
notify_func, notify_baton,
@@ -888,7 +924,7 @@ copy_or_move(svn_boolean_t *record_move_
err = copy_versioned_dir(db, src_abspath, dst_abspath, dst_abspath,
tmpdir_abspath, metadata_only, is_move,
- NULL /* dirent */,
+ within_one_wc, NULL /* dirent */,
cancel_func, cancel_baton,
notify_func, notify_baton,
scratch_pool);
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/deprecated.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/deprecated.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/deprecated.c
(original)
+++
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/deprecated.c
Wed Mar 22 15:08:00 2023
@@ -5179,7 +5179,8 @@ svn_wc_upgrade(svn_wc_context_t *wc_ctx,
void *notify_baton,
apr_pool_t *scratch_pool)
{
- return svn_wc__upgrade(wc_ctx, local_abspath, SVN_WC__DEFAULT_VERSION,
+ return svn_wc__upgrade(NULL, wc_ctx, local_abspath,
+ SVN_WC__DEFAULT_VERSION,
repos_info_func, repos_info_baton,
cancel_func, cancel_baton,
notify_func, notify_baton,
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/upgrade.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/upgrade.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/upgrade.c
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/upgrade.c
Wed Mar 22 15:08:00 2023
@@ -1774,18 +1774,6 @@ svn_wc__upgrade_sdb(int *result_format,
scratch_pool),
start_format);
- if (start_format > target_format)
- return svn_error_createf(SVN_ERR_WC_UNSUPPORTED_FORMAT, NULL,
- _("Working copy '%s' is already at version %s "
- "(format %d) and cannot be downgraded to "
- "version %s (format %d)"),
- svn_dirent_local_style(wcroot_abspath,
- scratch_pool),
- svn_wc__version_string_from_format(start_format),
- start_format,
- svn_wc__version_string_from_format(target_format),
- target_format);
-
if (target_format < SVN_WC__SUPPORTED_VERSION)
return svn_error_createf(SVN_ERR_WC_UNSUPPORTED_FORMAT, NULL,
_("Working copy version %s (format %d) "
@@ -1811,17 +1799,6 @@ svn_wc__upgrade_sdb(int *result_format,
svn_wc__db_install_schema_statistics(sdb, scratch_pool),
sdb);
-#ifdef SVN_DEBUG
- if (*result_format != start_format)
- {
- int schema_version;
- SVN_ERR(svn_sqlite__read_schema_version(&schema_version, sdb,
scratch_pool));
-
- /* If this assertion fails the schema isn't updated correctly */
- SVN_ERR_ASSERT(schema_version == *result_format);
- }
-#endif
-
/* Zap anything that might be remaining or escaped our notice. */
wipe_obsolete_files(wcroot_abspath, scratch_pool);
@@ -1865,7 +1842,6 @@ svn_wc__update_schema(int *result_format
#undef UPDATE_TO_FORMAT
}
- SVN_ERR_ASSERT(*result_format == target_format);
return SVN_NO_ERROR;
}
@@ -2033,7 +2009,8 @@ is_old_wcroot(const char *local_abspath,
}
svn_error_t *
-svn_wc__upgrade(svn_wc_context_t *wc_ctx,
+svn_wc__upgrade(int *result_format_p,
+ svn_wc_context_t *wc_ctx,
const char *local_abspath,
int target_format,
svn_wc_upgrade_get_repos_info_t repos_info_func,
@@ -2082,8 +2059,6 @@ svn_wc__upgrade(svn_wc_context_t *wc_ctx
/* Auto-upgrade worked! */
SVN_ERR(svn_wc__db_close(db));
- SVN_ERR_ASSERT(result_format == target_format);
-
if (bumped_format && notify_func)
{
svn_wc_notify_t *notify;
@@ -2095,6 +2070,8 @@ svn_wc__upgrade(svn_wc_context_t *wc_ctx
notify_func(notify_baton, notify, scratch_pool);
}
+ if (result_format_p)
+ *result_format_p = result_format;
return SVN_NO_ERROR;
}
@@ -2193,6 +2170,8 @@ svn_wc__upgrade(svn_wc_context_t *wc_ctx
SVN_ERR(svn_io_remove_dir2(data.root_abspath, FALSE, NULL, NULL,
scratch_pool));
+ if (result_format_p)
+ *result_format_p = target_format;
return SVN_NO_ERROR;
}
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc-queries.sql
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc-queries.sql?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc-queries.sql
(original)
+++
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc-queries.sql
Wed Mar 22 15:08:00 2023
@@ -925,44 +925,6 @@ WHERE refcount = 0
DELETE FROM pristine
WHERE checksum = ?1 AND refcount = 0
--- STMT_SELECT_COPY_PRISTINES_F31
-/* For the root itself */
-SELECT n.checksum, md5_checksum, size, 1
-FROM nodes_current n
-LEFT JOIN pristine p ON n.checksum = p.checksum
-WHERE wc_id = ?1
- AND n.local_relpath = ?2
- AND n.checksum IS NOT NULL
-UNION ALL
-/* And all descendants */
-SELECT n.checksum, md5_checksum, size, 1
-FROM nodes n
-LEFT JOIN pristine p ON n.checksum = p.checksum
-WHERE wc_id = ?1
- AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
- AND op_depth >=
- (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2)
- AND n.checksum IS NOT NULL
-
--- STMT_SELECT_COPY_PRISTINES_F32
-/* For the root itself */
-SELECT n.checksum, md5_checksum, size, p.hydrated
-FROM nodes_current n
-LEFT JOIN pristine p ON n.checksum = p.checksum
-WHERE wc_id = ?1
- AND n.local_relpath = ?2
- AND n.checksum IS NOT NULL
-UNION ALL
-/* And all descendants */
-SELECT n.checksum, md5_checksum, size, p.hydrated
-FROM nodes n
-LEFT JOIN pristine p ON n.checksum = p.checksum
-WHERE wc_id = ?1
- AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)
- AND op_depth >=
- (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2)
- AND n.checksum IS NOT NULL
-
-- STMT_UPDATE_PRISTINE_HYDRATED
UPDATE pristine SET hydrated = ?2
WHERE checksum = ?1
Modified: subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc.h
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc.h?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc.h
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc.h Wed
Mar 22 15:08:00 2023
@@ -236,16 +236,6 @@ extern "C" {
checksum kind. */
#define SVN_WC__HAS_PRISTINE_CHECKSUM_SHA1_SALTED 33
-/* Return a string indicating the released version (or versions) of
- * Subversion that used WC format number WC_FORMAT, or some other
- * suitable string if no released version used WC_FORMAT.
- *
- * ### It's not ideal to encode this sort of knowledge in this low-level
- * library. On the other hand, it doesn't need to be updated often and
- * should be easily found when it does need to be updated. */
-const char *
-svn_wc__version_string_from_format(int wc_format);
-
/* Return true iff error E indicates an "is not a working copy" type
of error, either because something wasn't a working copy at all, or
because it's a working copy from a previous version (in need of
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc_db.h
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc_db.h?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc_db.h
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc_db.h Wed
Mar 22 15:08:00 2023
@@ -1043,16 +1043,6 @@ svn_wc__db_pristine_lookup_by_md5(const
apr_pool_t *scratch_pool);
-/* If necessary transfers the PRISTINE files of the tree rooted at
- SRC_LOCAL_ABSPATH to the working copy identified by DST_WRI_ABSPATH. */
-svn_error_t *
-svn_wc__db_pristine_transfer(svn_wc__db_t *db,
- const char *src_local_abspath,
- const char *dst_wri_abspath,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool);
-
/* Remove the pristine text with checksum CHECKSUM from the
* pristine store, iff it is not referenced by any of the (other) WC DB
* tables. */
Modified:
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc_db_pristine.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc_db_pristine.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc_db_pristine.c
(original)
+++
subversion/branches/pristine-checksum-kind/subversion/libsvn_wc/wc_db_pristine.c
Wed Mar 22 15:08:00 2023
@@ -598,197 +598,6 @@ svn_wc__db_pristine_lookup_by_md5(const
return svn_error_trace(svn_sqlite__reset(stmt));
}
-/* Handle the moving of a pristine from SRC_WCROOT to DST_WCROOT. The existing
- pristine in SRC_WCROOT is described by CHECKSUM, MD5_CHECKSUM, SIZE and
- HYDRATED. */
-static svn_error_t *
-maybe_transfer_one_pristine(svn_wc__db_wcroot_t *src_wcroot,
- svn_wc__db_wcroot_t *dst_wcroot,
- const svn_checksum_t *checksum,
- const svn_checksum_t *md5_checksum,
- apr_int64_t size,
- svn_boolean_t hydrated,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
-{
- int stmt_num;
- svn_sqlite__stmt_t *stmt;
- int affected_rows;
-
- stmt_num = (dst_wcroot->format >= SVN_WC__HAS_OPTIONAL_PRISTINE
- ? STMT_INSERT_OR_IGNORE_PRISTINE_F32
- : STMT_INSERT_OR_IGNORE_PRISTINE_F31);
- SVN_ERR(svn_sqlite__get_statement(&stmt, dst_wcroot->sdb, stmt_num));
- SVN_ERR(svn_sqlite__bind_checksum(stmt, 1, checksum, scratch_pool));
- SVN_ERR(svn_sqlite__bind_checksum(stmt, 2, md5_checksum, scratch_pool));
- SVN_ERR(svn_sqlite__bind_int64(stmt, 3, size));
- if (dst_wcroot->format >= SVN_WC__HAS_OPTIONAL_PRISTINE)
- SVN_ERR(svn_sqlite__bind_int(stmt, 4, hydrated));
-
- SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
-
- if (affected_rows == 0)
- return SVN_NO_ERROR;
-
- if (hydrated)
- {
- const char *pristine_abspath;
- svn_stream_t *src_stream;
- svn_stream_t *dst_stream;
- const char *tmp_abspath;
- const char *src_abspath;
- svn_error_t *err;
-
- SVN_ERR(svn_stream_open_unique(&dst_stream, &tmp_abspath,
- pristine_get_tempdir(dst_wcroot,
- scratch_pool,
- scratch_pool),
- svn_io_file_del_on_pool_cleanup,
- scratch_pool, scratch_pool));
-
- SVN_ERR(get_pristine_fname(&src_abspath, src_wcroot->abspath, checksum,
- scratch_pool, scratch_pool));
-
- SVN_ERR(svn_stream_open_readonly(&src_stream, src_abspath,
- scratch_pool, scratch_pool));
-
- /* ### Should we verify the checksum here, or is that too expensive? */
- SVN_ERR(svn_stream_copy3(src_stream, dst_stream,
- cancel_func, cancel_baton,
- scratch_pool));
-
- SVN_ERR(get_pristine_fname(&pristine_abspath, dst_wcroot->abspath,
checksum,
- scratch_pool, scratch_pool));
-
- /* Move the file to its target location. (If it is already there, it is
- * an orphan file and it doesn't matter if we overwrite it.) */
- err = svn_io_file_rename2(tmp_abspath, pristine_abspath, FALSE,
- scratch_pool);
-
- /* Maybe the directory doesn't exist yet? */
- if (err && APR_STATUS_IS_ENOENT(err->apr_err))
- {
- svn_error_t *err2;
-
- err2 = svn_io_dir_make(svn_dirent_dirname(pristine_abspath,
- scratch_pool),
- APR_OS_DEFAULT, scratch_pool);
-
- if (err2)
- /* Creating directory didn't work: Return all errors */
- return svn_error_trace(svn_error_compose_create(err, err2));
- else
- /* We could create a directory: retry install */
- svn_error_clear(err);
-
- SVN_ERR(svn_io_file_rename2(tmp_abspath, pristine_abspath, FALSE,
- scratch_pool));
- }
- else
- SVN_ERR(err);
- }
-
- return SVN_NO_ERROR;
-}
-
-/* Transaction implementation of svn_wc__db_pristine_transfer().
- We have a lock on DST_WCROOT.
- */
-static svn_error_t *
-pristine_transfer_txn(svn_wc__db_wcroot_t *src_wcroot,
- svn_wc__db_wcroot_t *dst_wcroot,
- const char *src_relpath,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
-{
- int stmt_num;
- svn_sqlite__stmt_t *stmt;
- svn_boolean_t got_row;
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
-
- stmt_num = (dst_wcroot->format >= SVN_WC__HAS_OPTIONAL_PRISTINE
- ? STMT_SELECT_COPY_PRISTINES_F32
- : STMT_SELECT_COPY_PRISTINES_F31);
- SVN_ERR(svn_sqlite__get_statement(&stmt, src_wcroot->sdb, stmt_num));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", src_wcroot->wc_id, src_relpath));
-
- /* This obtains an sqlite read lock on src_wcroot */
- SVN_ERR(svn_sqlite__step(&got_row, stmt));
-
- while (got_row)
- {
- const svn_checksum_t *checksum;
- const svn_checksum_t *md5_checksum;
- apr_int64_t size;
- svn_boolean_t hydrated;
- svn_error_t *err;
-
- svn_pool_clear(iterpool);
-
- SVN_ERR(svn_sqlite__column_checksum(&checksum, stmt, 0, iterpool));
- SVN_ERR(svn_sqlite__column_checksum(&md5_checksum, stmt, 1, iterpool));
- size = svn_sqlite__column_int64(stmt, 2);
- hydrated = svn_sqlite__column_boolean(stmt, 3);
-
- err = maybe_transfer_one_pristine(src_wcroot, dst_wcroot,
- checksum, md5_checksum, size,
- hydrated,
- cancel_func, cancel_baton,
- iterpool);
-
- if (err)
- return svn_error_trace(svn_error_compose_create(
- err,
- svn_sqlite__reset(stmt)));
-
- SVN_ERR(svn_sqlite__step(&got_row, stmt));
- }
- SVN_ERR(svn_sqlite__reset(stmt));
-
- svn_pool_destroy(iterpool);
-
- return SVN_NO_ERROR;
-}
-
-svn_error_t *
-svn_wc__db_pristine_transfer(svn_wc__db_t *db,
- const char *src_local_abspath,
- const char *dst_wri_abspath,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *scratch_pool)
-{
- svn_wc__db_wcroot_t *src_wcroot, *dst_wcroot;
- const char *src_relpath, *dst_relpath;
-
- SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&src_wcroot, &src_relpath,
- db, src_local_abspath,
- scratch_pool, scratch_pool));
- VERIFY_USABLE_WCROOT(src_wcroot);
- SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&dst_wcroot, &dst_relpath,
- db, dst_wri_abspath,
- scratch_pool, scratch_pool));
- VERIFY_USABLE_WCROOT(dst_wcroot);
-
- if (src_wcroot == dst_wcroot
- || src_wcroot->sdb == dst_wcroot->sdb)
- {
- return SVN_NO_ERROR; /* Nothing to transfer */
- }
-
- SVN_WC__DB_WITH_TXN(
- pristine_transfer_txn(src_wcroot, dst_wcroot, src_relpath,
- cancel_func, cancel_baton, scratch_pool),
- dst_wcroot);
-
- return SVN_NO_ERROR;
-}
-
-
-
-
/* If the pristine text referenced by CHECKSUM in WCROOT/SDB, whose path
* within the pristine store is PRISTINE_ABSPATH, has a reference count of
* zero, delete it (both the database row and the disk file).
Modified:
subversion/branches/pristine-checksum-kind/subversion/svn/upgrade-cmd.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/svn/upgrade-cmd.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/svn/upgrade-cmd.c
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/svn/upgrade-cmd.c Wed
Mar 22 15:08:00 2023
@@ -52,10 +52,9 @@ svn_cl__upgrade(apr_getopt_t *os,
apr_array_header_t *targets;
apr_pool_t *iterpool;
int i;
- const svn_version_t *default_version
- = svn_client_default_wc_version(scratch_pool);
- const svn_version_t *latest_version
- = svn_client_latest_wc_version(scratch_pool);
+ const svn_version_t *latest_version;
+
+ latest_version = svn_client_latest_wc_version(scratch_pool);
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
opt_state->targets,
@@ -73,31 +72,34 @@ svn_cl__upgrade(apr_getopt_t *os,
for (i = 0; i < targets->nelts; i++)
{
const char *target = APR_ARRAY_IDX(targets, i, const char *);
+ const svn_version_t *result_format_version;
svn_pool_clear(iterpool);
SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton));
- SVN_ERR(svn_client_upgrade2(target,
+ SVN_ERR(svn_client_upgrade2(&result_format_version, target,
opt_state->compatible_version,
- ctx, scratch_pool));
- }
- svn_pool_destroy(iterpool);
+ ctx, iterpool, iterpool));
- /* Remind the user they can upgrade further if:
- * - the user did not specify compatible-version explicitly
- * - a higher version is available. */
- if (! opt_state->compatible_version
- && ! svn_version__at_least(default_version,
- latest_version->major, latest_version->minor,
0)
- && ! opt_state->quiet)
- {
- const char *msg
- = _("svn: The target working copies are already at version %d.%d; "
- "the highest version supported by this client can be "
- "specified with '--compatible-version=%d.%d'.\n");
- SVN_ERR(svn_cmdline_printf(scratch_pool, msg,
- default_version->major,
default_version->minor,
- latest_version->major,
latest_version->minor));
+ /* Remind the user they can upgrade further if:
+ * - the user did not specify compatible-version explicitly
+ * - a higher version is available. */
+ if (! opt_state->compatible_version
+ && ! svn_version__at_least(result_format_version,
+ latest_version->major,
+ latest_version->minor, 0)
+ && ! opt_state->quiet)
+ {
+ SVN_ERR(svn_cmdline_printf(
+ iterpool,
+ _("svn: The target working copy '%s' is at version %d.%d; "
+ "the highest version supported by this client can be "
+ "specified with '--compatible-version=%d.%d'.\n"),
+ svn_dirent_local_style(target, iterpool),
+ result_format_version->major, result_format_version->minor,
+ latest_version->major, latest_version->minor));
+ }
}
+ svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
}
Modified:
subversion/branches/pristine-checksum-kind/subversion/svnserve/svnserve.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/svnserve/svnserve.c?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/svnserve/svnserve.c
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/svnserve/svnserve.c
Wed Mar 22 15:08:00 2023
@@ -492,6 +492,15 @@ static void sigchld_handler(int signo)
}
#endif
+#ifdef APR_HAVE_SIGACTION
+static svn_atomic_t sigtermint_seen = 0;
+static void
+sigtermint_handler(int signo)
+{
+ svn_atomic_set(&sigtermint_seen, 1);
+}
+#endif /* APR_HAVE_SIGACTION */
+
/* Redirect stdout to stderr. ARG is the pool.
*
* In tunnel or inetd mode, we don't want hook scripts corrupting the
@@ -547,6 +556,10 @@ accept_connection(connection_t **connect
status = apr_socket_accept(&(*connection)->usock, sock,
connection_pool);
+#if APR_HAVE_SIGACTION
+ if (sigtermint_seen)
+ break;
+#endif
if (handling_mode == connection_mode_fork)
{
apr_proc_t proc;
@@ -1330,11 +1343,20 @@ sub_main(int *exit_code, int argc, const
}
#endif
+#if APR_HAVE_SIGACTION
+ apr_signal(SIGTERM, sigtermint_handler);
+ apr_signal(SIGINT, sigtermint_handler);
+#endif
+
while (1)
{
connection_t *connection = NULL;
SVN_ERR(accept_connection(&connection, sock, ¶ms, handling_mode,
pool));
+#if APR_HAVE_SIGACTION
+ if (sigtermint_seen)
+ break;
+#endif
if (run_mode == run_mode_listen_once)
{
err = serve_socket(connection, connection->pool);
@@ -1391,7 +1413,7 @@ sub_main(int *exit_code, int argc, const
close_connection(connection);
}
- /* NOTREACHED */
+ return SVN_NO_ERROR;
}
int
Modified: subversion/branches/pristine-checksum-kind/subversion/tests/README
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/tests/README?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-kind/subversion/tests/README
(original)
+++ subversion/branches/pristine-checksum-kind/subversion/tests/README Wed Mar
22 15:08:00 2023
@@ -261,6 +261,72 @@ Testing Over DAV
Please see subversion/tests/cmdline/README for how to run the
command-line client test suite against a remote repository.
+
+Testing with valgrind
+---------------------
+
+The test suite has support for valgrind. For this to be useful
+Subversion must be compiled with pool debugging enabled by
+adding -DAPR_POOL_DEBUG to CFLAGS. It is sufficient to compile
+just Subversion with pool debugging but compiling apr, apr-util
+and serf will cause more of the code to be checked.
+
+Valgrind can be used on the C test programs, and/or on svn,
+svnlook, svnadmin, etc. invoked during the python tests. To test
+the C programs use:
+
+ make check VALGRIND=C
+
+To test svn during the python tests use:
+
+ make check SKIP_C_TESTS=1 VALGRIND=svn
+
+To test svnlook during the python tests use:
+
+ make check VALGRIND=svnlook TESTS=subversion/tests/cmdline/svnlook_tests.py
+
+The VALGRIND settings can be combined:
+
+ make check PARALLEL=1 VALGRIND=C,svn,svnlook
+
+Any valgrind error causes diagnostic output on stderr but the program
+will continue to run. For the C tests valgrind is invoked with the
+option --error-exitcode=1 so that the although the individual
+tests within each C test program may PASS the test as a whole will
+FAIL. For the python tests the test harness parses stderr and detects
+the valgrind diagnostic, so individual tests will FAIL. In both cases
+the stderr diagnostic output from valgrind is available in tests.log.
+
+If valgind is producing unwanted diagnostics in some of the system
+libraries then create a suppression file and pass it as:
+
+ make check VALGRIND=svn VALGRIND_OPTS=--suppressions=$PWD/vg.supp
+
+Running valgrind in the testsuite will only check the client-side code.
+To check the server-side code invoke the server using valgrind and
+arrange for it to remain in the foreground so valgrind output will
+appear on stderr in the terminal. For svnserve something like:
+
+ ./libtool --mode=execute valgrind \
+ subversion/svnserve/svnserve -Tdr subversion/tests/cmdline --foreground
+ make check BASE_URL=svn://localhost # in another terminal
+
+For apache use a threaded MPM and then something like:
+
+ valgrind httpd -X -f /path/to/cfg
+ make check BASE_URL=http://localhost:8888 # in another terminal
+
+Note that using valgrind will make the testsuite much slower; expect more
+than an order of magnitude slowdown if using valgrind on svn during the
+python tests. Using the ASAN/MSAN/LSAN sanitizers in gcc/clang is an
+alternative; they will catch similar types of bugs and are much faster.
+The sanitizers also benefit from pool debugging.
+
+Debian's 1:3.19.0-1 version of valgrind seems to have a problem with
+the Dwarf 5 debugging info produced by Debian's compilers, so compile
+with -gdwarf-4 if using -g.
+
+
Conclusion
----------
Modified:
subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/checkout_tests.py
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/checkout_tests.py?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/checkout_tests.py
(original)
+++
subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/checkout_tests.py
Wed Mar 22 15:08:00 2023
@@ -1185,6 +1185,67 @@ def checkout_wc_from_drive(sbox):
# cleanup the virtual drive
subprocess.call(['subst', '/D', drive +':'])
+def checkout_compatible_version_arg(sbox):
+ "checkout with compatible-version from arg"
+
+ sbox.build(empty=True, create_wc=False)
+ expected_output = svntest.wc.State(sbox.wc_dir, {})
+ expected_disk = svntest.wc.State('', {})
+ svntest.actions.run_and_verify_checkout(
+ sbox.repo_url, sbox.wc_dir, expected_output, expected_disk, [],
+ '--compatible-version', '1.15')
+
+ svntest.actions.run_and_verify_svn(
+ ['1.15'], [],
+ 'info', '--show-item=wc-compatible-version', '--no-newline',
+ sbox.wc_dir)
+
+def checkout_compatible_version_config(sbox):
+ "checkout with compatible-version from config"
+
+ sbox.build(empty=True, create_wc=False)
+ expected_output = svntest.wc.State(sbox.wc_dir, {})
+ expected_disk = svntest.wc.State('', {})
+ svntest.actions.run_and_verify_checkout(
+ sbox.repo_url, sbox.wc_dir, expected_output, expected_disk, [],
+ '--config-option', 'config:working-copy:compatible-version=1.15')
+
+ svntest.actions.run_and_verify_svn(
+ ['1.15'], [],
+ 'info', '--show-item=wc-compatible-version', '--no-newline',
+ sbox.wc_dir)
+
+def checkout_over_existing_wc_same_url(sbox):
+ "checkout over existing wc with same URL"
+
+ sbox.build(empty=True, create_wc=False)
+ expected_output = svntest.wc.State(sbox.wc_dir, {})
+ expected_disk = svntest.wc.State('', {})
+
+ svntest.actions.run_and_verify_checkout(
+ sbox.repo_url, sbox.wc_dir, expected_output, expected_disk, [],
+ '--compatible-version=1.15', '--store-pristine=yes')
+ svntest.actions.run_and_verify_svn(
+ ['1.15'], [],
+ 'info', '--show-item=wc-compatible-version', '--no-newline',
+ sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(
+ ['yes'], [],
+ 'info', '--show-item=store-pristine', '--no-newline',
+ sbox.wc_dir)
+
+ svntest.actions.run_and_verify_checkout(
+ sbox.repo_url, sbox.wc_dir, expected_output, expected_disk, [],
+ '--store-pristine=yes')
+ svntest.actions.run_and_verify_svn(
+ ['1.15'], [],
+ 'info', '--show-item=wc-compatible-version', '--no-newline',
+ sbox.wc_dir)
+ svntest.actions.run_and_verify_svn(
+ ['yes'], [],
+ 'info', '--show-item=store-pristine', '--no-newline',
+ sbox.wc_dir)
+
#----------------------------------------------------------------------
# list all tests here, starting with None:
@@ -1202,7 +1263,10 @@ test_list = [ None,
checkout_peg_rev,
checkout_peg_rev_date,
co_with_obstructing_local_adds,
- checkout_wc_from_drive
+ checkout_wc_from_drive,
+ checkout_compatible_version_arg,
+ checkout_compatible_version_config,
+ checkout_over_existing_wc_same_url
]
if __name__ == "__main__":
Modified:
subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/externals_tests.py
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/externals_tests.py?rev=1908636&r1=1908635&r2=1908636&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/externals_tests.py
(original)
+++
subversion/branches/pristine-checksum-kind/subversion/tests/cmdline/externals_tests.py
Wed Mar 22 15:08:00 2023
@@ -3431,7 +3431,6 @@ def update_deletes_file_external(sbox):
@Issue(4519)
-@Wimp("May trigger an existing issue, see
upgrade_tests.py:upgrade_latest_format()")
def switch_relative_externals(sbox):
"switch relative externals"