Modified: subversion/branches/addremove/build/generator/gen_win_dependencies.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/build/generator/gen_win_dependencies.py?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/build/generator/gen_win_dependencies.py 
(original)
+++ subversion/branches/addremove/build/generator/gen_win_dependencies.py Sat 
May 23 14:16:56 2020
@@ -32,6 +32,7 @@ import fnmatch
 import re
 import subprocess
 import string
+from collections import namedtuple
 
 if sys.version_info[0] >= 3:
   # Python >=3.0
@@ -46,6 +47,8 @@ else:
 import gen_base
 import ezt
 
+UserMacro = namedtuple('UserMacro', ['name', 'value'])
+
 class SVNCommonLibrary:
 
   def __init__(self, name, include_dirs, lib_dir, lib_name, version=None,
@@ -117,6 +120,7 @@ class GenDependenciesBase(gen_base.Gener
         'swig',
         'perl',
         'python',
+        'py3c',
         'ruby',
         'java_sdk',
         'openssl',
@@ -124,6 +128,8 @@ class GenDependenciesBase(gen_base.Gener
 
         # So optional, we don't even have any code to detect them on Windows
         'magic',
+        'macos-plist',
+        'macos-keychain',
   ]
 
   # When build.conf contains a 'when = SOMETHING' where SOMETHING is not in
@@ -146,6 +152,7 @@ class GenDependenciesBase(gen_base.Gener
     self.jdk_path = None
     self.junit_path = None
     self.swig_path = None
+    self.py3c_path = None
     self.vs_version = '2002'
     self.sln_version = '7.00'
     self.vcproj_version = '7.00'
@@ -165,6 +172,7 @@ class GenDependenciesBase(gen_base.Gener
     self.instrument_purify_quantify = None
     self.sasl_path = None
     self.cpp_defines = []
+    self.user_macros = []
 
     # NLS options
     self.enable_nls = None
@@ -196,6 +204,8 @@ class GenDependenciesBase(gen_base.Gener
         self.zlib_path = val
       elif opt == '--with-swig':
         self.swig_path = val
+      elif opt == '--with-py3c':
+        self.py3c_path = val
       elif opt == '--with-sqlite':
         self.sqlite_path = val
       elif opt == '--with-sasl':
@@ -265,6 +275,11 @@ class GenDependenciesBase(gen_base.Gener
           self.sln_version = '12.00'
           self.vcproj_version = '14.1'
           self.vcproj_extension = '.vcxproj'
+        elif val == '2019' or val == '16':
+          self.vs_version = '2019'
+          self.sln_version = '12.00'
+          self.vcproj_version = '14.2'
+          self.vcproj_extension = '.vcxproj'
         elif re.match('^20\d+$', val):
           print('WARNING: Unknown VS.NET version "%s",'
                 ' assuming VS2012. Your VS can probably upgrade')
@@ -322,13 +337,15 @@ class GenDependenciesBase(gen_base.Gener
     # Swig (optional) dependencies
     if self._find_swig(show_warnings):
       self._find_perl(show_warnings)
-      self._find_python(show_warnings)
+      # py3c is required to build python bindings, show check it first
+      if self._find_py3c(show_warnings):
+        self._find_python(show_warnings)
       self._find_ruby(show_warnings)
 
   def _find_apr(self):
     "Find the APR library and version"
 
-    minimal_apr_version = (1, 3, 0)
+    minimal_apr_version = (1, 5, 0)
 
     if not self.apr_path:
       sys.stderr.write("ERROR: Use '--with-apr' option to configure APR " + \
@@ -763,7 +780,7 @@ class GenDependenciesBase(gen_base.Gener
 
     if self.bdb_path:
       bdb_path = self.bdb_path
-    
+
     inc_path = os.path.join(bdb_path, 'include')
     db_h_path = os.path.join(inc_path, 'db.h')
 
@@ -1020,9 +1037,64 @@ class GenDependenciesBase(gen_base.Gener
     except ImportError:
       return
 
+    if sys.version_info[0] >= 3:
+      if self.swig_version < (3, 0, 10):
+        if show_warnings:
+          print("WARNING: Subversion Python bindings for Python 3 require SWIG 
3.0.10 or newer")
+        return
+      if self.swig_version < (4, 0, 0):
+        opts = "-python -py3 -nofastunpack -modern"
+      else:
+        opts = "-python -py3 -nofastunpack"
+    else:
+      if not ((1, 3, 24) <= self.swig_version < (4, 0, 0)):
+        if show_warnings:
+          print("WARNING: Subversion Python bindings for Python 2 require 
1.3.24 <= SWIG < 4.0.0")
+        return
+      opts = "-python -classic"
+
+    self.user_macros.append(UserMacro("SWIG_PY_OPTS", opts))
     self._libraries['python'] = SVNCommonLibrary('python', inc_dir, lib_dir, 
None,
                                                  sys.version.split(' ')[0])
 
+  def _find_py3c(self, show_warnings):
+    "Find the py3c library which is used in SWIG python bindings"
+    show_warnings = True
+    # Assume a default path, unless otherwise specified
+    py3c_path = "py3c"
+
+    if self.py3c_path:
+      py3c_path = self.py3c_path
+
+    py3c_path = os.path.abspath(py3c_path)
+    inc_path = os.path.join(py3c_path, 'include')
+    py3c_hdr_path = os.path.join(inc_path, 'py3c.h')
+
+    pc_path = os.path.join(py3c_path, 'py3c.pc.in')
+
+    if not os.path.isfile(py3c_hdr_path):
+      if show_warnings:
+        print('WARNING: "%s" not found' % py3c_hdr_path)
+        print('Use "--with-py3c" to configure py3c location.')
+      return False
+
+    with open(pc_path) as fp:
+      txt = fp.read()
+
+    ver_match = re.search(r'Version:\s+([0-9.]+)', txt)
+
+    if not ver_match:
+      if show_warnings:
+        print("WARNING: Failed to find version in '%s'" % pc_path)
+      return False
+
+    py3c_version = ver_match.group(1)
+
+    self._libraries['py3c'] = SVNCommonLibrary('py3c', inc_path, None,
+                                               None, py3c_version)
+
+    return True
+
   def _find_jdk(self, show_warnings):
     "Find details about an installed jdk"
 
@@ -1067,11 +1139,15 @@ class GenDependenciesBase(gen_base.Gener
       return
 
     try:
-      outfp = subprocess.Popen([os.path.join(jdk_path, 'bin', 'javah.exe'),
-                               '-version'], stdout=subprocess.PIPE).stdout
-      line = outfp.read()
+      # Apparently a 1.8 javac writes its version output to stderr, while
+      # a 1.10 javac writes it to stdout. To catch them all, we redirect
+      # stderr to stdout.
+      outfp = subprocess.Popen([os.path.join(jdk_path, 'bin', 'javac.exe'),
+                               '-version'], stdout=subprocess.PIPE,
+                               stderr=subprocess.STDOUT).stdout
+      line = outfp.read().decode('utf8')
       if line:
-        vermatch = re.search(r'"(([0-9]+(\.[0-9]+)+)(_[._0-9]+)?)"', line, 
re.M)
+        vermatch = re.search(r'(([0-9]+(\.[0-9]+)+)(_[._0-9]+)?)', line, re.M)
       else:
         vermatch = None
 
@@ -1127,7 +1203,7 @@ class GenDependenciesBase(gen_base.Gener
     try:
       fp = subprocess.Popen([self.swig_exe, '-version'],
                             stdout=subprocess.PIPE).stdout
-      txt = fp.read()
+      txt = fp.read().decode('utf8')
       if txt:
         vermatch = re.search(r'^SWIG\ Version\ (\d+)\.(\d+)\.(\d+)', txt, re.M)
       else:
@@ -1155,7 +1231,7 @@ class GenDependenciesBase(gen_base.Gener
     try:
       fp = subprocess.Popen([self.swig_exe, '-swiglib'],
                             stdout=subprocess.PIPE).stdout
-      lib_dir = fp.readline().strip()
+      lib_dir = fp.readline().decode('utf8').strip()
       fp.close()
     except OSError:
       lib_dir = None
@@ -1383,7 +1459,7 @@ class GenDependenciesBase(gen_base.Gener
   def _find_sqlite(self, show_warnings):
     "Find the Sqlite library and version"
 
-    minimal_sqlite_version = (3, 7, 12)
+    minimal_sqlite_version = (3, 8, 2)
 
     # For SQLite we support 3 scenarios:
     # - Installed in standard directory layout

Modified: subversion/branches/addremove/build/generator/swig/__init__.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/build/generator/swig/__init__.py?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/build/generator/swig/__init__.py (original)
+++ subversion/branches/addremove/build/generator/swig/__init__.py Sat May 23 
14:16:56 2020
@@ -25,7 +25,7 @@
 import os
 import re
 import shutil
-import generator.util.executable as _exec
+import subprocess
 from generator.gen_base import _collect_paths
 try:
   # Python >=3.0
@@ -59,14 +59,19 @@ class Generator:
 
     # Calculate SWIG paths
     self.swig_path = swig_path
-    self.swig_libdir = _exec.output([self.swig_path, "-swiglib"], strip=1)
+    if os.access(self.swig_path, os.X_OK):
+      # ### TODO: What's the reason for this os.access() check?  It was added
+      # ### in r873265 (== r33191).
+      self.swig_libdir = subprocess.check_output([self.swig_path, 
"-swiglib"]).decode('utf8').strip()
+    else:
+      self.swig_libdir = None
 
   _swigVersion = None
   def version(self):
     """Get the version number of SWIG"""
 
     if not self._swigVersion:
-      swig_version = _exec.output([self.swig_path, "-version"])
+      swig_version = subprocess.check_output([self.swig_path, 
"-version"]).decode('utf8')
       m = re.search("Version (\d+).(\d+).(\d+)", swig_version)
       if m:
         self._swigVersion = tuple(map(int, m.groups()))

Modified: 
subversion/branches/addremove/build/generator/swig/checkout_swig_header.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/build/generator/swig/checkout_swig_header.py?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/build/generator/swig/checkout_swig_header.py 
(original)
+++ subversion/branches/addremove/build/generator/swig/checkout_swig_header.py 
Sat May 23 14:16:56 2020
@@ -23,13 +23,12 @@
 # Checkout files from the SWIG library into Subversion's proxy directory
 #
 
-import sys, os, re, fileinput, shutil
+import sys, os, re, fileinput, shutil, subprocess
 if __name__ == "__main__":
   parent_dir = os.path.dirname(os.path.abspath(os.path.dirname(sys.argv[0])))
   sys.path[0:0] = [ parent_dir, os.path.dirname(parent_dir) ]
 import generator.swig
 from gen_base import build_path_splitfile, build_path_join
-from generator.util.executable import run
 
 class Generator(generator.swig.Generator):
 
@@ -63,7 +62,7 @@ class Generator(generator.swig.Generator
     elif self.version() == (1, 3, 24):
       shutil.copy(build_path_join(self.swig_libdir, path), out)
     else:
-      run("%s -o %s -co %s" % (self.swig_path, out, path))
+      subprocess.check_call([self.swig_path, "-o", out, "-co", path])
 
   def _skip_checkout(self, path):
     """Should we skip this checkout?"""

Modified: subversion/branches/addremove/build/generator/swig/external_runtime.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/build/generator/swig/external_runtime.py?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/build/generator/swig/external_runtime.py 
(original)
+++ subversion/branches/addremove/build/generator/swig/external_runtime.py Sat 
May 23 14:16:56 2020
@@ -29,13 +29,12 @@ import os
 import re
 import fileinput
 import filecmp
+import subprocess
 
 if __name__ == "__main__":
   parent_dir = os.path.dirname(os.path.abspath(os.path.dirname(sys.argv[0])))
   sys.path[0:0] = [ parent_dir, os.path.dirname(parent_dir) ]
 import generator.swig
-import generator.util.executable
-_exec = generator.util.executable
 
 class Generator(generator.swig.Generator):
   """Generate external runtime files for SWIG"""
@@ -82,7 +81,7 @@ class Generator(generator.swig.Generator
         out_file.write(open("%s/runtime.swg" % self.proxy_dir).read())
       out_file.close()
     else:
-      _exec.run("%s -%s -external-runtime %s" % (self.swig_path, lang, out))
+      subprocess.check_call([self.swig_path, "-"+lang, "-external-runtime", 
out])
 
     # SWIG 1.3.24-27 should include rubyhead.swg in their
     # external runtime, but they don't.

Modified: subversion/branches/addremove/build/generator/swig/header_wrappers.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/build/generator/swig/header_wrappers.py?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/build/generator/swig/header_wrappers.py 
(original)
+++ subversion/branches/addremove/build/generator/swig/header_wrappers.py Sat 
May 23 14:16:56 2020
@@ -265,7 +265,13 @@ class Generator(generator.swig.Generator
       self.proxy_filename(base_fname))
 
     # Open a temporary output file
-    self.ofile = tempfile.TemporaryFile(dir=self.proxy_dir)
+    if sys.version_info[0] >= 3:
+      self.ofile = tempfile.TemporaryFile(dir=self.proxy_dir,
+                                          mode="w+",
+                                          encoding="utf8")
+    else:
+      self.ofile = tempfile.TemporaryFile(dir=self.proxy_dir)
+
     self.ofile.write('/* Proxy classes for %s\n' % base_fname)
     self.ofile.write(' * DO NOT EDIT -- AUTOMATICALLY GENERATED\n')
     self.ofile.write(' * BY build/generator/swig/header_wrappers.py */\n')

Modified: 
subversion/branches/addremove/build/generator/templates/build-outputs.mk.ezt
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/build/generator/templates/build-outputs.mk.ezt?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- 
subversion/branches/addremove/build/generator/templates/build-outputs.mk.ezt 
(original)
+++ 
subversion/branches/addremove/build/generator/templates/build-outputs.mk.ezt 
Sat May 23 14:16:56 2020
@@ -70,8 +70,18 @@ RELEASE_MODE = 1
 # Section 3: SWIG autogen rules
 ########################################
 [for swig_langs]
-autogen-swig-[swig_langs.short]:[for swig_langs.deps] [swig_langs.deps][end]
+.swig_[swig_langs.short]_checked:
+       @if [ -n "$(SWIG_[swig_langs.short_upper]_ERRMSG)" ]; then \
+         echo "SWIG [swig_langs.name] disabled at configure time: 
$(SWIG_[swig_langs.short_upper]_ERRMSG)" >&2; \
+         exit 1; \
+       fi
+       @touch $@
+
+autogen-swig-[swig_langs.short]: .swig_[swig_langs.short]_checked [for 
swig_langs.deps] [swig_langs.deps][end]
 autogen-swig: autogen-swig-[swig_langs.short]
+
+# Ensure the swig build targets depend on the configuration check
+swig-[swig_langs.short]: .swig_[swig_langs.short]_checked
 [end]
 
 
@@ -102,13 +112,9 @@ install-[target.install]: [target.instal
 [target.varname]_OBJECTS = [for target.objects][if-index target.objects 
first][else] [end][target.objects][end]
 [target.varname]_DEPS = $([target.varname]_HEADERS) 
$([target.varname]_OBJECTS)[for target.add_deps] [target.add_deps][end][for 
target.deps][if-index target.deps first][else] [end][target.deps][end]
 [target.name]: $([target.varname]_DEPS)
-[if-any target.headers][target.varname]_CLASS_FILENAMES =[for 
target.header_class_filenames] [target.header_class_filenames][end]
-[target.varname]_CLASSES =[for target.header_classes] 
[target.header_classes][end]
-$([target.varname]_HEADERS): $([target.varname]_CLASS_FILENAMES)
-       [target.link_cmd] -d [target.output_dir] -classpath 
[target.classes]:$([target.varname]_CLASSPATH) $([target.varname]_CLASSES)
-[end][if-any target.sources][target.varname]_SRC =[for target.sources] 
[target.sources][end]
-$([target.varname]_OBJECTS): $([target.varname]_SRC)
-       [target.link_cmd] -d [target.output_dir] -classpath 
[target.classes]:$([target.varname]_CLASSPATH) $([target.varname]_SRC)
+[if-any target.sources][target.varname]_SRC =[for target.sources] 
[target.sources][end]
+$([target.varname]_HEADERS) $([target.varname]_OBJECTS): 
$([target.varname]_SRC)
+       [target.link_cmd][if-any target.headers] -h [target.headers_dir][end] 
-d [target.output_dir] -classpath 
[target.classes]:$([target.varname]_CLASSPATH) $([target.varname]_SRC)
 [if-any target.jar]
        $(JAR) cf [target.jar_path] -C [target.classes][for target.packages] 
[target.packages][end][end][end]
 [else][is target.type "i18n"][target.varname]_DEPS =[for target.add_deps] 
[target.add_deps][end][for target.objects] [target.objects][end][for 
target.deps] [target.deps][end]

Modified: 
subversion/branches/addremove/build/generator/templates/pkg-config.in.ezt
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/build/generator/templates/pkg-config.in.ezt?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/build/generator/templates/pkg-config.in.ezt 
(original)
+++ subversion/branches/addremove/build/generator/templates/pkg-config.in.ezt 
Sat May 23 14:16:56 2020
@@ -6,7 +6,7 @@ includedir=@includedir@
 Name: [lib_name]
 Description: [lib_desc]
 Version: @PACKAGE_VERSION@
-Requires: [for lib_required] [lib_required][end]
-Requires.private: [for lib_required_private] [lib_required_private][end]
+Requires: [for lib_required][if-index lib_required first][else], 
[end][lib_required][end]
+Requires.private: [for lib_required_private][if-index lib_required_private 
first][else], [end][lib_required_private][end]
 Libs: -L${libdir} [for lib_deps] [lib_deps][end]
-Cflags: -I${includedir}
+Cflags: -I${includedir}/subversion-[version]

Modified: 
subversion/branches/addremove/build/generator/templates/vcnet_vcproj.ezt
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/build/generator/templates/vcnet_vcproj.ezt?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/build/generator/templates/vcnet_vcproj.ezt 
(original)
+++ subversion/branches/addremove/build/generator/templates/vcnet_vcproj.ezt 
Sat May 23 14:16:56 2020
@@ -33,6 +33,7 @@
                        
OutputDirectory="..\..\..\[configs.name]\[target.output_dir]"
                        BuildLogFile="$(IntDir)\BuildLog_$(ProjectName).htm"
                        
IntermediateDirectory="..\..\..\[configs.name]\[target.intermediate_dir]\[target.proj_name]"
+                       InheritedPropertySheets=".\[target.proj_name].vsprops"
                        ConfigurationType="[target_type]"[is configs.name 
"Release"]
                        WholeProgramOptimization="FALSE"[end]>
                        <Tool
@@ -59,7 +60,7 @@
                                
DisableSpecificWarnings="4100;4127;4206;4512;4701;4706;4800"
                                Detect64BitPortabilityProblems="FALSE"
                                AdditionalOptions="
-                               /we4002 /we4003 /we4013 /we4020 /we4022 /we4024 
/we4028 /we4029 /we4030 /we4031 /we4033 /we4047 /we4089 /we4113 /we4115 /we4204 
/we4715"
+                               /we4002 /we4003 /we4013 /we4020 /we4022 /we4024 
/we4028 /we4029 /we4030 /we4031 /we4033 /we4047 /we4089 /we4113 /we4204 /we4715"
                                DebugInformationFormat="3"
                                
ProgramDataBaseFileName="$(IntDir)\[target.output_pdb]"
                                [if-any 
configs.forced_include_files]ForcedIncludeFiles="[for 
configs.forced_include_files][configs.forced_include_files][if-index 
configs.forced_include_files last][else];[end][end]"

Modified: 
subversion/branches/addremove/build/generator/templates/vcnet_vcxproj.ezt
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/build/generator/templates/vcnet_vcxproj.ezt?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/build/generator/templates/vcnet_vcxproj.ezt 
(original)
+++ subversion/branches/addremove/build/generator/templates/vcnet_vcxproj.ezt 
Sat May 23 14:16:56 2020
@@ -43,7 +43,9 @@
 [for platforms][for configs]  <ImportGroup Label="PropertySheets" 
Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'">
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" 
Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" 
Label="LocalAppDataPlatform" />
   </ImportGroup>
-[end][end]  <PropertyGroup Label="UserMacros" />
+[end][end]  <PropertyGroup Label="UserMacros">
+[for user_macros]    
<[user_macros.name]>[user_macros.value]</[user_macros.name]>
+[end]  </PropertyGroup>
 [for platforms][for configs]  <PropertyGroup 
Condition="'$(Configuration)|$(Platform)'=='[configs.name]|[platforms]'">
     <OutDir>$(SolutionDir)[configs.name]\[target.output_dir]\</OutDir>
     
<IntDir>$(SolutionDir)[configs.name]\obj\[target.intermediate_dir]\[target.proj_name]\</IntDir>
@@ -62,9 +64,8 @@
       <PreprocessorDefinitions>[if-any 
instrument_apr_pools]APR_POOL_DEBUG=[instrument_apr_pools];[end][is platforms 
"x64"]WIN64;[end][for 
configs.defines][configs.defines];[end]%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <WarningLevel>Level4</WarningLevel>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      
<ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>
       
<DisableSpecificWarnings>4100;4127;4206;4512;4701;4706;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
-      
<TreatSpecificWarningsAsErrors>4002;4003;4013;4020;4022;4024;4028;4029;4030;4031;4033;4047;4089;4113;4115;4133;4204;4700;4715;4789;%(TreatSpecificWarningsAsErrors)</TreatSpecificWarningsAsErrors>
+      
<TreatSpecificWarningsAsErrors>4002;4003;4013;4020;4022;4024;4028;4029;4030;4031;4033;4047;4089;4113;4133;4204;4700;4715;4789;%(TreatSpecificWarningsAsErrors)</TreatSpecificWarningsAsErrors>
 [if-any configs.forced_include_files]      <ForcedIncludeFiles>[for 
configs.forced_include_files][configs.forced_include_files];[end]%(ForcedIncludeFiles)</ForcedIncludeFiles>
 [end]    </ClCompile>
     <ResourceCompile>

Modified: subversion/branches/addremove/build/get-py-info.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/build/get-py-info.py?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/build/get-py-info.py (original)
+++ subversion/branches/addremove/build/get-py-info.py Sat May 23 14:16:56 2020
@@ -81,20 +81,8 @@ def link_options():
   # Initialize config variables
   assert os.name == "posix"
   options = sysconfig.get_config_var('LDSHARED').split()
-  fwdir = sysconfig.get_config_var('PYTHONFRAMEWORKDIR')
 
-  if fwdir and fwdir != "no-framework":
-
-    # Setup the framework prefix
-    fwprefix = sysconfig.get_config_var('PYTHONFRAMEWORKPREFIX')
-    if fwprefix != "/System/Library/Frameworks":
-      add_option_if_missing(options, "-F%s" % fwprefix)
-
-    # Load in the framework
-    fw = sysconfig.get_config_var('PYTHONFRAMEWORK')
-    add_option(options, "-framework", fw)
-
-  elif sys.platform == 'darwin':
+  if sys.platform == 'darwin':
 
     # Load bundles from python
     python_exe = os.path.join(sysconfig.get_config_var("BINDIR"),

Modified: subversion/branches/addremove/build/run_tests.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/build/run_tests.py?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/build/run_tests.py (original)
+++ subversion/branches/addremove/build/run_tests.py Sat May 23 14:16:56 2020
@@ -24,7 +24,7 @@
 #
 
 '''usage: python run_tests.py
-            [--verbose] [--log-to-stdout] [--cleanup]
+            [--verbose] [--log-to-stdout] [--cleanup] [--bin=<path>]
             [--parallel | --parallel=<n>] [--global-scheduler]
             [--url=<base-url>] [--http-library=<http-library>] [--enable-sasl]
             [--fs-type=<fs-type>] [--fsfs-packing] [--fsfs-sharding=<n>]
@@ -34,6 +34,7 @@
             [--config-file=<file>] [--ssl-cert=<file>]
             [--exclusive-wc-locks] [--memcached-server=<url:port>]
             [--fsfs-compression=<type>] [--fsfs-dir-deltification=<true|false>]
+            [--allow-remote-http-connection]
             <abs_srcdir> <abs_builddir>
             <prog ...>
 
@@ -49,7 +50,7 @@ separated list of test numbers; the defa
 import os, sys, shutil, codecs
 import re
 import logging
-import optparse, subprocess, imp, threading, traceback
+import optparse, subprocess, threading, traceback
 from datetime import datetime
 
 try:
@@ -63,6 +64,13 @@ if sys.version_info < (3, 0):
   # Python >= 3.0 already has this build in
   import exceptions
 
+if sys.version_info < (3, 5):
+  import imp
+else:
+  # The imp module is deprecated since Python 3.4; the replacement we use,
+  # module_from_spec(), is available since Python 3.5.
+  import importlib.util
+
 # Ensure the compiled C tests use a known locale (Python tests set the locale
 # explicitly).
 os.environ['LC_ALL'] = 'C'
@@ -280,6 +288,8 @@ class TestHarness:
       cmdline.append('--fsfs-compression=%s' % self.opts.fsfs_compression)
     if self.opts.fsfs_dir_deltification is not None:
       cmdline.append('--fsfs-dir-deltification=%s' % 
self.opts.fsfs_dir_deltification)
+    if self.opts.allow_remote_http_connection is not None:
+      cmdline.append('--allow-remote-http-connection')
 
     self.py_test_cmdline = cmdline
 
@@ -327,7 +337,7 @@ class TestHarness:
     def _command_line(self, harness):
       if self.is_python:
         cmdline = list(harness.py_test_cmdline)
-        cmdline.insert(0, 'python')
+        cmdline.insert(0, sys.executable)
         cmdline.insert(1, self.progabs)
         # Run the test apps in "child process" mode,
         # i.e. w/o cleaning up global directories etc.
@@ -375,12 +385,12 @@ class TestHarness:
 
     def _count_py_tests(self, progabs, progdir, progbase):
       'Run a c test, escaping parameters as required.'
-      cmdline = [ 'python', progabs, '--list' ]
+      cmdline = [ sys.executable, progabs, '--list' ]
       prog = subprocess.Popen(cmdline, stdout=subprocess.PIPE, cwd=progdir)
       lines = prog.stdout.readlines()
 
       for i in range(0, len(lines) - 2):
-        self.result.append(TestHarness.Job(i + 1, True, progabs, 
+        self.result.append(TestHarness.Job(i + 1, True, progabs,
                                            progdir, progbase))
       prog.wait()
 
@@ -448,6 +458,7 @@ class TestHarness:
     job_queue = queue.Queue()
     total_count = 0
     scrambled = list(jobs)
+    # TODO: What's this line doing, and what's the magic number?
     scrambled.sort(key=lambda x: ("1" if x.test_count() < 30 else "0") + 
str(x.number))
     for job in scrambled:
       total_count += job.test_count()
@@ -709,9 +720,11 @@ class TestHarness:
 
     # Summary.
     if failed or xpassed or failed_list:
-      print("SUMMARY: Some tests failed.\n")
+      summary = "Some tests failed"
     else:
-      print("SUMMARY: All tests successful.\n")
+      summary = "All tests successful"
+    print("Python version: %d.%d.%d." % sys.version_info[:3])
+    print("SUMMARY: %s\n" % summary)
 
     self._close_log()
     return failed
@@ -815,10 +828,15 @@ class TestHarness:
       if sys.version_info < (3, 0):
         prog_mod = imp.load_module(progbase[:-3], open(progabs, 'r'), progabs,
                                    ('.py', 'U', imp.PY_SOURCE))
-      else:
+      elif sys.version_info < (3, 5):
         prog_mod = imp.load_module(progbase[:-3],
                                    open(progabs, 'r', encoding="utf-8"),
                                    progabs, ('.py', 'U', imp.PY_SOURCE))
+      else:
+         spec = importlib.util.spec_from_file_location(progbase[:-3], progabs)
+         prog_mod = importlib.util.module_from_spec(spec)
+         sys.modules[progbase[:-3]] = prog_mod
+         spec.loader.exec_module(prog_mod)
     except:
       print("\nError loading test (details in following traceback): " + 
progbase)
       traceback.print_exc()
@@ -1032,6 +1050,8 @@ def create_parser():
                     help='Set compression type (for fsfs)')
   parser.add_option('--fsfs-dir-deltification', action='store', type='str',
                     help='Set directory deltification option (for fsfs)')
+  parser.add_option('--allow-remote-http-connection', action='store_true',
+                    help='Run tests that connect to remote HTTP(S) servers')
 
   parser.set_defaults(set_log_level=None)
   return parser

Modified: subversion/branches/addremove/build/transform_sql.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/build/transform_sql.py?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/build/transform_sql.py (original)
+++ subversion/branches/addremove/build/transform_sql.py Sat May 23 14:16:56 
2020
@@ -274,7 +274,7 @@ def main(input_filepath, output):
     '/* This file is automatically generated from %s and %s.\n'
     ' * Do not edit this file -- edit the source and rerun gen-make.py */\n'
     '\n'
-    % (filename, token_map_filename))
+    % (filename, os.path.basename(token_map_filename)))
 
   proc = Processor(os.path.dirname(input_filepath), output, var_name, 
token_map)
   proc.process_file(input)

Modified: subversion/branches/addremove/configure.ac
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/configure.ac?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/configure.ac (original)
+++ subversion/branches/addremove/configure.ac Sat May 23 14:16:56 2020
@@ -23,7 +23,7 @@ AC_PREREQ(2.59)
 dnl Get the version of Subversion, using m4's esyscmd() command to do this
 dnl at m4-time, since AC_INIT() requires it then.
 AC_INIT([subversion],
-     [esyscmd(python build/getversion.py SVN 
subversion/include/svn_version.h)],
+     [esyscmd($PYTHON build/getversion.py SVN 
subversion/include/svn_version.h)],
      [http://subversion.apache.org/])
 
 AC_CONFIG_SRCDIR(subversion/include/svn_types.h)
@@ -91,7 +91,7 @@ AC_SUBST([MKDIR])
 dnl verify apr version and set apr flags
 dnl These regular expressions should not contain "\(" and "\)".
 
-APR_VER_REGEXES=["1\.[3-9]\. 2\."]
+APR_VER_REGEXES=["1\.[5-9]\. 2\."]
 
 SVN_LIB_APR($APR_VER_REGEXES)
 
@@ -115,7 +115,7 @@ AC_SUBST(SVN_APR_MAJOR_VERSION)
 SVN_LT_SOVERSION="-version-info $svn_lib_ver"
 AC_SUBST(SVN_LT_SOVERSION)
 AC_DEFINE_UNQUOTED(SVN_SOVERSION, $svn_lib_ver,
-                   [Subversion library major verson])
+                   [Subversion library major version])
 
 dnl Search for pkg-config
 AC_PATH_PROG(PKG_CONFIG, pkg-config)
@@ -152,9 +152,11 @@ SVN_FIND_APACHE(20051115, $apache_whitel
 dnl Search for SQLite.  If you change SQLITE_URL from a .zip to
 dnl something else also update build/ac-macros/sqlite.m4 to reflect
 dnl the correct command to unpack the downloaded file.
-SQLITE_MINIMUM_VER="3.7.12"
-SQLITE_RECOMMENDED_VER="3.7.15.1"
-SQLITE_URL="http://www.sqlite.org/sqlite-amalgamation-$(printf %d%02d%02d%02d 
$(echo ${SQLITE_RECOMMENDED_VER} | sed -e 's/\./ /g')).zip"
+SQLITE_MINIMUM_VER="3.8.2"
+SQLITE_RECOMMENDED_VER="3.8.11.1"
+dnl Used to construct the SQLite download URL.
+SQLITE_RECOMMENDED_VER_REL_YEAR="2015"
+SQLITE_URL="https://www.sqlite.org/$SQLITE_RECOMMENDED_VER_REL_YEAR/sqlite-amalgamation-$(printf
 %d%02d%02d%02d $(echo ${SQLITE_RECOMMENDED_VER} | sed -e 's/\./ /g')).zip"
 
 SVN_LIB_SQLITE(${SQLITE_MINIMUM_VER}, ${SQLITE_RECOMMENDED_VER},
                ${SQLITE_URL})
@@ -591,6 +593,7 @@ if test "$with_old_gnome_keyring" != "no
                         [Is GNOME Keyring support enabled?])
               CPPFLAGS="$old_CPPFLAGS"
               SVN_GNOME_KEYRING_LIBS="`$PKG_CONFIG --libs glib-2.0 
gnome-keyring-1`"
+              SVN_GNOME_KEYRING_PCLIBS="glib-2.0, gnome-keyring-1"
             else
               AC_MSG_RESULT([no])
               if test "$with_old_gnome_keyring" = "yes"; then
@@ -637,29 +640,6 @@ AC_SUBST(SVN_GNOME_KEYRING_LIBS)
 dnl LibSecret -------------------
 SVN_LIB_SECRET
 
-dnl Googlemock -----------------
-AC_ARG_ENABLE([googlemock],
-  AS_HELP_STRING([--disable-googlemock],
-                 [Do not use the Googlemock testing framework]),
-  [],
-  [enable_googlemock=yes])
-
-AC_SUBST([GOOGLEMOCK_SRCDIR], [$abs_srcdir/googlemock])
-AC_MSG_CHECKING([whether use Googlemock])
-if test "$enable_googlemock" != "no"; then
-  if test -d "$GOOGLEMOCK_SRCDIR"; then
-    AC_MSG_RESULT([yes])
-    SVN_USE_GOOGLEMOCK=true
-  else
-    AC_MSG_RESULT([no])
-    SVN_USE_GOOGLEMOCK=false
-  fi
-else
-  AC_MSG_RESULT([no])
-  SVN_USE_GOOGLEMOCK=false
-fi
-AC_SUBST([SVN_USE_GOOGLEMOCK])
-
 dnl Ev2 experimental features ----------------------
 dnl Note: The Ev2 implementations will be built unconditionally, but by
 dnl providing this flag, users can choose to use the currently-shimmed Ev2
@@ -779,7 +759,7 @@ AH_BOTTOM([
 #endif
 
 /* Macro used to specify that a variable is intentionally left unused.
-   Supresses compiler warnings about the variable being unused.  */
+   Suppresses compiler warnings about the variable being unused.  */
 #define SVN_UNUSED(v) ( (void)(v) )
 ])
 
@@ -864,18 +844,21 @@ fi
 
 dnl plaintext passwords -------------------
 AC_ARG_ENABLE(plaintext-password-storage,
-AS_HELP_STRING([--disable-plaintext-password-storage],
-               [Disable on-disk caching of plaintext passwords and passphrases.
-                (Leaving this functionality enabled will not force Subversion
+AS_HELP_STRING([--enable-plaintext-password-storage],
+               [Enable on-disk caching of plaintext passwords and passphrases.
+                (Enabling this functionality will not force Subversion
                 to store passwords in plaintext, but does permit users to
                 explicitly allow that behavior via runtime configuration.)]),
-[
-   if test "$enableval" = "no"; then
-      AC_MSG_NOTICE([Disabling plaintext password/passphrase storage])
-      AC_DEFINE(SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE, 1,
-                [Defined if plaintext password/passphrase storage is disabled])
-   fi
-])
+[plaintext_passwordd_storage="$enableval"],
+[plaintext_passwordd_storage="no"])
+
+if test "$plaintext_passwordd_storage" = "yes"; then
+  AC_MSG_WARN([Enabling plaintext password/passphrase storage])
+else
+  AC_MSG_NOTICE([Disabling plaintext password/passphrase storage])
+  AC_DEFINE(SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE, 1,
+            [Defined if plaintext password/passphrase storage is disabled])
+fi
 
 dnl Build and install rules -------------------
 
@@ -945,8 +928,9 @@ AC_FUNC_VPRINTF
 dnl check for functions needed in special file handling
 AC_CHECK_FUNCS(symlink readlink)
 
-dnl check for uname
+dnl check for uname and ELF headers
 AC_CHECK_HEADERS(sys/utsname.h, [AC_CHECK_FUNCS(uname)], [])
+AC_CHECK_HEADERS(elf.h)
 
 dnl check for termios
 AC_CHECK_HEADER(termios.h,[
@@ -1150,7 +1134,6 @@ if test "$enable_optimization" = "yes";
           SVN_CFLAGS_ADD_IFELSE([-O1],[],[
             SVN_CFLAGS_ADD_IFELSE([-O])])])])
       SVN_CFLAGS_ADD_IFELSE([-Wno-clobbered])
-      SVN_CFLAGS_ADD_IFELSE([-flto])
     fi
   fi
   if test -z ["`echo $CXXUSERFLAGS' ' | $EGREP -- '-O[^ ]* '`"]; then
@@ -1166,7 +1149,6 @@ if test "$enable_optimization" = "yes";
           SVN_CXXFLAGS_ADD_IFELSE([-O1],[],[
             SVN_CXXFLAGS_ADD_IFELSE([-O])])])])
       SVN_CXXFLAGS_ADD_IFELSE([-Wno-clobbered])
-      SVN_CXXFLAGS_ADD_IFELSE([-flto])
     fi
   fi
 elif test "$enable_optimization" = "no"; then
@@ -1180,9 +1162,11 @@ fi
 
 dnl Dump the current compiler options
 AC_MSG_NOTICE([C compiler flags: $CFLAGS])
+AC_MSG_NOTICE([  language-level: $CMODEFLAGS])
 AC_MSG_NOTICE([    user-defined: $CUSERFLAGS])
 AC_MSG_NOTICE([ maintainer-mode: $CMAINTAINERFLAGS])
 AC_MSG_NOTICE([C++ compiler flags: $CXXFLAGS])
+AC_MSG_NOTICE([    language-level: $CXXMODEFLAGS])
 AC_MSG_NOTICE([      user-defined: $CXXUSERFLAGS])
 AC_MSG_NOTICE([   maintainer-mode: $CXXMAINTAINERFLAGS])
 
@@ -1289,7 +1273,7 @@ AS_HELP_STRING([--enable-gprof],
 # Scripting and Bindings languages
 
 # Python: Used for testsuite, and bindings
-
+AC_ARG_VAR([PYTHON], [Python interpreter command])
 
 PYTHON="`$abs_srcdir/build/find_python.sh`"
 if test -z "$PYTHON"; then
@@ -1303,7 +1287,7 @@ fi
 AC_PATH_PROGS(PYTHON, "$PYTHON", none)
 
 # The minimum version for the JVM runtime for our Java bytecode.
-JAVA_OLDEST_WORKING_VER='1.6'
+JAVA_OLDEST_WORKING_VER='1.8'
 # SVN_CHECK_JDK sets $JAVA_CLASSPATH
 SVN_CHECK_JDK($JAVA_OLDEST_WORKING_VER)
 
@@ -1321,7 +1305,7 @@ if test "$RUBY" != "none"; then
     if test -n "$RDOC"; then
       AC_PATH_PROG(RDOC, "$RDOC", none)
     else
-      AC_PATH_PROGS(RUBY, rdoc rdoc1 rdoc1.8 rdoc18 rdoc1.9 rdoc19 rdoc1.9.3 
rdoc193 rdoc2 rdoc2.0 rdoc20 rdoc2.1 rdoc21 rdoc2.2 rdoc22 rdoc2.3 rdoc23 
rdoc2.4 rdoc24, none)
+      AC_PATH_PROGS(RDOC, rdoc rdoc1 rdoc1.8 rdoc18 rdoc1.9 rdoc19 rdoc1.9.3 
rdoc193 rdoc2 rdoc2.0 rdoc20 rdoc2.1 rdoc21 rdoc2.2 rdoc22 rdoc2.3 rdoc23 
rdoc2.4 rdoc24, none)
     fi
     AC_CACHE_CHECK([for Ruby major version], [svn_cv_ruby_major],[
     svn_cv_ruby_major="`$RUBY -rrbconfig -e 'print 
RbConfig::CONFIG.fetch(%q(MAJOR))'`"
@@ -1358,6 +1342,10 @@ if test "$RUBY" != "none"; then
 fi
 
 SVN_CHECK_SWIG
+AC_ARG_VAR(SWIG_FEATURES, [SWIG feature flags common to all bindings])
+AC_ARG_VAR(SWIG_RB_FEATURES, [SWIG feature flags specific to Ruby bindings])
+AC_ARG_VAR(SWIG_PL_FEATURES, [SWIG feature flags specific to Perl bindings])
+AC_ARG_VAR(SWIG_PY_FEATURES, [SWIG feature flags specific to Python bindings])
 
 SVN_CHECK_CTYPESGEN
 
@@ -1447,6 +1435,69 @@ AC_SUBST(SVN_FS_LIB_DEPS)
 AC_SUBST(SVN_FS_LIB_INSTALL_DEPS)
 AC_SUBST(SVN_FS_LIB_LINK)
 
+# ==== SVN++ =================================================================
+
+dnl Possibly compile SVN++
+do_svnxx_build=no
+AC_ARG_ENABLE(svnxx,
+  AS_HELP_STRING([--enable-svnxx],
+      [Enable compilation of the C++ bindings (requires C++)]),
+  [ if test "$enableval" = "yes" ; then
+        AC_MSG_NOTICE([Enabling the C++ bindings])
+        do_svnxx_build=yes
+    fi
+  ])
+
+dnl Possibly compile SVN++ tests
+do_svnxx_test_build=no
+AC_ARG_ENABLE(svnxx-tests,
+  AS_HELP_STRING([--enable-svnxx-tests],
+      [Enable compilation of tests for the C++ bindings
+      (implies --enable-svnxx, requires Boost and Boost.Test)]),
+  [ if test "$enableval" = "yes" ; then
+        AC_MSG_NOTICE([Enabling tests for the C++ bindings])
+        do_svnxx_test_build=yes
+    fi
+  ])
+
+AX_BOOST_BASE([1.58],
+  [
+    if test "$do_svnxx_test_build" = "yes"; then
+        AX_BOOST_UNIT_TEST_FRAMEWORK
+    fi
+  ],
+  [
+    if test "$do_svnxx_test_build" = "yes"; then
+        AC_MSG_WARN([Tests for the C++ bindings require Boost and Boost.Test])
+        do_svnxx_test_build=no
+    fi
+  ])
+
+if test "$do_svnxx_test_build" = "yes"; then
+    if test "$want_boost" != "yes"; then
+        AC_MSG_WARN([Tests for the C++ bindings require Boost and Boost.Test])
+        do_svnxx_test_build=no
+        SVN_BUILD_SVNXX_TESTS=false
+    else
+        if test "$do_svnxx_build" != "yes"; then
+            AC_MSG_WARN([Enabling the C++ bindings because their tests are 
enabled])
+            do_svnxx_build=yes
+        fi
+        SVN_BUILD_SVNXX_TESTS=true
+    fi
+else
+    SVN_BUILD_SVNXX_TESTS=false
+fi
+
+if test "$do_svnxx_build" = "yes"; then
+    SVN_BUILD_SVNXX=true
+else
+    SVN_BUILD_SVNXX=false
+fi
+
+AC_SUBST(SVN_BUILD_SVNXX)
+AC_SUBST(SVN_BUILD_SVNXX_TESTS)
+
 # ==== JavaHL ================================================================
 
 dnl Possibly compile JavaHL
@@ -1534,12 +1585,6 @@ if test "$CC" = "clang"; then
   SVN_STRIP_FLAG(CPPFLAGS, [-no-cpp-precomp ])
 fi
 
-# Need to strip '-no-cpp-precomp' from CPPFLAGS for SWIG as well.
-SWIG_CPPFLAGS="$CPPFLAGS"
-SVN_STRIP_FLAG(SWIG_CPPFLAGS, [-no-cpp-precomp ])
-SVN_STRIP_FLAG(SWIG_CPPFLAGS, [-Wdate-time ])
-AC_SUBST([SWIG_CPPFLAGS])
-
 dnl Since this is used only on Unix-y systems, define the path separator as '/'
 AC_DEFINE_UNQUOTED(SVN_PATH_LOCAL_SEPARATOR, '/',
         [Defined to be the path separator used on your local filesystem])
@@ -1596,7 +1641,7 @@ fi
 AC_SUBST(SVN_CONFIG_SCRIPT_FILES)
 
 # Ensure that SWIG is checked after reconfiguration.
-rm -f .swig_checked
+rm -f .swig_checked .swig_pl_checked .swig_py_checked .swig_rb_checked
 
 dnl Provide ${host} for use in compiled code (for svn --version)
 AC_DEFINE_UNQUOTED([SVN_BUILD_HOST], "${host}",

Modified: subversion/branches/addremove/contrib/client-side/svn-clean
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/contrib/client-side/svn-clean?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/contrib/client-side/svn-clean (original)
+++ subversion/branches/addremove/contrib/client-side/svn-clean Sat May 23 
14:16:56 2020
@@ -180,7 +180,7 @@ faster than parsing the output of the B<
 
 =item B<-e>, B<--exclude>
 
-A regular expression for filenames to be exluded. For example, the following
+A regular expression for filenames to be excluded. For example, the following
 command will skip files ending in ".zip":
 
 =over 8

Modified: 
subversion/branches/addremove/contrib/client-side/svn_load_dirs/svn_load_dirs.pl.in
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/contrib/client-side/svn_load_dirs/svn_load_dirs.pl.in?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- 
subversion/branches/addremove/contrib/client-side/svn_load_dirs/svn_load_dirs.pl.in
 (original)
+++ 
subversion/branches/addremove/contrib/client-side/svn_load_dirs/svn_load_dirs.pl.in
 Sat May 23 14:16:56 2020
@@ -196,7 +196,7 @@ elsif ( -f "$ENV{HOME}/.subversion/confi
       {
         if ( /^global-ignores\s*=\s*(.*?)\s*$/ )
           {
-           $ignores_str = $1;
+            $ignores_str = $1;
             last;
           }
       }
@@ -1205,10 +1205,11 @@ while (defined (my $load_dir = &get_next
 
                 read_from_process($svn,
                                   'propset',
-                                  $property_name,
                                   '--file',
                                   $tmpfile,
-                                  $add_file);
+                                  '--',
+                                  $property_name,
+                                  $add_file . "@");
               }
           }
       }
@@ -1343,6 +1344,8 @@ sub usage
       "  -p filename    table listing properties to apply to matching files\n",
       "  -svn_username  username to perform commits as\n",
       "  -svn_password  password to supply to svn commit\n",
+      "                 WARNING: passing the password in a command-line 
argument\n",
+      "                 may make it visible to other local OS users\n",
       "  -t tag_dir     create a tag copy in tag_dir, relative to svn_url\n",
       "  -v             increase program verbosity, multiple -v's allowed\n",
       "  -wc path       use the already checked-out working copy at path\n",
@@ -1499,6 +1502,18 @@ sub file_info
   return '?';
 }
 
+# Copy arguments and replace what follows --password with '*'s.
+sub sanitize_pwd
+{
+  my @str = @_;
+  my $hide_next = 0;
+  foreach(@str) {
+    $_ = '*' x length if ( $hide_next );
+    $hide_next = ($_ eq '--password');
+  }
+  @str;
+}
+
 # Start a child process safely without using /bin/sh.
 sub safe_read_from_pipe
 {
@@ -1510,7 +1525,7 @@ sub safe_read_from_pipe
   my $openfork_available = "MSWin32" ne $OSNAME;
   if ($openfork_available)
     {
-      print "Running @_\n";
+      print join(' ', &sanitize_pwd("Running", @_, "\n") );
       my $pid = open(SAFE_READ, "-|");
       unless (defined $pid)
         {
@@ -1522,7 +1537,9 @@ sub safe_read_from_pipe
           open(STDERR, ">&STDOUT")
             or die "$0: cannot dup STDOUT: $!\n";
           exec(@_)
-            or die "$0: cannot exec '@_': $!\n";
+            or die "$0: cannot exec '"
+              . join(' ', &sanitize_pwd(@_) )
+              . "': $!\n";
         }
     }
   else
@@ -1559,7 +1576,7 @@ sub safe_read_from_pipe
             }
         }
 
-      print "Running @commandline\n";
+      print join(' ', &sanitize_pwd("Running", @commandline, "\n") );
       if ( $comment ) { print $comment; }
 
       # Now do the pipe.
@@ -1581,7 +1598,9 @@ sub safe_read_from_pipe
   my $cd     = $result & 128 ? "with core dump" : "";
   if ($signal or $cd)
     {
-      warn "$0: pipe from '@_' failed $cd: exit=$exit signal=$signal\n";
+      warn "$0: pipe from '"
+        . join(' ', &sanitize_pwd(@_) )
+        . "' failed $cd: exit=$exit signal=$signal\n";
     }
   if (wantarray)
     {
@@ -1604,8 +1623,9 @@ sub read_from_process
   my ($status, @output) = &safe_read_from_pipe(@_);
   if ($status)
     {
-      print STDERR "$0: @_ failed with this output:\n", join("\n", @output),
-                   "\n";
+      print STDERR
+        join(' ', &sanitize_pwd("$0:", @_, "failed with this output:\n") ),
+        join("\n", @output), "\n";
       unless ($opt_no_user_input)
         {
           print STDERR
@@ -1657,7 +1677,7 @@ sub recursive_ls_and_hash
     };
   find({no_chdir   => 1,
         preprocess => sub
-         {
+          {
             grep
               {
                 my $ok=1;
@@ -2053,5 +2073,6 @@ sub new
 sub DESTROY
 {
   print "Cleaning up $temp_dir\n";
+  chdir( $temp_dir . "/.." );
   File::Path::rmtree([$temp_dir], 0, 0);
 }

Modified: subversion/branches/addremove/contrib/client-side/svn_update.pl
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/contrib/client-side/svn_update.pl?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/contrib/client-side/svn_update.pl (original)
+++ subversion/branches/addremove/contrib/client-side/svn_update.pl Sat May 23 
14:16:56 2020
@@ -31,7 +31,7 @@
 # given file(s) that would require >n minutes, where n is the
 # server's magic timeout (5 min.??), the server will timeout.  This
 # leaves the client/user in an unswell state.  See issue #2048 for
-# details http://subversion.tigris.org/issues/show_bug.cgi?id=2048.
+# details https://issues.apache.org/jira/browse/SVN-2048.
 #
 # One solution is to wrap the 'svn update' command in a script that
 # will perform the update one file at a time.  The problem with

Modified: 
subversion/branches/addremove/contrib/client-side/svnmerge/svnmerge-migrate-history.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/contrib/client-side/svnmerge/svnmerge-migrate-history.py?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- 
subversion/branches/addremove/contrib/client-side/svnmerge/svnmerge-migrate-history.py
 (original)
+++ 
subversion/branches/addremove/contrib/client-side/svnmerge/svnmerge-migrate-history.py
 Sat May 23 14:16:56 2020
@@ -259,7 +259,7 @@ class Migrator:
         # Run the final version of the new svn:mergeinfo through the
         # parser to ensure it is in canonical form, e.g. no overlapping
         # or unordered rangelists, see
-        # http://subversion.tigris.org/issues/show_bug.cgi?id=3302.
+        # https://issues.apache.org/jira/browse/SVN-3302.
         mergeinfo = svn.core.svn_mergeinfo_parse(new_mergeinfo_prop_val)
         new_mergeinfo_prop_val = mergeinfo2str(mergeinfo)
 

Modified: subversion/branches/addremove/contrib/client-side/svnmerge/svnmerge.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/contrib/client-side/svnmerge/svnmerge.py?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/contrib/client-side/svnmerge/svnmerge.py 
(original)
+++ subversion/branches/addremove/contrib/client-side/svnmerge/svnmerge.py Sat 
May 23 14:16:56 2020
@@ -1367,7 +1367,7 @@ def action_init(target_dir, target_props
         # the copy target is the merge target, then we want to mark as
         # integrated up to the specific rev of the merge target from
         # which the merge source was copied.  (Longer discussion at:
-        # http://subversion.tigris.org/issues/show_bug.cgi?id=2810  )
+        # https://issues.apache.org/jira/browse/SVN-2810  )
         cf_source, cf_rev, copy_committed_in_rev = get_copyfrom(target_dir)
 
         cf_pathid = None

Modified: 
subversion/branches/addremove/contrib/hook-scripts/remove-zombie-locks.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/contrib/hook-scripts/remove-zombie-locks.py?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/contrib/hook-scripts/remove-zombie-locks.py 
(original)
+++ subversion/branches/addremove/contrib/hook-scripts/remove-zombie-locks.py 
Sat May 23 14:16:56 2020
@@ -28,7 +28,7 @@ Usage: remove-zombie-locks.py REPOS-PATH
   locks on files that don't exist in the HEAD revision, removing any found.
 
   This script is a workaround for Subversion issue #2507
-  http://subversion.tigris.org/issues/show_bug.cgi?id=2507
+  https://issues.apache.org/jira/browse/SVN-2507
 
 Examples:
 

Modified: subversion/branches/addremove/doc/doxygen.conf
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/doc/doxygen.conf?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/doc/doxygen.conf (original)
+++ subversion/branches/addremove/doc/doxygen.conf Sat May 23 14:16:56 2020
@@ -112,7 +112,7 @@ INLINE_INHERITED_MEMB  = NO
 # path before files name in the file list and in the header files. If set
 # to NO the shortest path that makes the file name unique will be used.
 
-FULL_PATH_NAMES        = NO
+FULL_PATH_NAMES        = YES
 
 # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
 # can be used to strip a user-defined part of the path. Stripping is
@@ -121,7 +121,7 @@ FULL_PATH_NAMES        = NO
 # If left blank the directory from which doxygen is run is used as the
 # path to strip.
 
-STRIP_FROM_PATH        =
+STRIP_FROM_PATH        = subversion/include subversion/bindings/cxx/include
 
 # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
 # the path mentioned in the documentation of a class, which tells
@@ -130,7 +130,7 @@ STRIP_FROM_PATH        =
 # definition is used. Otherwise one should specify the include paths that
 # are normally passed to the compiler using the -I flag.
 
-STRIP_FROM_INC_PATH    =
+STRIP_FROM_INC_PATH    = subversion/include subversion/bindings/cxx/include
 
 # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
 # (but less readable) file names. This can be useful is your file systems
@@ -280,22 +280,6 @@ SUBGROUPING            = YES
 
 TYPEDEF_HIDES_STRUCT   = NO
 
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
-# determine which symbols to keep in memory and which to flush to disk.
-# When the cache is full, less often used symbols will be written to disk.
-# For small to medium size projects (<1000 input files) the default value is
-# probably good enough. For larger projects a too small cache size can cause
-# doxygen to be busy swapping symbols to and from disk most of the time
-# causing a significant performance penality.
-# If the system has enough physical memory increasing the cache will improve 
the
-# performance by keeping more symbols in memory. Note that the value works on
-# a logarithmic scale so increasing the size by one will rougly double the
-# memory usage. The cache size is given by this formula:
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
-# corresponding to a cache size of 2^16 = 65536 symbols
-
-SYMBOL_CACHE_SIZE      = 0
-
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
@@ -478,12 +462,6 @@ MAX_INITIALIZER_LINES  = 30
 
 SHOW_USED_FILES        = YES
 
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory 
hierarchy
-# in the documentation. The default is NO.
-
-SHOW_DIRECTORIES       = NO
-
 # Set the SHOW_FILES tag to NO to disable the generation of the Files page.
 # This will remove the Files entry from the Quick Index and from the
 # Folder Tree View (if specified). The default is YES.
@@ -577,6 +555,10 @@ WARN_LOGFILE           =
 # with spaces.
 
 INPUT                  = subversion/include \
+                         subversion/bindings/cxx/include \
+                         subversion/bindings/cxx/include/svnxx \
+                         subversion/bindings/cxx/include/svnxx/client \
+                         subversion/bindings/cxx/include/svnxx/detail \
                          subversion/include/private/svn_doxygen.h
 
 # This tag can be used to specify the character encoding of the source files
@@ -594,7 +576,7 @@ INPUT_ENCODING         = UTF-8
 # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
 # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
 
-FILE_PATTERNS          = *.h
+FILE_PATTERNS          = *.h *.hpp
 
 # The RECURSIVE tag can be used to turn specify whether or not subdirectories
 # should be searched for input files as well. Possible values are YES and NO.
@@ -805,12 +787,6 @@ HTML_FOOTER            =
 
 HTML_STYLESHEET        =
 
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS     = YES
-
 # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
 # documentation will contain sections that can be hidden and shown after the
 # page has loaded. For this to work a browser that supports
@@ -959,11 +935,6 @@ ENUM_VALUES_PER_LINE   = 1
 
 GENERATE_TREEVIEW      = NO
 
-# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
-# and Class Hierarchy pages using a tree view instead of an ordered list.
-
-USE_INLINE_TREES       = NO
-
 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
 # used to set the initial width (in pixels) of the frame in which the tree
 # is shown.
@@ -1151,18 +1122,6 @@ GENERATE_XML           = NO
 
 XML_OUTPUT             = xml
 
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA             =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD                =
-
 # If the XML_PROGRAMLISTING tag is set to YES Doxygen will
 # dump the program listings (including syntax highlighting
 # and cross-referencing information) to the XML output. Note that
@@ -1378,7 +1337,7 @@ HAVE_DOT               = NO
 # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
 # containing the font.
 
-DOT_FONTNAME           = FreeSans
+DOT_FONTNAME           =
 
 # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
 # The default size is 10pt.

Modified: subversion/branches/addremove/doc/user/svn-best-practices.html
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/doc/user/svn-best-practices.html?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/doc/user/svn-best-practices.html (original)
+++ subversion/branches/addremove/doc/user/svn-best-practices.html Sat May 23 
14:16:56 2020
@@ -240,7 +240,7 @@ while somebody else is in the process of
 <li>Users commit their day-to-day work on <tt>/trunk</tt>.</li>
 
 <li>Rule #1: <tt>/trunk</tt> must compile and pass regression tests at
-all times.  Committers who violate this rule are publically
+all times.  Committers who violate this rule are publicly
 humiliated.</li>
 
 <li>Rule #2: a single commit (changeset) must not be so large

Modified: subversion/branches/addremove/gen-make.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/gen-make.py?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/gen-make.py (original)
+++ subversion/branches/addremove/gen-make.py Sat May 23 14:16:56 2020
@@ -48,7 +48,6 @@ sys.path.insert(1, 'build')
 
 gen_modules = {
   'make' : ('gen_make', 'Makefiles for POSIX systems'),
-  'dsp' : ('gen_msvc_dsp', 'MSVC 6.x project files'),
   'vcproj' : ('gen_vcnet_vcproj', 'VC.Net project files'),
   }
 
@@ -71,7 +70,7 @@ def main(fname, gentype, verfname=None,
 
   if ('--debug', '') in other_options:
     for dep_type, target_dict in generator.graph.deps.items():
-      sorted_targets = list(target_dict.keys()); sorted_targets.sort()
+      sorted_targets = sorted(target_dict.keys(), key=str)
       for target in sorted_targets:
         print(dep_type + ": " + _objinfo(target))
         for source in target_dict[target]:
@@ -176,6 +175,8 @@ def _usage_exit(err=None):
   print("")
   print("  --with-swig=DIR")
   print("           look for the swig program in DIR")
+  print("  --with-py3c=DIR")
+  print("           look for the py3c library in DIR")
   print("")
   print("  --with-sqlite=DIR")
   print("           look for sqlite in DIR")
@@ -215,8 +216,6 @@ def _usage_exit(err=None):
   print("")
   print("  --with-apr_memcache=DIR")
   print("           the apr_memcache sources are in DIR")
-  print("  --disable-gmock")
-  print("           do not use Googlemock")
   sys.exit(1)
 
 
@@ -252,6 +251,7 @@ if __name__ == '__main__':
                             'with-jdk=',
                             'with-junit=',
                             'with-swig=',
+                            'with-py3c=',
                             'with-sqlite=',
                             'with-sasl=',
                             'with-apr_memcache=',
@@ -264,7 +264,6 @@ if __name__ == '__main__':
                             'disable-shared',
                             'installed-libs=',
                             'vsnet-version=',
-                            'disable-gmock',
                             ])
     if len(args) > 1:
       _usage_exit("Too many arguments")

Modified: subversion/branches/addremove/get-deps.sh
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/get-deps.sh?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/get-deps.sh (original)
+++ subversion/branches/addremove/get-deps.sh Sat May 23 14:16:56 2020
@@ -31,26 +31,24 @@
 # features already used in the file.  Reviewing the history of changes
 # may be useful as well.
 
-APR_VERSION=${APR_VERSION:-"1.4.6"}
+APR_VERSION=${APR_VERSION:-"1.5.0"}
 APU_VERSION=${APU_VERSION:-"1.5.1"}
+PY3C_VERSION=${PY3C_VERSION:='1.1'}
 SERF_VERSION=${SERF_VERSION:-"1.3.8"}
 ZLIB_VERSION=${ZLIB_VERSION:-"1.2.8"}
-SQLITE_VERSION=${SQLITE_VERSION:-"3.7.15.1"}
-GTEST_VERSION=${GMOCK_VERSION:-"1.7.0"}
-GMOCK_VERSION=${GMOCK_VERSION:-"1.7.0"}
+SQLITE_VERSION=${SQLITE_VERSION:-"3.8.11.1"}
+# Used to construct the SQLite download URL.
+SQLITE_VERSION_REL_YEAR=2015
 HTTPD_VERSION=${HTTPD_VERSION:-"2.4.10"}
 APR_ICONV_VERSION=${APR_ICONV_VERSION:-"1.2.1"}
 
 APR=apr-${APR_VERSION}
 APR_UTIL=apr-util-${APU_VERSION}
+PY3C=py3c-${PY3C_VERSION}
 SERF=serf-${SERF_VERSION}
 ZLIB=zlib-${ZLIB_VERSION}
 SQLITE_VERSION_LIST=`echo $SQLITE_VERSION | sed -e 's/\./ /g'`
 SQLITE=sqlite-amalgamation-`printf %d%02d%02d%02d $SQLITE_VERSION_LIST`
-GTEST=release-${GTEST_VERSION}
-GTEST_URL=https://github.com/google/googletest/archive
-GMOCK=release-${GMOCK_VERSION}
-GMOCK_URL=https://github.com/google/googlemock/archive
 
 HTTPD=httpd-${HTTPD_VERSION}
 APR_ICONV=apr-iconv-${APR_ICONV_VERSION}
@@ -65,12 +63,12 @@ HTTP_FETCH=
 
 # Need this uncommented if any of the specific versions of the ASF tarballs to
 # be downloaded are no longer available on the general mirrors.
-APACHE_MIRROR=http://archive.apache.org/dist
+APACHE_MIRROR=https://archive.apache.org/dist
 
 # helpers
 usage() {
     echo "Usage: $0"
-    echo "Usage: $0 [ apr | serf | zlib | sqlite | googlemock ] ..."
+    echo "Usage: $0 [ apr | py3c | serf | zlib | sqlite ] ..."
     exit $1
 }
 
@@ -88,6 +86,19 @@ get_apr() {
     test -d $BASEDIR/apr-util || mv $APR_UTIL apr-util
 }
 
+get_py3c() {
+    test -d $BASEDIR/py3c && return
+    py3cdist=v${PY3C_VERSION}.tar.gz
+
+    cd $TEMPDIR
+    $HTTP_FETCH https://github.com/encukou/py3c/archive/${py3cdist}
+    cd $BASEDIR
+
+    gzip -dc $TEMPDIR/${py3cdist} | tar -xf -
+
+    mv $PY3C py3c
+}
+
 get_serf() {
     test -d $BASEDIR/serf && return
 
@@ -104,7 +115,7 @@ get_zlib() {
     test -d $BASEDIR/zlib && return
 
     cd $TEMPDIR
-    $HTTP_FETCH 
http://sourceforge.net/projects/libpng/files/zlib/$ZLIB_VERSION/$ZLIB.tar.gz
+    $HTTP_FETCH 
https://sourceforge.net/projects/libpng/files/zlib/$ZLIB_VERSION/$ZLIB.tar.gz
     cd $BASEDIR
 
     gzip -dc $TEMPDIR/$ZLIB.tar.gz | tar -xf -
@@ -116,7 +127,7 @@ get_sqlite() {
     test -d $BASEDIR/sqlite-amalgamation && return
 
     cd $TEMPDIR
-    $HTTP_FETCH http://www.sqlite.org/$SQLITE.zip
+    $HTTP_FETCH https://www.sqlite.org/$SQLITE_VERSION_REL_YEAR/$SQLITE.zip
     cd $BASEDIR
 
     unzip -q $TEMPDIR/$SQLITE.zip
@@ -125,29 +136,11 @@ get_sqlite() {
 
 }
 
-get_googlemock() {
-    test -d $BASEDIR/googlemock && return
-
-    cd $TEMPDIR
-    $HTTP_FETCH ${GTEST_URL}/${GTEST}.zip
-    unzip -q ${GTEST}.zip
-    rm -f ${GTEST}.zip
-
-    $HTTP_FETCH ${GMOCK_URL}/${GMOCK}.zip
-    unzip -q ${GMOCK}.zip
-    rm -f ${GMOCK}.zip
-
-    cd $BASEDIR
-    mkdir googlemock
-    mv $TEMPDIR/googletest-release-${GTEST_VERSION} googlemock/googletest
-    mv $TEMPDIR/googlemock-release-${GMOCK_VERSION} googlemock/googlemock
-}
-
 # main()
 get_deps() {
     mkdir -p $TEMPDIR
 
-    for i in zlib serf sqlite-amalgamation apr apr-util gmock-fused; do
+    for i in zlib serf sqlite-amalgamation py3c apr apr-util; do
       if [ -d $i ]; then
         echo "Local directory '$i' already exists; the downloaded copy won't 
be used" >&2
       fi
@@ -163,6 +156,7 @@ get_deps() {
       done
     else
       get_apr
+      get_py3c
       get_serf
       get_zlib
       get_sqlite

Modified: subversion/branches/addremove/notes/EuroOSCON-2005-vc-bof.txt
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/EuroOSCON-2005-vc-bof.txt?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/EuroOSCON-2005-vc-bof.txt (original)
+++ subversion/branches/addremove/notes/EuroOSCON-2005-vc-bof.txt Sat May 23 
14:16:56 2020
@@ -151,7 +151,7 @@ Comments from projects that switched fro
 
 * The w.c. space penalty is a real issue for large projects.  Disk
   space is not as cheap as we thought, those .svn/text-base/* files
-  hurt.  See http://subversion.tigris.org/issues/show_bug.cgi?id=525.
+  hurt.  See https://issues.apache.org/jira/browse/SVN-525.
   
   [gerv: Random thought - if you can't easily do copy-on-write, could
   you perhaps share text-base files by hard-linking between multiple

Modified: subversion/branches/addremove/notes/anchors_and_targets.txt
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/anchors_and_targets.txt?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/anchors_and_targets.txt (original)
+++ subversion/branches/addremove/notes/anchors_and_targets.txt Sat May 23 
14:16:56 2020
@@ -104,7 +104,7 @@ The Status Quo
    scheme, however, such as the need to examine the a directory
    target's parent, and perhaps a handful of unspecified
    "spidey-sense" warnings.  PLEASE, if you have valid technical
-   complaints, (re-)voice them in reponse to this mail so they can be
+   complaints, (re-)voice them in response to this mail so they can be
    evaluated more closely, offering better solutions if you can.
 
    For example, the editor could be changed so that some flavor of

Modified: subversion/branches/addremove/notes/client-configuration
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/client-configuration?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/client-configuration (original)
+++ subversion/branches/addremove/notes/client-configuration Sat May 23 
14:16:56 2020
@@ -59,8 +59,8 @@ dev@s.a.o: "Bikeshed: configuration over
 dev@s.a.o: "Default commandline args";
     http://svn.haxx.se/dev/archive-2010-12/0449.shtml
 Issue 1974: "server-side config which 'broadcasts' to clients";
-    http://subversion.tigris.org/issues/show_bug.cgi?id=1974
+    https://issues.apache.org/jira/browse/SVN-1974
 Issue 3765: "client-configurable default args";
-    http://subversion.tigris.org/issues/show_bug.cgi?id=3765
+    https://issues.apache.org/jira/browse/SVN-3765
 Issue 3769: "Add APIs which allow library consumers to specify configuration 
options"
-    http://subversion.tigris.org/issues/show_bug.cgi?id=3769
+    https://issues.apache.org/jira/browse/SVN-3769

Modified: 
subversion/branches/addremove/notes/commit-access-templates/full-committer.tmpl
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/commit-access-templates/full-committer.tmpl?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- 
subversion/branches/addremove/notes/commit-access-templates/full-committer.tmpl 
(original)
+++ 
subversion/branches/addremove/notes/commit-access-templates/full-committer.tmpl 
Sat May 23 14:16:56 2020
@@ -5,7 +5,7 @@ of "{AT}" with real "@" signs.  It's jus
 fool the spam address harvesters.
 ]]]
 
-### see http://www.apache.org/dev/pmc.html#newpmc for procedure
+### see https://www.apache.org/dev/pmc.html#newpmc for procedure
 
 From: "Some Committer" <a.commit...@wherever.example.com>
 To: New Full Committer <new.commit...@wherever.new.committers.live>

Modified: 
subversion/branches/addremove/notes/commit-access-templates/partial-committer.tmpl
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/commit-access-templates/partial-committer.tmpl?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- 
subversion/branches/addremove/notes/commit-access-templates/partial-committer.tmpl
 (original)
+++ 
subversion/branches/addremove/notes/commit-access-templates/partial-committer.tmpl
 Sat May 23 14:16:56 2020
@@ -5,6 +5,8 @@ instances of "{AT}" with real "@" signs.
 template to fool the spam address harvesters.
 ]]]
 
+### see https://www.apache.org/dev/pmc.html#newcommitter for procedure
+
 From: "Some Committer" <a.commit...@wherever.example.com>
 To: New Partial Committer <new.commit...@wherever.new.committers.live>
 Cc: private{AT}subversion.apache.org

Modified: 
subversion/branches/addremove/notes/commit-access-templates/pmc-member.tmpl
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/commit-access-templates/pmc-member.tmpl?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/commit-access-templates/pmc-member.tmpl 
(original)
+++ subversion/branches/addremove/notes/commit-access-templates/pmc-member.tmpl 
Sat May 23 14:16:56 2020
@@ -5,7 +5,7 @@ real "@" signs.  It's just masked in thi
 address harvesters.
 ]]]
 
-### see http://www.apache.org/dev/pmc.html#newpmc for procedure
+### see https://www.apache.org/dev/pmc.html#newpmc for procedure
 
 From: "Some PMC Member" <a.commit...@wherever.example.com>
 To: New PMC Member <new.pm...@wherever.new.pmcers.live>

Modified: subversion/branches/addremove/notes/diff-optimizations.txt
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/diff-optimizations.txt?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/diff-optimizations.txt (original)
+++ subversion/branches/addremove/notes/diff-optimizations.txt Sat May 23 
14:16:56 2020
@@ -80,7 +80,7 @@ See also issue #1966 (libsvn_diff needs
 References
 ----------
 
-[1] http://subversion.tigris.org/issues/show_bug.cgi?id=1966 (libsvn_diff
+[1] https://issues.apache.org/jira/browse/SVN-1966 (libsvn_diff
 needs 'non-minimal-diff' mode)
 [2] Miller, W., and Myers, E.W. "A File Comparison Program.", Software -
     Practice & Experience 15 (1985), pp. 1025-1040.

Modified: subversion/branches/addremove/notes/dump-load-format.txt
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/dump-load-format.txt?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/dump-load-format.txt (original)
+++ subversion/branches/addremove/notes/dump-load-format.txt Sat May 23 
14:16:56 2020
@@ -1,6 +1,6 @@
 = How to interpret Subversion dumpfiles =
 
-Version 1.1, 2013-02-02
+Version 1.2, 2019-11-18
 
 == Introduction ==
 
@@ -72,6 +72,10 @@ UUID: <hex-string>
 where the <hex-string> is the UUID of the originating repository.
 An example UUID is "7bf7a5ef-cabf-0310-b7d4-93df341afa7e".
 
+As generated by Subversion, these UUIDs are "Version 1", incorporating
+the MAC of the originating machine. The presentation is in RFC4122
+form without the "urn:" or "uuid:" prefixes.
+
 ==== Revision records ====
 
 A Revision record has three headers and is usually followed by a
@@ -91,7 +95,7 @@ Revision record.  These two numbers will
 record; the Content-length header is added for the benefit of software
 that can parse RFC-822 messages.
 
-A revision record is followed by one or more Node records (see below).
+A revision record is followed by zero or more Node records (see below).
 
 ==== Node records ====
 
@@ -147,6 +151,7 @@ Text-content-length will be present only
 Zero is a legal value for this length, indicating an empty file.
 
 Prop-content-length will be present only when there is a properties section.
+A properties section has non-zero length even if it has no entries.
 
 Content-length will be present if there is either a text or a
 properties section.  This is not always the case.  In particular, 
@@ -353,20 +358,15 @@ The revision properties do not persist t
 has exactly the revision properties specified in its revision record, or
 no revision properties if there is no property section.
 
-The key thing to know about Node properties is that they are 
-persistent, once set, until modified by a future property 
-section on the same path.
-
-Normally, a dumpfile re-lists the entire property set for a directory
-or file in every Node record that changes any part of it. (But see
-the material on delta dumps for an exception.)
+Node properties, like node text, are persistent: once set, they are
+carried forward until modified by a future property section, both on the
+same path and on the target of a copyfrom operation.
 
-This implies that to delete a given property from a path, a dumpfile
+In non-delta format, to delete a given property from a path, a dumpfile
 generator will issue a Node record with all other properties listed in it;
 to delete all properties from a path, the dumpfile generator will
-simply issue a node with an empty properties section. Note that this
-is different from an *absent* properties section, which will change
-no properties and will be associated with a change to content!
+issue a node with an empty properties section. (This is different from
+an *absent* properties section, which will change no properties.)
 
 === Representation of symbolic links ===
 
@@ -380,15 +380,24 @@ be defined.  None such yet exist as of r
 
 === Implementation pragmatics ===
 
+Dumpfile generation in general is not canonical, nor minimalist. In
+particular, interpreters should be prepared to see many empty property
+sections (nominally deleting all properties) when there are no
+previous properties set to be deleted.
+
 Because directory operations with copyfroms don't specify all the file
 paths they modify, an interpreter for this format must build a map of
 the paths in the file store it is manipulating, and update that map as
 it processes each Node record.
 
 On a repository with thousands of commits, the per-revision list of
-maps can become quite large. For space economy, the file map for each 
-revision can be discarded after it is processed *unless it is a source
-revision for a copyfrom*. 
+maps can become quite large. It is tempting to think that the file map
+for each revision can be discarded after it is processed unless it is
+a source revision for a copyfrom, but there are cases in which doing
+this will leave you unable to trace ancestry chains through copies.
+
+Instead, is advisable to build your filemaps using a copy-on-write
+store.
 
 == An example ==
 

Modified: subversion/branches/addremove/notes/http-and-webdav/webdav-protocol
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/http-and-webdav/webdav-protocol?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/http-and-webdav/webdav-protocol 
(original)
+++ subversion/branches/addremove/notes/http-and-webdav/webdav-protocol Sat May 
23 14:16:56 2020
@@ -425,7 +425,7 @@ Purpose: Retrieve a record of the change
 
 Target URL: Prior to Subversion 1.8, the target URL was the public
             resource URL of the aforementioned subtree.  Per issue #4287
-            (http://subversion.tigris.org/issues/show_bug.cgi?id=4287),
+            (https://issues.apache.org/jira/browse/SVN-4287),
             it was discovered that this was an incorrect approach, so
             in Subversion 1.8, mod_dav_svn allowed clients to submit
             this report (with a slightly different Request syntax)

Modified: subversion/branches/addremove/notes/knobs
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/knobs?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/knobs (original)
+++ subversion/branches/addremove/notes/knobs Sat May 23 14:16:56 2020
@@ -56,6 +56,7 @@ SVN_SQLITE_MIN_VERSION
 SVN_SERF_NO_LOGGING
 SVN_ALLOW_SHORT_INTS
 SVN_ALLOW_NON_8_BIT_CHARS
+SVNXX_USE_BOOST
 
 2.3 Debugging Support
 
@@ -75,6 +76,7 @@ SVN_FS__TRAIL_DEBUG
 SVN_FS_FS__LOG_ACCESS
 SVN_FS_EMULATE_PATHS_CHANGED
 SVN_FS_EMULATE_REPORT_CHANGES
+SVNXX_POOL_DEBUG
 
 2.4 Test-only
 
@@ -304,6 +306,15 @@ SVN_I_LIKE_LATENCY_SO_IGNORE_HTTPV2
   Default:   not defined
   Suggested: not defined (to ensure correct behaviour)
 
+4.13 SVNXX_USE_BOOST
+  Scope:     SVN++ (subversion/bindings/cxx)
+  Purpose:   Adds header-only conversions and overloads to make SVN++
+             interoperate cleanly with selected Boost types. Defining this
+             symbol does *not* affect the SVN++ ABI. Users may define the
+             symbol when using SVN++ after libsvnxx has been built.
+  Range:     definedness
+  Default:   not defined
+  Suggested: defined for testing SVN++, otherwise not defined
 
 5 Defines controlling debug support
 ==================================
@@ -458,6 +469,14 @@ SVN_I_LIKE_LATENCY_SO_IGNORE_HTTPV2
   Default:   TRUE (local default if macro has not been defined)
   Suggested: FALSE
 
+5.17 SVNXX_POOL_DEBUG
+
+  Scope:     SVN++ (subversion/bindings/cxx)
+  Purpose:   Logs debugging info about the lifetime of the SVN++ global pool.
+             Depends on SVN_DEBUG being defined.
+  Range:     definedness
+  Default:   not defined
+  Suggested: defined, not defined
 
 6 Defines that affect unit tests
 ================================

Modified: subversion/branches/addremove/notes/merge-tracking/func-spec.html
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/merge-tracking/func-spec.html?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/merge-tracking/func-spec.html (original)
+++ subversion/branches/addremove/notes/merge-tracking/func-spec.html Sat May 
23 14:16:56 2020
@@ -166,7 +166,7 @@ mergeinfo for the merge is set on the de
   was present in the WC despite being outside its parent's 'depth'
   attribute) and could not then re-add a node of the same name in order to
   perform both halves of an incoming replacement.  <a
-  href="http://subversion.tigris.org/issues/show_bug.cgi?id=4164"; >Issue
+  href="https://issues.apache.org/jira/browse/SVN-4164"; >Issue
   #4164 "inconsistencies in merge handling of adds vs. edits in shallow
   targets"</a> is related.</em></p>
 
@@ -264,7 +264,7 @@ SSRP - Switched subtree's repository par
 
 <h3>Delete</h3>
 
-<p><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=4163";
+<p><a href="https://issues.apache.org/jira/browse/SVN-4163";
   >Issue #4163 "merged deletion of switched subtrees records non-inheritable
   mergeinfo"</a>: If a merge deletes the path SS, the desired behaviour
   is currently undefined and the actual behaviour is that a commit will
@@ -473,7 +473,7 @@ command-line could also produce an outpu
 <p>Recent discussion can be found <a
 
href="http://subversion.tigris.org/servlets/ReadMsg?listName=dev&amp;msgNo=128233";
 >here</a>.  Development is tracked <a
-href="http://subversion.tigris.org/issues/show_bug.cgi?id=2820";>here</a>.</p>
+href="https://issues.apache.org/jira/browse/SVN-2820";>here</a>.</p>
 
 <p>The <a href="requirements.html#change-set-availability">Show
 Changesets Blocked from Merging</a> portion of this feature is
@@ -493,7 +493,7 @@ allow for XML-formatted output (for mach
 <p>Recent discussion can be found <a
 
href="http://subversion.tigris.org/servlets/ReadMsg?listName=dev&amp;msgNo=128233";
 >here</a>.  Development is tracked <a
-href="http://subversion.tigris.org/issues/show_bug.cgi?id=2835";>here</a>.</p>
+href="https://issues.apache.org/jira/browse/SVN-2835";>here</a>.</p>
 
 <p>The <a href="requirements.html#find-changeset">Find Paths
 containing Specific Incarnation of Versioned Resource</a> portion of
@@ -951,7 +951,7 @@ here:</p>
   >Original API proposal</a></li>
 </ul>
 
-<p><a href="http://subversion.tigris.org/issues/show_bug.cgi?id=2022";
+<p><a href="https://issues.apache.org/jira/browse/SVN-2022";
 >Issue #2022</a> is loosely related.</p>
 
 <div class="h3" id="distributable-resolution">

Modified: subversion/branches/addremove/notes/merge-tracking/requirements.html
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/merge-tracking/requirements.html?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/merge-tracking/requirements.html 
(original)
+++ subversion/branches/addremove/notes/merge-tracking/requirements.html Sat 
May 23 14:16:56 2020
@@ -122,7 +122,7 @@ section).</p>
 
 <p><code>svn merge</code> needs to handle renames better.  This
 requires <a
-href="http://subversion.tigris.org/issues/show_bug.cgi?id=898";>true
+href="https://issues.apache.org/jira/browse/SVN-898";>true
 rename support</a>.</p>
 
 <p>Edit foo.c on branch A.  Rename foo.c to bar.c on branch B.</p>
@@ -138,7 +138,7 @@ rename support</a>.</p>
 </ol>
 
 <p>Problem #2 stems from the fact that we don't have <a
-href="http://subversion.tigris.org/issues/show_bug.cgi?id=898";>true
+href="https://issues.apache.org/jira/browse/SVN-898";>true
 renames</a>, just copies (with history) and deletes.  That's not
 fixable without a FS schema change, and (probably) a libsvn_wc
 rewrite.</p>
@@ -372,7 +372,7 @@ some filesystem backend implementation d
 items in the dump as a sort of "soft data" (which would allow them to
 be used for "translating" the merge tracking data at load time, where
 those IDs would be otherwise irrelevant).  See <a
-href="http://subversion.tigris.org/issues/show_bug.cgi?id=1525";>issue
+href="https://issues.apache.org/jira/browse/SVN-1525";>issue
 1525</a> about user-visible entity IDs.</p>
 
 </div>  <!-- dump-load -->

Modified: subversion/branches/addremove/notes/merge-tracking/summit.html
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/merge-tracking/summit.html?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/merge-tracking/summit.html (original)
+++ subversion/branches/addremove/notes/merge-tracking/summit.html Sat May 23 
14:16:56 2020
@@ -166,7 +166,7 @@ the average user needs.</p>
   resources in the first place?  Can this be achieved with a
   finer-grained <code>svn switch</code>?  Note: This is related to the
   shared file storage issue in Subversion's own issue tracker,
-  <a href="http://subversion.tigris.org/issues/show_bug.cgi?id=2286";
+  <a href="https://issues.apache.org/jira/browse/SVN-2286";
       >issue&nbsp;#2286</a>.  It was also expressed at the
   <a
   
href="http://svn.apache.org/repos/asf/subversion/trunk/notes/EuroOSCON-2005-vc-bof.txt";

Modified: subversion/branches/addremove/notes/moves
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/moves?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/moves (original)
+++ subversion/branches/addremove/notes/moves Sat May 23 14:16:56 2020
@@ -75,7 +75,7 @@ private libsvn_wc API:
 
 More API changes might be needed (TBD).
 In particular, scan_deletion may need to return a list of moves
-in the multi-layer case (http://wiki.apache.org/subversion/MultiLayerMoves)
+in the multi-layer case 
(https://cwiki.apache.org/confluence/display/SVN/MultiLayerMoves)
 
 We might require a working copy upgrade when going from 1.7 to 1.8,
 and only allow new move functionality to be used with 1.8 working copies.

Modified: 
subversion/branches/addremove/notes/obliterate/obliterate-functional-spec.txt
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/obliterate/obliterate-functional-spec.txt?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- 
subversion/branches/addremove/notes/obliterate/obliterate-functional-spec.txt 
(original)
+++ 
subversion/branches/addremove/notes/obliterate/obliterate-functional-spec.txt 
Sat May 23 14:16:56 2020
@@ -1021,7 +1021,7 @@ VII. Appendix
 
     1. Link to external documentation
 
-    [1] Issue 516: http://subversion.tigris.org/issues/show_bug.cgi?id=516
+    [1] Issue 516: https://issues.apache.org/jira/browse/SVN-516
     [2] Karl Fogel's proposal to use the replay API and filters:
         http://svn.haxx.se/dev/archive-2008-04/0687.shtml
     [3] Bob Jenkins's thread about "Auditability": keep log of what has been

Modified: subversion/branches/addremove/notes/repos-dictated-config
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/repos-dictated-config?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/repos-dictated-config (original)
+++ subversion/branches/addremove/notes/repos-dictated-config Sat May 23 
14:16:56 2020
@@ -1,2 +1,2 @@
 [  The contents and further evolution of this document have been moved to  ]
-[  http://wiki.apache.org/subversion/ServerDictatedConfiguration           ]
+[  https://cwiki.apache.org/confluence/display/SVN/ServerDictatedConfiguration 
 ]

Modified: subversion/branches/addremove/notes/tree-conflicts/design-overview.txt
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/tree-conflicts/design-overview.txt?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/tree-conflicts/design-overview.txt 
(original)
+++ subversion/branches/addremove/notes/tree-conflicts/design-overview.txt Sat 
May 23 14:16:56 2020
@@ -246,10 +246,10 @@ Status: incomplete
 
   * Mark as resolved, by command: the basic "svn resolved PARENT" works to some
     extent, but needs attention.
-    Issue #3145 <http://subversion.tigris.org/issues/show_bug.cgi?id=3145>
+    Issue #3145 <https://issues.apache.org/jira/browse/SVN-3145>
 
   * Mark as resolved, interactively: not started.
-    Issue #3144 <http://subversion.tigris.org/issues/show_bug.cgi?id=3144>
+    Issue #3144 <https://issues.apache.org/jira/browse/SVN-3144>
 
 To do:
 

Modified: subversion/branches/addremove/notes/tree-conflicts/detection.txt
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/tree-conflicts/detection.txt?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/tree-conflicts/detection.txt (original)
+++ subversion/branches/addremove/notes/tree-conflicts/detection.txt Sat May 23 
14:16:56 2020
@@ -8,7 +8,7 @@ in use-cases.txt, for both files and dir
 
 Issue reference:
 
-  http://subversion.tigris.org/issues/show_bug.cgi?id=2282
+  https://issues.apache.org/jira/browse/SVN-2282
 
 ==========
 USE CASE 1

Modified: subversion/branches/addremove/notes/tree-conflicts/use-cases.txt
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/notes/tree-conflicts/use-cases.txt?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/notes/tree-conflicts/use-cases.txt (original)
+++ subversion/branches/addremove/notes/tree-conflicts/use-cases.txt Sat May 23 
14:16:56 2020
@@ -3,8 +3,8 @@
               TREE CONFLICTS USE CASES AND DESIRED BEHAVIOURS
 
 
-Issue reference:  http://subversion.tigris.org/issues/show_bug.cgi?id=2282
-                  http://subversion.tigris.org/issues/show_bug.cgi?id=3630
+Issue reference:  https://issues.apache.org/jira/browse/SVN-2282
+                  https://issues.apache.org/jira/browse/SVN-3630
 
 These use cases are based on a scenario paper "SVN move/rename
 problems & suggested improvements" submitted by a corporate Subversion

Modified: subversion/branches/addremove/subversion/bindings/javahl/README
URL: 
http://svn.apache.org/viewvc/subversion/branches/addremove/subversion/bindings/javahl/README?rev=1878061&r1=1878060&r2=1878061&view=diff
==============================================================================
--- subversion/branches/addremove/subversion/bindings/javahl/README (original)
+++ subversion/branches/addremove/subversion/bindings/javahl/README Sat May 23 
14:16:56 2020
@@ -5,7 +5,7 @@ JavaHL provides a (mostly native, using
 a high level Java API for Subversion, which was originally targeted for
 implementors of GUI clients and IDE plug-ins for Subversion.  JavaHL
 currently provides a minimal-but-complete set of APIs which expose the
-core Subversion C API to Java.  It requires a JRE 1.6+ (runtime).
+core Subversion C API to Java.  It requires a JRE 1.8+ (runtime).
 
 It is currently quite mature, and can be considered for production use.
 
@@ -14,7 +14,7 @@ Build system
 ------------
 
 JavaHL should compile and run under Linux, Win32, and Mac OS X with
-JDK 1.6+ and a C++ compiler with a complete implementation of
+JDK 1.8+ and a C++ compiler with a complete implementation of
 C++98 (for example, GCC 3.2 and older cannot compile JavaHL 1.9+).
 
 Its build will produce both a native library (libsvnjavahl-1.so on Unix
@@ -78,7 +78,7 @@ itself.  The official Subversion C libra
 implementation of a Subversion client's logic, and are the most robust
 client implementation available.  Using JNI allows the effort that has
 gone into the existing libraries to be leveraged from Java, and allows
-developer time to me more efficently spent on further development of the
+developer time to me more efficiently spent on further development of the
 underlying libraries shared by many implementations.
 
 The SVNKit <http://svnkit.com/> client library (formerly known as


Reply via email to