On the svnsync-folder branch: merged changes from trunk@28341:24896.


git-svn-id: https://svn.apache.org/repos/asf/subversion/branches/svnsync-folder@868571 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/CHANGES b/CHANGES
index d3ada16..738538b 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,5 @@
 Version 1.4.6
-(?? ??? 2007, from /branches/1.4.x)
+(14 Dec 2007, from /branches/1.4.x)
 http://svn.collab.net/repos/svn/tags/1.4.6
 
  User-visible changes:
@@ -14,20 +14,22 @@
     * datestamps can be localized (r26156)
     * fixed: text base not updated when merging a replaced file (issue #2698)
     * fixed: inverted 'switch --relocate' error message (r22355)
-    * fixed: sporadic file and directory removal failing on Windows (r25520)
+    * fixed: sporadically failing file and directory removal on Windows (r25520)
     * fixed: property file handling for schedule-delete files (r25833)
+    * fixed: allow invalid svn:eol-style values (r28331)
+    * fixed: 'svnadmin rmlocks' should error when no path provided (r28431)
     * support neon 0.26.4 (r26077)
 
   - Server:
-    * fixed: authz granted if calculation inconclusion (r23815)
+    * fixed: authz granted if calculation inconclusive (r23815)
     * fixed: svndumpfilter crashes on Windows (r23494)
     * fixed: wrong pointer type used for memset (r27263)
-    * fixed: invalid fsfs directory cache can corrupt repository (r27256)
-    * fixed: dir props on fsfs filesystem root never conflict (issue #2608)
+    * fixed: invalid FSFS directory cache can corrupt repository (r27256)
+    * fixed: dir props on FSFS filesystem root never conflict (issue #2608)
 
   - Client and Server:
     * fixed: "No newline at end of file" message translated (issue #2906)
-    * use compressed delta encoding for "svn blame" in svnserve (r26115)
+    * use compressed delta encoding for 'svn blame' in svnserve (r26115)
     * translation updates for Simplified Chinese
 
  Developer-visible changes:
@@ -45,7 +47,7 @@
  User-visible changes:
  * fixed: file placement vulnerability (Win32 clients only)
           See CVE-2007-3846, and descriptive advisory at
-          http://subversion.tigris.org/security/CVE-2007-3864-advisory.txt
+          http://subversion.tigris.org/security/CVE-2007-3846-advisory.txt
 
 
 Version 1.4.4
diff --git a/build.conf b/build.conf
index 04abb63..fc8dc34 100644
--- a/build.conf
+++ b/build.conf
@@ -99,6 +99,7 @@
         subversion/tests/cmdline/depth_tests.py
         subversion/tests/cmdline/svndumpfilter_tests.py
 
+
 bdb-test-scripts =
 
 swig-python-opts = -python -classic
diff --git a/build/generator/gen_win.py b/build/generator/gen_win.py
index 3a92b7f..1ba55d5 100644
--- a/build/generator/gen_win.py
+++ b/build/generator/gen_win.py
@@ -265,7 +265,12 @@
       os.makedirs(self.projfilesdir)
 
     #Here we can add additional platforms to compile for
-    self.platforms = ['Win32','x64']
+    self.platforms = ['Win32']
+    
+    # VS2002 and VS2003 only allow a single platform per project file
+    if subdir == 'vcnet-vcproj':
+      if self.vsnet_version != '7.00' and self.vsnet_version != '8.00':
+        self.platforms = ['Win32','x64']
 
     #Here we can add additional modes to compile for
     self.configs = ['Debug','Release']
@@ -1073,6 +1078,8 @@
     source_template = name + '.ezt'
     data = {
       'version' : self.vsnet_proj_ver,
+      'configs' : self.configs,
+      'platforms' : self.platforms      
       }
     for key, val in params:
       data[key] = val
diff --git a/build/generator/neon.vcproj.ezt b/build/generator/neon.vcproj.ezt
index 73c87ed..472fce0 100644
--- a/build/generator/neon.vcproj.ezt
+++ b/build/generator/neon.vcproj.ezt
@@ -7,14 +7,12 @@
 	SccLocalPath=""
 	Keyword="MakeFileProj">
 	<Platforms>
-		<Platform
-			Name="Win32"/>
-		<Platform
-			Name="x64"/>
-	</Platforms>
+[for platforms]		<Platform
+			Name="[platforms]"/>
+[end]	</Platforms>
 	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
+[for platforms]		<Configuration
+			Name="Debug|[platforms]"
 			OutputDirectory="Debug"
 			IntermediateDirectory="Debug"
 			ConfigurationType="0"
@@ -28,7 +26,7 @@
 				Output="libneonD.lib"/>
 		</Configuration>
 		<Configuration
-			Name="Release|Win32"
+			Name="Release|[platforms]"
 			OutputDirectory="Release"
 			IntermediateDirectory="Release"
 			ConfigurationType="0"
@@ -41,35 +39,7 @@
 				CleanCommandLine="nmake /nologo /f neon.mak CLEAN EXPAT_INC=[expat_path] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"
 				Output="libneon.lib"/>
 		</Configuration>
-		<Configuration
-			Name="Debug|x64"
-			OutputDirectory="Debug"
-			IntermediateDirectory="Debug"
-			ConfigurationType="0"
-			UseOfMFC="0"
-			ATLMinimizesCRunTimeLibraryUsage="FALSE">
-			<Tool
-				Name="VCNMakeTool"
-				BuildCommandLine="nmake /nologo /f neon.mak ALL DEBUG_BUILD=Aye EXPAT_INC=[expat_path] [if-any zlib_path]ZLIB_SRC=[zlib_path] ZLIB_LIBS=[zlib_path]\zlibstatD.lib[end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"
-				ReBuildCommandLine="nmake /nologo /f neon.mak CLEAN ALL DEBUG_BUILD=Aye EXPAT_INC=[expat_path] [if-any zlib_path]ZLIB_SRC=[zlib_path] ZLIB_LIBS=[zlib_path]\zlibstatD.lib[end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"
-				CleanCommandLine="nmake /nologo /f neon.mak CLEAN DEBUG_BUILD=Aye EXPAT_INC=[expat_path] [if-any zlib_path]ZLIB_SRC=[zlib_path] ZLIB_LIBS=[zlib_path]\zlibstatD.lib[end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"
-				Output="libneonD.lib"/>
-		</Configuration>
-		<Configuration
-			Name="Release|x64"
-			OutputDirectory="Release"
-			IntermediateDirectory="Release"
-			ConfigurationType="0"
-			UseOfMFC="0"
-			ATLMinimizesCRunTimeLibraryUsage="FALSE">
-			<Tool
-				Name="VCNMakeTool"
-				BuildCommandLine="nmake /nologo /f neon.mak ALL EXPAT_INC=[expat_path] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"
-				ReBuildCommandLine="nmake /nologo /f neon.mak CLEAN ALL EXPAT_INC=[expat_path] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"
-				CleanCommandLine="nmake /nologo /f neon.mak CLEAN EXPAT_INC=[expat_path] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"
-				Output="libneon.lib"/>
-		</Configuration>
-	</Configurations>
+[end]	</Configurations>
 	<Files>
 		<Filter
 			Name="Source Files"
diff --git a/build/generator/serf.vcproj.ezt b/build/generator/serf.vcproj.ezt
index 801c388..032e1aa 100644
--- a/build/generator/serf.vcproj.ezt
+++ b/build/generator/serf.vcproj.ezt
@@ -7,14 +7,12 @@
     SccLocalPath=""

     Keyword="MakeFileProj">

     <Platforms>

-        <Platform

-            Name="Win32"/>

-		<Platform

-			Name="x64"/>

-    </Platforms>

+[for platforms]		<Platform

+			Name="[platforms]"/>

+[end]	</Platforms>

     <Configurations>

-        <Configuration

-            Name="Debug|Win32"

+[for platforms]        <Configuration

+            Name="Debug|[platforms]"

             OutputDirectory="Debug"

             IntermediateDirectory="Debug"

             ConfigurationType="0"

@@ -28,7 +26,7 @@
                 Output="$(OutDir)\serf.lib"/>

         </Configuration>

         <Configuration

-            Name="Release|Win32"

+            Name="Release|[platforms]"

             OutputDirectory="Release"

             IntermediateDirectory="Release"

             ConfigurationType="0"

@@ -41,35 +39,7 @@
                 CleanCommandLine="nmake /s /nologo /f serf.mak CLEAN APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"

                 Output="$(OutDir)\serf.lib"/>

         </Configuration>

-		<Configuration

-            Name="Debug|x64"

-            OutputDirectory="Debug"

-            IntermediateDirectory="Debug"

-            ConfigurationType="0"

-            UseOfMFC="0"

-            ATLMinimizesCRunTimeLibraryUsage="FALSE">

-			<Tool

-                Name="VCNMakeTool"

-                BuildCommandLine="nmake /s /nologo /f serf.mak ALL DEBUG_BUILD=1 APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"

-                ReBuildCommandLine="nmake /s /nologo /f serf.mak CLEAN ALL DEBUG_BUILD=1 APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"

-                CleanCommandLine="nmake /s /nologo /f serf.mak CLEAN DEBUG_BUILD=1 APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path]  [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"

-                Output="$(OutDir)\serf.lib"/>

-		</Configuration>

-		<Configuration

-            Name="Release|x64"

-            OutputDirectory="Release"

-            IntermediateDirectory="Release"

-            ConfigurationType="0"

-            UseOfMFC="0"

-            ATLMinimizesCRunTimeLibraryUsage="FALSE">

-			<Tool

-                Name="VCNMakeTool"

-                BuildCommandLine="nmake /s /nologo /f serf.mak ALL APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"

-                ReBuildCommandLine="nmake /s /nologo /f serf.mak CLEAN ALL APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path]  [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"

-                CleanCommandLine="nmake /s /nologo /f serf.mak CLEAN APR_SRC=[apr_path] APRUTIL_SRC=[apr_util_path] [if-any zlib_path]ZLIB_SRC=[zlib_path][end] [if-any openssl_path]OPENSSL_SRC=[openssl_path][end]"

-                Output="$(OutDir)\serf.lib"/>

-		</Configuration>

-    </Configurations>

+[end]    </Configurations>

     <Files>

         <Filter

             Name="Source Files"

diff --git a/build/generator/svn_config.vcproj.ezt b/build/generator/svn_config.vcproj.ezt
index 3406525..d219887 100644
--- a/build/generator/svn_config.vcproj.ezt
+++ b/build/generator/svn_config.vcproj.ezt
@@ -7,14 +7,12 @@
 	SccLocalPath=""
 	Keyword="MakeFileProj">
 	<Platforms>
-		<Platform
-			Name="Win32"/>
-		<Platform
-			Name="x64"/>
-	</Platforms>
+[for platforms]		<Platform
+			Name="[platforms]"/>
+[end]	</Platforms>
 	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
+[for platforms][for configs]		<Configuration
+			Name="[configs]|[platforms]"
 			OutputDirectory="."
 			IntermediateDirectory="."
 			ConfigurationType="10"
@@ -32,96 +30,22 @@
 			<Tool
 				Name="VCPreBuildEventTool"/>
 		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="."
-			IntermediateDirectory="."
-			ConfigurationType="10"
-			UseOfMFC="0"
-			ATLMinimizesCRunTimeLibraryUsage="FALSE"
-			DeleteExtensionsOnClean="*.obj;*.ilk;*.pdb;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;$(TargetPath)">
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCMIDLTool"
-				TypeLibraryName="./svn_config.tlb"
-				HeaderFileName=""/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-		</Configuration>
-		<Configuration
-			Name="Debug|x64"
-			OutputDirectory="."
-			IntermediateDirectory="."
-			ConfigurationType="10"
-			UseOfMFC="0"
-			DeleteExtensionsOnClean="*.obj;*.ilk;*.pdb;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;$(TargetPath)"
-			ATLMinimizesCRunTimeLibraryUsage="FALSE">
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCMIDLTool"
-				TypeLibraryName="./svn_config.tlb"
-				HeaderFileName=""/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-		</Configuration>
-		<Configuration
-			Name="Release|x64"
-			OutputDirectory="."
-			IntermediateDirectory="."
-			ConfigurationType="10"
-			UseOfMFC="0"
-			ATLMinimizesCRunTimeLibraryUsage="FALSE"
-			DeleteExtensionsOnClean="*.obj;*.ilk;*.pdb;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;$(TargetPath)">
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCMIDLTool"
-				TypeLibraryName="./svn_config.tlb"
-				HeaderFileName=""/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-		</Configuration>
+[end][end]
 	</Configurations>
 	<Files>
 		<File
 			RelativePath="..\..\subversion\svn_private_config.h">
-			<FileConfiguration
-				Name="Debug|Win32"
+[for platforms][for configs]			<FileConfiguration
+				Name="[configs]|[platforms]"
 				ExcludedFromBuild="TRUE">
 				<Tool
 					Name="VCCustomBuildTool"/>
 			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32"
-				ExcludedFromBuild="TRUE">
-				<Tool
-					Name="VCCustomBuildTool"/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Debug|x64"
-				ExcludedFromBuild="TRUE">
-				<Tool
-					Name="VCCustomBuildTool"/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|x64"
-				ExcludedFromBuild="TRUE">
-				<Tool
-					Name="VCCustomBuildTool"/>
-			</FileConfiguration>
-		</File>
+[end][end]		</File>
 		<File
 			RelativePath="..\..\subversion\svn_private_config.hw">
-			<FileConfiguration
-				Name="Debug|Win32">
+[for platforms][for configs]			<FileConfiguration
+				Name="[configs]|[platforms]">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Creating svn_private_config.h from svn_private_config.hw."
@@ -129,34 +53,7 @@
 "
 					Outputs="..\..\subversion\svn_private_config.h"/>
 			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32">
-				<Tool
-					Name="VCCustomBuildTool"
-					Description="Creating svn_private_config.h from svn_private_config.hw."
-					CommandLine="copy ..\..\subversion\svn_private_config.hw ..\..\subversion\svn_private_config.h &gt; nul
-"
-					Outputs="..\..\subversion\svn_private_config.h"/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Debug|x64">
-				<Tool
-					Name="VCCustomBuildTool"
-					Description="Creating svn_private_config.h from svn_private_config.hw."
-					CommandLine="copy ..\..\subversion\svn_private_config.hw ..\..\subversion\svn_private_config.h &gt; nul
-"
-					Outputs="..\..\subversion\svn_private_config.h"/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|x64">
-				<Tool
-					Name="VCCustomBuildTool"
-					Description="Creating svn_private_config.h from svn_private_config.hw."
-					CommandLine="copy ..\..\subversion\svn_private_config.hw ..\..\subversion\svn_private_config.h &gt; nul
-"
-					Outputs="..\..\subversion\svn_private_config.h"/>
-			</FileConfiguration>
-		</File>
+[end][end]		</File>
 	</Files>
 	<Globals>
 	</Globals>
diff --git a/build/generator/svn_locale.vcproj.ezt b/build/generator/svn_locale.vcproj.ezt
index 214a679..debed0f 100644
--- a/build/generator/svn_locale.vcproj.ezt
+++ b/build/generator/svn_locale.vcproj.ezt
@@ -7,14 +7,12 @@
 	SccLocalPath=""

 	Keyword="MakeFileProj">

 	<Platforms>

-		<Platform

-			Name="Win32"/>

-		<Platform

-			Name="x64"/>

-	</Platforms>

+[for platforms]		<Platform

+			Name="[platforms]"/>

+[end]	</Platforms>

 	<Configurations>

-		<Configuration

-			Name="Debug|Win32"

+[for platforms]		<Configuration

+			Name="Debug|[platforms]"

 			ConfigurationType="0"

 			UseOfMFC="0"

 			ATLMinimizesCRunTimeLibraryUsage="FALSE">

@@ -25,7 +23,7 @@
                         />

 		</Configuration>

 		<Configuration

-			Name="Release|Win32"

+			Name="Release|[platforms]"

 			ConfigurationType="0"

 			UseOfMFC="0"

 			ATLMinimizesCRunTimeLibraryUsage="FALSE">

@@ -35,29 +33,7 @@
 				ReBuildCommandLine="cmd /c build_locale.bat Release"

 			/>

 		</Configuration>

-		<Configuration

-			Name="Debug|x64"

-			ConfigurationType="0"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="FALSE">

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="cmd /c build_locale.bat Debug"

-				ReBuildCommandLine="cmd /c build_locale.bat Debug"

-                        />

-		</Configuration>

-		<Configuration

-			Name="Release|x64"

-			ConfigurationType="0"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="FALSE">

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="cmd /c build_locale.bat Release"

-				ReBuildCommandLine="cmd /c build_locale.bat Release"

-			/>

-		</Configuration>

-	</Configurations>

+[end]	</Configurations>

 	<Files>

 	</Files>

 	<Globals>

diff --git a/build/generator/zlib.vcproj.ezt b/build/generator/zlib.vcproj.ezt
index 701d70c..f5efad9 100644
--- a/build/generator/zlib.vcproj.ezt
+++ b/build/generator/zlib.vcproj.ezt
@@ -7,14 +7,12 @@
 	SccLocalPath=""

 	Keyword="MakeFileProj">

 	<Platforms>

-		<Platform

-			Name="Win32"/>

-		<Platform

-			Name="x64"/>

-	</Platforms>

+[for platforms]		<Platform

+			Name="[platforms]"/>

+[end]	</Platforms>

 	<Configurations>

-		<Configuration

-			Name="Debug|Win32"

+[for platforms]		<Configuration

+			Name="Debug|[platforms]"

 			OutputDirectory="[zlib_path]\Debug"

 			IntermediateDirectory="[zlib_path]\Debug"

 			ConfigurationType="0"

@@ -28,7 +26,7 @@
 				Output="[zlib_path]\zlibstatD.lib"/>

 		</Configuration>

 		<Configuration

-			Name="Release|Win32"

+			Name="Release|[platforms]"

 			OutputDirectory="[zlib_path]\Release"

 			IntermediateDirectory="[zlib_path]\Release"

 			ConfigurationType="0"

@@ -41,35 +39,7 @@
 				CleanCommandLine="cmd /c build_zlib.bat release clean"

 				Output="[zlib_path]\zlibstat.lib"/>

 		</Configuration>

-		<Configuration

-			Name="Debug|x64"

-			OutputDirectory="[zlib_path]\Debug"

-			IntermediateDirectory="[zlib_path]\Debug"

-			ConfigurationType="0"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="FALSE">

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="cmd /c build_zlib.bat debug"

-				ReBuildCommandLine="cmd /c build_zlib.bat debug rebuild"

-				CleanCommandLine="cmd /c build_zlib.bat debug clean"

-				Output="[zlib_path]\zlibstatD.lib"/>

-		</Configuration>

-		<Configuration

-			Name="Release|x64"

-			OutputDirectory="[zlib_path]\Release"

-			IntermediateDirectory="[zlib_path]\Release"

-			ConfigurationType="0"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="FALSE">

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="cmd /c build_zlib.bat release"

-				ReBuildCommandLine="cmd /c build_zlib.bat release rebuild"

-				CleanCommandLine="cmd /c build_zlib.bat release clean"

-				Output="[zlib_path]\zlibstat.lib"/>

-		</Configuration>

-	</Configurations>

+[end]	</Configurations>

 	<Files>

 		<Filter

 			Name="Source Files"

diff --git a/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java b/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java
index a612562..1b1cd92 100644
--- a/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java
+++ b/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java
@@ -2532,6 +2532,19 @@
         assertFileContentsEquals("Unexpected diff output in file '" +
                                  diffOutput.getPath() + '\'',
                                  expectedDiffOutput, diffOutput);
+
+        // Test diff where relativeToDir and path are the same.
+        expectedDiffOutput = NL + "Property changes on: ." + NL +
+            underSepLine +
+            "Added: testprop" + NL +
+            "   + Test property value." + NL + NL;
+
+        client.propertySet(aPath, "testprop", "Test property value.", false);
+        client.diff(aPath, Revision.BASE, aPath, Revision.WORKING, aPath,
+                    diffOutput.getPath(), Depth.infinity, true, true, false);
+        assertFileContentsEquals("Unexpected diff output in file '" +
+                                 diffOutput.getPath() + '\'',
+                                 expectedDiffOutput, diffOutput);
         
         
         /*
diff --git a/subversion/bindings/swig/INSTALL b/subversion/bindings/swig/INSTALL
index e3c3e4f..79c5ffc 100644
--- a/subversion/bindings/swig/INSTALL
+++ b/subversion/bindings/swig/INSTALL
@@ -5,7 +5,7 @@
 * Python
 
   The Python bindings are fairly well developed, although there are some
-  missing parts, most notably, there is no useful wrapping of the svn_ra APIs.
+  missing parts.
 
   (N.B. As discussed below, they will not compile in Debug mode on Windows.)
 
diff --git a/subversion/bindings/swig/python/svn/core.py b/subversion/bindings/swig/python/svn/core.py
index 5141075..7e61534 100644
--- a/subversion/bindings/swig/python/svn/core.py
+++ b/subversion/bindings/swig/python/svn/core.py
@@ -21,12 +21,13 @@
 import atexit as _atexit
 
 class SubversionException(Exception):
-  def __init__(self, apr_err, message=None, child=None, file=None, line=None):
+  def __init__(self, message=None, apr_err=None, child=None,
+               file=None, line=None):
     """Initialize a new Subversion exception object.
 
     Arguments:
-    apr_err     -- integer error code (apr_status_t)
     message     -- optional user-visible error message
+    apr_err     -- optional integer error code (apr_status_t)
     child       -- optional SubversionException to wrap
     file        -- optional source file name where the error originated
     line        -- optional line number of the source file
@@ -34,9 +35,19 @@
     file and line are for C, not Python; they are redundant to the
     traceback information for exceptions raised in Python.
     """
-    # Pass only message and apr_err (and in this order) so .args will
-    # be (message, apr_err) just as in svn 1.4 and older.
-    Exception.__init__(self, message, apr_err)
+    # Be compatible with pre-1.5 .args behavior:
+    args = []
+    if message is None:
+      # SubversionException().args => ()
+      pass
+    else:
+      # SubversionException('message').args => ('message',)
+      args.append(message)
+      if apr_err is not None:
+        # SubversionException('message', 123) => ('message', 123)
+        args.append(apr_err)
+    Exception.__init__(self, *args)
+
     self.apr_err = apr_err
     self.message = message
     self.child = child
@@ -59,7 +70,7 @@
     child = None
     errors.reverse()
     for (apr_err, message, file, line) in errors:
-      child = cls(apr_err, message, child, file, line)
+      child = cls(message, apr_err, child, file, line)
     return child
   # Don't use @classmethod, we support 2.2.
   _new_from_err_list = classmethod(_new_from_err_list)
diff --git a/subversion/bindings/swig/python/tests/auth.py b/subversion/bindings/swig/python/tests/auth.py
new file mode 100644
index 0000000..cc436b2
--- /dev/null
+++ b/subversion/bindings/swig/python/tests/auth.py
@@ -0,0 +1,76 @@
+import unittest, os, setup_path
+
+from svn import core
+
+class SubversionAuthTestCase(unittest.TestCase):
+  """Test cases for the Subversion auth."""
+
+  def test_open(self):
+    baton = core.svn_auth_open([])
+    self.assert_(baton is not None)
+
+  def test_set_parameter(self):
+    baton = core.svn_auth_open([])
+    core.svn_auth_set_parameter(baton, "name", "somedata")
+
+  def test_invalid_cred_kind(self):
+    baton = core.svn_auth_open([])
+    self.assertRaises(core.SubversionException, 
+            lambda: core.svn_auth_first_credentials(
+                "unknown", "somerealm", baton))
+
+  def test_credentials_get_username(self):
+    def myfunc(realm, maysave, pool):
+      self.assertEquals("somerealm", realm)
+      username_cred = core.svn_auth_cred_username_t()
+      username_cred.username = "bar"
+      username_cred.may_save = False
+      return username_cred
+    baton = core.svn_auth_open([core.svn_auth_get_username_prompt_provider(myfunc, 1)])
+    creds = core.svn_auth_first_credentials(
+                core.SVN_AUTH_CRED_USERNAME, "somerealm", baton)
+    self.assert_(creds is not None)
+
+  def test_credentials_get_simple(self):
+    def myfunc(realm, username, may_save, pool):
+      self.assertEquals("somerealm", realm)
+      simple_cred = core.svn_auth_cred_simple_t()
+      simple_cred.username = "mijnnaam"
+      simple_cred.password = "geheim"
+      simple_cred.may_save = False
+      return simple_cred
+    baton = core.svn_auth_open([core.svn_auth_get_simple_prompt_provider(myfunc, 1)])
+    creds = core.svn_auth_first_credentials(
+                core.SVN_AUTH_CRED_SIMPLE, "somerealm", baton)
+    self.assert_(creds is not None)
+
+  def test_credentials_get_ssl_client_cert(self):
+    def myfunc(realm, may_save, pool):
+      self.assertEquals("somerealm", realm)
+      ssl_cred = core.svn_auth_cred_ssl_client_cert_t()
+      ssl_cred.cert_file = "my-certs-file"
+      ssl_cred.may_save = False
+      return ssl_cred
+    baton = core.svn_auth_open([core.svn_auth_get_ssl_client_cert_prompt_provider(myfunc, 1)])
+    creds = core.svn_auth_first_credentials(
+                core.SVN_AUTH_CRED_SSL_CLIENT_CERT, "somerealm", baton)
+    self.assert_(creds is not None)
+
+  def test_credentials_get_ssl_client_cert_pw(self):
+    def myfunc(realm, may_save, pool):
+      self.assertEquals("somerealm", realm)
+      ssl_cred_pw = core.svn_auth_cred_ssl_client_cert_pw_t()
+      ssl_cred_pw.password = "supergeheim"
+      ssl_cred_pw.may_save = False
+      return ssl_cred_pw
+    baton = core.svn_auth_open([core.svn_auth_get_ssl_client_cert_pw_prompt_provider(myfunc, 1)])
+    creds = core.svn_auth_first_credentials(
+                core.SVN_AUTH_CRED_SSL_CLIENT_CERT_PW, "somerealm", baton)
+    self.assert_(creds is not None)
+
+def suite():
+    return unittest.makeSuite(SubversionAuthTestCase, 'test')
+
+if __name__ == '__main__':
+    runner = unittest.TextTestRunner()
+    runner.run(suite())
diff --git a/subversion/bindings/swig/python/tests/core.py b/subversion/bindings/swig/python/tests/core.py
new file mode 100644
index 0000000..d0a590c
--- /dev/null
+++ b/subversion/bindings/swig/python/tests/core.py
@@ -0,0 +1,29 @@
+import unittest, os
+
+import svn.core
+
+class SubversionCoreTestCase(unittest.TestCase):
+  """Test cases for the basic SWIG Subversion core"""
+
+  def test_SubversionException(self):
+    self.assertEqual(svn.core.SubversionException().args, ())
+    self.assertEqual(svn.core.SubversionException('error message').args,
+                     ('error message',))
+    self.assertEqual(svn.core.SubversionException('error message', 1).args,
+                     ('error message', 1))
+
+  def test_mime_type_is_binary(self):
+    self.assertEqual(0, svn.core.svn_mime_type_is_binary("text/plain"))
+    self.assertEqual(1, svn.core.svn_mime_type_is_binary("image/png"))
+
+  def test_mime_type_validate(self):
+    self.assertRaises(svn.core.SubversionException, 
+            svn.core.svn_mime_type_validate, "this\nis\ninvalid\n")
+    svn.core.svn_mime_type_validate("unknown/but-valid; charset=utf8")
+
+def suite():
+    return unittest.makeSuite(SubversionCoreTestCase, 'test')
+
+if __name__ == '__main__':
+    runner = unittest.TextTestRunner()
+    runner.run(suite())
diff --git a/subversion/bindings/swig/python/tests/mergeinfo.py b/subversion/bindings/swig/python/tests/mergeinfo.py
index a1c9db6..3418873 100644
--- a/subversion/bindings/swig/python/tests/mergeinfo.py
+++ b/subversion/bindings/swig/python/tests/mergeinfo.py
@@ -4,7 +4,7 @@
 from svn.core import SubversionException
 
 class SubversionMergeinfoTestCase(unittest.TestCase):
-  """Test cases for the basic SWIG Subversion core"""
+  """Test cases for mergeinfo"""
 
   # Some textual mergeinfo.
   TEXT_MERGEINFO1 = "/trunk:3-9,27,42*"
diff --git a/subversion/bindings/swig/python/tests/run_all.py b/subversion/bindings/swig/python/tests/run_all.py
index f8cf20b..66fbf36 100644
--- a/subversion/bindings/swig/python/tests/run_all.py
+++ b/subversion/bindings/swig/python/tests/run_all.py
@@ -1,5 +1,5 @@
 import sys, os, unittest, setup_path
-import mergeinfo, client, delta, pool, ra, wc, repository, \
+import mergeinfo, core, client, delta, pool, ra, wc, repository, auth, \
        trac.versioncontrol.tests
 
 # Run all tests
@@ -7,6 +7,7 @@
 def suite():
   """Run all tests"""
   suite = unittest.TestSuite()
+  suite.addTest(core.suite())
   suite.addTest(mergeinfo.suite())
   suite.addTest(client.suite())
   suite.addTest(delta.suite())
@@ -14,6 +15,7 @@
   suite.addTest(ra.suite())
   suite.addTest(wc.suite())
   suite.addTest(repository.suite())
+  suite.addTest(auth.suite())
   suite.addTest(trac.versioncontrol.tests.suite());
   return suite
 
diff --git a/subversion/include/svn_error_codes.h b/subversion/include/svn_error_codes.h
index aa61e50..c4f4b5b 100644
--- a/subversion/include/svn_error_codes.h
+++ b/subversion/include/svn_error_codes.h
@@ -841,7 +841,7 @@
   /** @since New in 1.5. */
   SVN_ERRDEF(SVN_ERR_RA_SERF_SSPI_INITIALISATION_FAILED,
              SVN_ERR_RA_SERF_CATEGORY_START + 0,
-             "Client/server version mismatch")
+             "Initialization of SSPI library failed")
 
   /* libsvn_auth errors */
 
diff --git a/subversion/include/svn_mergeinfo.h b/subversion/include/svn_mergeinfo.h
index 07cee3a..00c1db0 100644
--- a/subversion/include/svn_mergeinfo.h
+++ b/subversion/include/svn_mergeinfo.h
@@ -226,15 +226,15 @@
 
 /** Find the intersection of two rangelists consisting of @c
  * svn_merge_range_t * elements, @a rangelist1 and @a rangelist2, and
- * place the result in @a output.
+ * place the result in @a *rangelist (which is never @c NULL).
  *
  * Note: @a rangelist1 and @a rangelist2 must be sorted as said by @c
- * svn_sort_compare_ranges(). @a output is guaranteed to be in sorted
+ * svn_sort_compare_ranges(). @a *rangelist is guaranteed to be in sorted
  * order.
  * @since New in 1.5.
  */
 svn_error_t *
-svn_rangelist_intersect(apr_array_header_t **output,
+svn_rangelist_intersect(apr_array_header_t **rangelist,
                         apr_array_header_t *rangelist1,
                         apr_array_header_t *rangelist2,
                         apr_pool_t *pool);
diff --git a/subversion/include/svn_types.h b/subversion/include/svn_types.h
index 8483973..6b844cf 100644
--- a/subversion/include/svn_types.h
+++ b/subversion/include/svn_types.h
@@ -854,21 +854,23 @@
  */
 typedef enum
 {
-  /* Explicit mergeinfo only */
+  /** Explicit mergeinfo only. */
   svn_mergeinfo_explicit,
 
-  /* Explicit mergeinfo, or if that doesn't exist, the inherited mergeinfo
-     from a target's nearest ancestor */
+  /** Explicit mergeinfo, or if that doesn't exist, the inherited
+      mergeinfo from a target's nearest (path-wise, not history-wise)
+      ancestor. */ 
   svn_mergeinfo_inherited,
 
-  /* Mergeinfo on target's nearest ancestor, regardless of whether target
-     has explict mergeinfo */
+  /** Mergeinfo on target's nearest (path-wise, not history-wise)
+      ancestor, regardless of whether target has explict mergeinfo. */
   svn_mergeinfo_nearest_ancestor
 } svn_mergeinfo_inheritance_t;
 
 
 
-/* Node location segment reporting. */
+/** @defgroup node_location_seg_reporting Node location segment reporting.
+ *  @{ */
 
 /**
  * A representation of a segment of a object's version history with an
@@ -912,6 +914,8 @@
 svn_location_segment_dup(svn_location_segment_t *segment,
                          apr_pool_t *pool);
 
+/** @} */
+
 
 /** Return a constant string expressing @a inherit as an English word,
  * i.e., "explicit" (default), "inherited", or "nearest_ancestor".
diff --git a/subversion/libsvn_client/copy.c b/subversion/libsvn_client/copy.c
index 027464b..5acf276 100644
--- a/subversion/libsvn_client/copy.c
+++ b/subversion/libsvn_client/copy.c
@@ -66,13 +66,15 @@
 /* Obtain the implied mergeinfo and the existing mergeinfo of the
    source path, combine them and return the result in
    *TARGET_MERGEINFO.  ADM_ACCESS may be NULL, if SRC_PATH_OR_URL is an
-   URL. */
+   URL.  If NO_REPOS_ACCESS is set, this function is disallowed from
+   consulting the repository about anything.  */
 static svn_error_t *
 calculate_target_mergeinfo(svn_ra_session_t *ra_session,
                            apr_hash_t **target_mergeinfo,
                            svn_wc_adm_access_t *adm_access,
                            const char *src_path_or_url,
                            svn_revnum_t src_revnum,
+                           svn_boolean_t no_repos_access,
                            svn_client_ctx_t *ctx,
                            apr_pool_t *pool)
 {
@@ -109,18 +111,29 @@
     {
       const char *mergeinfo_path;
 
-      /* Fetch any existing (explicit) mergeinfo. */
-      SVN_ERR(svn_client__path_relative_to_root(&mergeinfo_path, src_url,
-                                                entry ? entry->repos : NULL, 
-                                                FALSE, ra_session,
-                                                adm_access, pool));
-      SVN_ERR(svn_client__get_repos_mergeinfo(ra_session, &src_mergeinfo,
-                                              mergeinfo_path, src_revnum,
-                                              svn_mergeinfo_inherited, TRUE,
-                                              pool));
+      if (! no_repos_access)
+        {
+          /* Fetch any existing (explicit) mergeinfo. */
+          SVN_ERR(svn_client__path_relative_to_root(&mergeinfo_path, src_url,
+                                                    entry ? entry->repos : NULL, 
+                                                    FALSE, ra_session,
+                                                    adm_access, pool));
+          SVN_ERR(svn_client__get_repos_mergeinfo(ra_session, &src_mergeinfo,
+                                                  mergeinfo_path, src_revnum,
+                                                  svn_mergeinfo_inherited, TRUE,
+                                                  pool));
+        }
+      else
+        {
+          svn_boolean_t inherited;
+          SVN_ERR(svn_client__get_wc_mergeinfo(&src_mergeinfo, &inherited,
+                                               FALSE, svn_mergeinfo_inherited,
+                                               entry, src_path_or_url, NULL,
+                                               NULL, adm_access, ctx, pool));
+        }
     }
 
-  *target_mergeinfo = src_mergeinfo ? src_mergeinfo : apr_hash_make(pool);
+  *target_mergeinfo = src_mergeinfo;
   return SVN_NO_ERROR;
 }
 
@@ -139,9 +152,9 @@
                                       FALSE, adm_access, ctx, pool));
 
   /* Combine the provided mergeinfo with any mergeinfo from the WC. */
-  if (wc_mergeinfo)
+  if (wc_mergeinfo && mergeinfo)
     SVN_ERR(svn_mergeinfo_merge(wc_mergeinfo, mergeinfo, pool));
-  else
+  else if (! wc_mergeinfo)
     wc_mergeinfo = mergeinfo;
 
   return svn_client__record_wc_mergeinfo(target_wcpath, wc_mergeinfo,
@@ -185,13 +198,19 @@
          different code path. */
       SVN_ERR(calculate_target_mergeinfo(ra_session, &mergeinfo, 
                                          src_access, pair->src, 
-                                         pair->src_revnum, ctx, pool));
+                                         pair->src_revnum, TRUE, 
+                                         ctx, pool));
       
+      /* NULL mergeinfo could be due to there being no mergeinfo.  But
+         it could also be due to us not being able to query the server
+         about mergeinfo on some parent directory of ours.  We need to
+         turn "no mergeinfo" into "empty mergeinfo", just in case. */
+      if (! mergeinfo)
+        mergeinfo = apr_hash_make(pool);
+
       /* Because any local mergeinfo from the copy source will have
          already been propagated to the destination, we can avoid
-         looking at WC-local mergeinfo for the source.
-         
-         Now, add the implied mergeinfo to the destination. */
+         looking at WC-local mergeinfo for the source. */
       SVN_ERR(svn_wc__entry_versioned(&entry, pair->dst, dst_access, FALSE,
                                       pool));
       
@@ -975,8 +994,9 @@
       apr_hash_t *mergeinfo;
       SVN_ERR(calculate_target_mergeinfo(ra_session, &mergeinfo, NULL,
                                          info->src_url, info->src_revnum, 
-                                         ctx, pool));
-      SVN_ERR(svn_mergeinfo__to_string(&info->mergeinfo, mergeinfo, pool));
+                                         FALSE, ctx, pool));
+      if (mergeinfo)
+        SVN_ERR(svn_mergeinfo__to_string(&info->mergeinfo, mergeinfo, pool));
 
       APR_ARRAY_PUSH(paths, const char *) = info->dst_path;
       if (is_move && (! info->resurrection))
@@ -1250,16 +1270,19 @@
       mergeinfo_prop->name = SVN_PROP_MERGEINFO;
       SVN_ERR(calculate_target_mergeinfo(ra_session, &mergeinfo, adm_access, 
                                          pair->src, pair->src_revnum, 
-                                         ctx, pool));
+                                         FALSE, ctx, pool));
       SVN_ERR(svn_wc_entry(&entry, pair->src, adm_access, FALSE, pool));
       SVN_ERR(svn_client__parse_mergeinfo(&wc_mergeinfo, entry,
                                           pair->src, FALSE, adm_access, ctx,
                                           pool));
-      if (wc_mergeinfo)
+      if (wc_mergeinfo && mergeinfo)
         SVN_ERR(svn_mergeinfo_merge(mergeinfo, wc_mergeinfo, pool));
-      SVN_ERR(svn_mergeinfo__to_string((svn_string_t **)
-                                       &mergeinfo_prop->value,
-                                       mergeinfo, pool));
+      else if (! mergeinfo)
+        mergeinfo = wc_mergeinfo;
+      if (mergeinfo)
+        SVN_ERR(svn_mergeinfo__to_string((svn_string_t **)
+                                         &mergeinfo_prop->value,
+                                         mergeinfo, pool));
       APR_ARRAY_PUSH(item->outgoing_prop_changes, svn_prop_t *) =
         mergeinfo_prop;
     }
@@ -1369,7 +1392,7 @@
              ### source path. */
           SVN_ERR(calculate_target_mergeinfo(ra_session, &src_mergeinfo, NULL, 
                                              pair->src, src_revnum, 
-                                             ctx, pool));
+                                             FALSE, ctx, pool));
           SVN_ERR(extend_wc_mergeinfo(pair->dst, dst_entry, src_mergeinfo,
                                       dst_access, ctx, pool));
         }
@@ -1426,7 +1449,7 @@
       SVN_ERR(svn_wc_entry(&dst_entry, pair->dst, adm_access, FALSE, pool));
       SVN_ERR(calculate_target_mergeinfo(ra_session, &src_mergeinfo,
                                          NULL, pair->src, src_revnum, 
-                                         ctx, pool));
+                                         FALSE, ctx, pool));
       SVN_ERR(extend_wc_mergeinfo(pair->dst, dst_entry, src_mergeinfo,
                                   adm_access, ctx, pool));
 
diff --git a/subversion/libsvn_client/diff.c b/subversion/libsvn_client/diff.c
index 56791c9..925232e 100644
--- a/subversion/libsvn_client/diff.c
+++ b/subversion/libsvn_client/diff.c
@@ -185,6 +185,8 @@
 
       if (child_path)
         path = child_path;
+      else if (!svn_path_compare_paths(relative_to_dir, path))
+        path = ".";
       else
         return MAKE_ERR_BAD_RELATIVE_PATH(path, relative_to_dir);
     }
@@ -481,6 +483,8 @@
 
       if (child_path)
         path = child_path;
+      else if (!svn_path_compare_paths(rel_to_dir, path))
+        path = ".";
       else
         return MAKE_ERR_BAD_RELATIVE_PATH(path, rel_to_dir);
 
@@ -488,6 +492,8 @@
 
       if (child_path)
         path1 = child_path;
+      else if (!svn_path_compare_paths(rel_to_dir, path1))
+        path1 = ".";
       else
         return MAKE_ERR_BAD_RELATIVE_PATH(path1, rel_to_dir);
 
@@ -495,6 +501,8 @@
 
       if (child_path)
         path2 = child_path;
+      else if (!svn_path_compare_paths(rel_to_dir, path2))
+        path2 = ".";
       else
         return MAKE_ERR_BAD_RELATIVE_PATH(path2, rel_to_dir);
     }
diff --git a/subversion/libsvn_client/merge.c b/subversion/libsvn_client/merge.c
index eb000d5..3d5d530 100644
--- a/subversion/libsvn_client/merge.c
+++ b/subversion/libsvn_client/merge.c
@@ -888,47 +888,6 @@
   return SVN_NO_ERROR;
 }
 
-/* Struct used for as the baton for calling merge_delete_notify_func(). */
-typedef struct merge_delete_notify_baton_t
-{
-  svn_client_ctx_t *ctx;
-
-  /* path to skip */
-  const char *path_skip;
-} merge_delete_notify_baton_t;
-
-/* Notify callback function that wraps the normal callback
-   function to remove a notification that will be sent twice
-   and set the proper action. */
-static void
-merge_delete_notify_func(void *baton,
-                         const svn_wc_notify_t *notify,
-                         apr_pool_t *pool)
-{
-  merge_delete_notify_baton_t *mdb = baton;
-  svn_wc_notify_t *new_notify;
-
-  /* Skip the notification for the path we called svn_client__wc_delete() with,
-     because it will be outputed by repos_diff.c:delete_item */
-  if (strcmp(notify->path, mdb->path_skip) == 0)
-    return;
-
-  /* svn_client__wc_delete() is written primarily for scheduling operations not
-     update operations.  Since merges are update operations we need to alter
-     the delete notification to show as an update not a schedule so alter
-     the action. */
-  if (notify->action == svn_wc_notify_delete)
-    {
-      /* We need to copy it since notify is const. */
-      new_notify = svn_wc_dup_notify(notify, pool);
-      new_notify->action = svn_wc_notify_update_delete;
-      notify = new_notify;
-    }
-
-  if (mdb->ctx->notify_func2)
-    (*mdb->ctx->notify_func2)(mdb->ctx->notify_baton2, notify, pool);
-}
-
 /* A svn_wc_diff_callbacks2_t function. */
 static svn_error_t *
 merge_dir_deleted(svn_wc_adm_access_t *adm_access,
@@ -2125,7 +2084,7 @@
    which have mergeinfo set on them or meet one of the other criteria
    defined in get_mergeinfo_paths().  Remove any paths absent from disk
    or scheduled for deletion from CHILDREN_WITH_MERGEINFO which are equal to
-   or are descendents of TARGET_WCPATH by setting those children to NULL.
+   or are descendants of TARGET_WCPATH by setting those children to NULL.
    Also remove the path from the NOTIFY_B->SKIPPED_PATHS hash. */
 static void
 remove_absent_children(const char *target_wcpath,
@@ -2177,6 +2136,8 @@
 /* Sets up the diff editor report and drives it by properly negating
    subtree that could have a conflicting merge history.
 
+   MERGE_B->ra_session1 reflects URL1; MERGE_B->ra_session2 reflects URL2.
+
    If MERGE_B->sources_ancestral is set, then URL1@REVISION1 must be a
    historical ancestor of URL2@REVISION2, or vice-versa (see
    `MERGEINFO MERGE SOURCE NORMALIZATION' for more requirements around
@@ -2203,14 +2164,10 @@
   void *report_baton;
   svn_revnum_t default_start;
   svn_boolean_t honor_mergeinfo;
+  const char *old_sess2_url;
 
   mergeinfo_behavior(&honor_mergeinfo, NULL, merge_b);
 
-  /* Establish first RA session to URL1. */
-  SVN_ERR(svn_client__open_ra_session_internal(&merge_b->ra_session1, url1,
-                                               NULL, NULL, NULL, FALSE, TRUE,
-                                               merge_b->ctx, pool));
-
   /* Calculate the default starting revision. */
   default_start = revision1;
   if (honor_mergeinfo)
@@ -2234,15 +2191,13 @@
         }
     }
 
-  /* Open a second session used to request individual file
-     contents. Although a session can be used for multiple requests, it
-     appears that they must be sequential. Since the first request, for
-     the diff, is still being processed the first session cannot be
-     reused. This applies to ra_neon, ra_local does not appears to have
-     this limitation. */
-  SVN_ERR(svn_client__open_ra_session_internal(&merge_b->ra_session2, url1,
-                                               NULL, NULL, NULL, FALSE, TRUE,
-                                               merge_b->ctx, pool));
+  /* Temporarily point our second RA session to URL1, too.  We use
+     this to request individual file contents. */
+  SVN_ERR(svn_client__ensure_ra_session_url(&old_sess2_url, 
+                                            merge_b->ra_session2, url1, pool));
+  
+  /* Get the diff editor and a reporter with which to, ultimately,
+     drive it. */
   SVN_ERR(svn_client__get_diff_editor(target_wcpath, adm_access, callbacks,
                                       merge_b, depth, merge_b->dry_run,
                                       merge_b->ra_session2, default_start,
@@ -2251,16 +2206,15 @@
                                       merge_b->ctx->cancel_baton,
                                       &diff_editor, &diff_edit_baton,
                                       pool));
-
   SVN_ERR(svn_ra_do_diff3(merge_b->ra_session1,
                           &reporter, &report_baton, revision2,
                           "", depth, merge_b->ignore_ancestry, 
                           TRUE,  /* text_deltas */
                           url2, diff_editor, diff_edit_baton, pool));
 
+  /* Drive the reporter. */
   SVN_ERR(reporter->set_path(report_baton, "", default_start, depth,
                              FALSE, NULL, pool));
-
   if (honor_mergeinfo && children_with_mergeinfo)
     {
       /* Describe children with mergeinfo overlapping this merge
@@ -2302,9 +2256,12 @@
             }
         }
     }
-  
   SVN_ERR(reporter->finish_report(report_baton, pool));
 
+  /* Point the merge baton's second session back where it was. */
+  if (old_sess2_url)
+    SVN_ERR(svn_ra_reparent(merge_b->ra_session2, old_sess2_url, pool));
+
   /* Sleep to ensure timestamp integrity. */
   svn_sleep_for_timestamps();
 
@@ -2480,7 +2437,7 @@
   svn_boolean_t indirect;
   apr_hash_t *merges = apr_hash_make(pool);
   svn_boolean_t is_rollback = (range->start > range->end);
-
+  
   /* Temporarily reparent ra_session to WC target URL. */
   SVN_ERR(svn_ra_reparent(merge_b->ra_session1, entry->url, pool));
   SVN_ERR(svn_client__get_wc_or_repos_mergeinfo(&target_mergeinfo, entry,
@@ -2686,10 +2643,21 @@
   apr_array_header_t *children_with_mergeinfo;
   /* Merge source canonical path. */
   const char* merge_src_canon_path;
-  /* Merge target path. */
+  
+  /* Information on the merge cascaded from do_directory_merge() */
   const char* merge_target_path;
+  const char *source_root_url;
+  const char* url1;
+  const char* url2;
+  svn_revnum_t revision1;
+  svn_revnum_t revision2;
+  
   /* merge depth requested. */
   svn_depth_t depth;
+  
+  /* RA session and client context cascaded from do_directory_merge() */
+  svn_ra_session_t *ra_session;
+  svn_client_ctx_t *ctx;
 };
 
 
@@ -2769,7 +2737,132 @@
           SVN_ERR(svn_mergeinfo_parse(&mergehash, propval->data, pool));
           if (apr_hash_get(mergehash, merge_src_child_path->data,
                            APR_HASH_KEY_STRING))
-            has_mergeinfo_from_merge_src = TRUE;
+            {
+              /* The easy way: PATH already has mergeinfo
+                 from this source... */
+              has_mergeinfo_from_merge_src = TRUE;
+            }
+          else
+            {
+              /* ...the slightly harder way: See if PATH exists in the
+                 merge source at the revisions being merged. If it doesn't
+                 exist there is no way this subtree can be affected by the
+                 merge so we can safely leave it, and its mergeinfo, alone. */
+              svn_error_t *err;
+              const char *original_ra_url;
+              const char *mergeinfo_url =
+                svn_path_join(wb->source_root_url,
+                              /* Skip leading '/' or join won't work. */
+                              ++(merge_src_child_path->data),
+                              pool);
+              svn_opt_revision_t *start_revision, *end_revision;
+              const char *start_url, *end_url;
+              svn_opt_revision_t peg_rev, rev1_opt, rev2_opt;
+                      
+              peg_rev.value.number = wb->revision1 < wb->revision2
+                ? wb->revision2 : wb->revision1;
+              peg_rev.kind = svn_opt_revision_number;
+              
+              rev1_opt.kind = svn_opt_revision_number;
+              rev1_opt.value.number = wb->revision1;
+                  
+              rev2_opt.kind = svn_opt_revision_number;
+              rev2_opt.value.number = wb->revision2;
+              
+              /* Instead of passing NULL to svn_client__repos_locations() and
+                 causing another session to open, reparent WB->RA_SESSION
+                 and use that. */
+              SVN_ERR(svn_ra_get_session_url(wb->ra_session, &original_ra_url,
+                                             pool));
+              SVN_ERR(svn_ra_reparent(wb->ra_session, mergeinfo_url, pool));
+
+              /* Does PATH exist in the merge source? */
+              err = svn_client__repos_locations(&start_url, &start_revision,
+                                                &end_url, &end_revision,
+                                                wb->ra_session, mergeinfo_url,
+                                                &peg_rev, &rev1_opt, &rev2_opt,
+                                                wb->ctx, pool);
+              if (err)
+                {
+                  /* We might see any of these errors depending on the RA
+                     access method, but they all mean that PATH doesn't exist
+                     in the merge source.
+                     
+                     ### TODO: Make svn_client__repos_locations() more
+                     ###       consistent in the error it returns(?)
+                     */
+                  if (err->apr_err == SVN_ERR_FS_NOT_FOUND
+                      || err->apr_err == SVN_ERR_RA_DAV_PATH_NOT_FOUND
+                      || err->apr_err == SVN_ERR_CLIENT_UNRELATED_RESOURCES)
+                    svn_error_clear(err);
+                  else
+                    return err;
+                }
+
+              /* Reparent the WB->RA_SESSION to its original URL. */
+              SVN_ERR(svn_ra_reparent(wb->ra_session, original_ra_url, pool));
+
+              if (!err) /* PATH does exist in the merge source*/
+                {
+                  if (propval->len > 0)
+                    {
+                      has_mergeinfo_from_merge_src = TRUE;
+                    }
+                  else /* Handle the special case of empty mergeinfo */
+                    {
+                      /* WC->WC copies (and moves) can't contact the server
+                         and so leave empty mergefino on the copy target to
+                         prevent it from erroneously inheriting the incorrect
+                         mergeinfo from the repos (if any exists) during a
+                         merge.  Reverse merges may also leave empty mergeinfo
+                         on a path so this state is not exclusive to WC->WC
+                         copies.
+                         
+                         Because the WC->WC copy behavior is a safety net,
+                         the empty mergeinfo on a path *may* not actually
+                         override anything.  In the case where this is true,
+                         we don't need to treat PATH as a subtree with
+                         intersecting mergeinfo, we can simply merge into
+                         PATH's parent (which may be the merge target
+                         itself)...
+
+                         ...So, if we find empty mergeinfo on PATH see if
+                         PATH has any ancestor with mergeinfo. */
+                      apr_hash_t *overidden_mergeinfo;
+                      svn_boolean_t indirect;
+                      SVN_ERR(svn_client__get_wc_or_repos_mergeinfo(
+                        &overidden_mergeinfo, entry,
+                        &indirect, FALSE, svn_mergeinfo_nearest_ancestor,
+                        wb->ra_session, path, wb->base_access, wb->ctx,
+                        pool));
+                      if (indirect)
+                        {
+                          /* Ok, we found empty mergeinfo which overrides some
+                             parent with mergeinfo.  Time for one final
+                             optimization: If the mergeinfo overridden is
+                             *also* empty, then we can perform some preemptive
+                             elision right now and remove the empty mergeinfo
+                             from PATH.  Even if the overriden parent is in
+                             the repository it's ok, since the merge target
+                             *always* gets mergeinfo set (though it may
+                             elide).*/
+                          svn_boolean_t equal_mergeinfo;
+                          SVN_ERR(svn_mergeinfo__equals(&equal_mergeinfo,
+                                                        mergehash,
+                                                        overidden_mergeinfo,
+                                                        FALSE, pool));
+                          if (equal_mergeinfo)
+                            SVN_ERR(svn_client__record_wc_mergeinfo(
+                              path, NULL, wb->base_access, pool));
+                          else
+                            /* The empty mergeinfo on PATH really means
+                               something.  Merge this subtree separately. */
+                            has_mergeinfo_from_merge_src = TRUE;
+                        }
+                    }
+                } /* (!err) */
+              start_url = NULL;
+            } /* the slightly harder way */
         }
       /* Regardless of whether PATH has explicit mergeinfo or not, we must
          determine if PATH is switched.  This is so get_mergeinfo_paths()
@@ -3112,6 +3205,12 @@
                     merge_cmd_baton_t *merge_cmd_baton,
                     const char* merge_src_canon_path,
                     const svn_wc_entry_t *entry,
+                    const char *source_root_url,
+                    const char *url1,
+                    const char *url2,
+                    svn_revnum_t revision1,
+                    svn_revnum_t revision2,
+                    svn_ra_session_t *ra_session,
                     svn_wc_adm_access_t *adm_access,
                     svn_client_ctx_t *ctx,
                     svn_depth_t depth,
@@ -3123,7 +3222,8 @@
     { get_mergeinfo_walk_cb, get_mergeinfo_error_handler };
   struct get_mergeinfo_walk_baton wb =
     { adm_access, children_with_mergeinfo,
-      merge_src_canon_path, merge_cmd_baton->target, depth};
+      merge_src_canon_path, merge_cmd_baton->target, source_root_url,
+      url1, url2, revision1, revision2, depth, ra_session, ctx };
 
   /* Cover cases 1), 2), 6), and 8) by walking the WC to get all paths which
      have mergeinfo and/or are switched or are absent from disk or is the
@@ -3928,7 +4028,9 @@
                                             source_root_url, TRUE, NULL,
                                             NULL, pool));
   SVN_ERR(get_mergeinfo_paths(children_with_mergeinfo, merge_b,
-                              mergeinfo_path, parent_entry, adm_access,
+                              mergeinfo_path, parent_entry, source_root_url,
+                              url1, url2, revision1, revision2,
+                              ra_session, adm_access,
                               merge_b->ctx, depth, pool));
 
   /* The first item from the CHILDREN_WITH_MERGEINFO is the target
@@ -3985,6 +4087,8 @@
         {
           svn_revnum_t next_end_rev;
           const char *real_url1 = url1, *real_url2 = url2;
+          const char *old_sess1_url = NULL, *old_sess2_url = NULL;
+
           svn_pool_clear(iterpool);
 
           /* Use persistent pool while playing with remaining_ranges. */
@@ -4015,9 +4119,19 @@
           if (! same_urls)
             {
               if (is_rollback && (end_rev != revision2))
-                real_url2 = url1;
+                {
+                  real_url2 = url1;
+                  SVN_ERR(svn_client__ensure_ra_session_url
+                          (&old_sess2_url, merge_b->ra_session2,
+                           real_url2, iterpool));
+                }
               if ((! is_rollback) && (start_rev != revision1))
-                real_url1 = url2;
+                {
+                  real_url1 = url2;
+                  SVN_ERR(svn_client__ensure_ra_session_url
+                          (&old_sess1_url, merge_b->ra_session1,
+                           real_url1, iterpool));
+                }
             }
           SVN_ERR(drive_merge_report_editor(merge_b->target,
                                             real_url1, start_rev, real_url2, 
@@ -4026,7 +4140,14 @@
                                             depth, notify_b, adm_access,
                                             &merge_callbacks, merge_b,
                                             iterpool));
+          if (old_sess1_url)
+            SVN_ERR(svn_ra_reparent(merge_b->ra_session1, 
+                                    old_sess1_url, iterpool));
+          if (old_sess2_url)
+            SVN_ERR(svn_ra_reparent(merge_b->ra_session2, 
+                                    old_sess2_url, iterpool));
 
+          /* Prepare for the next iteration (if any). */
           remove_first_range_from_remaining_ranges(children_with_mergeinfo, 
                                                    pool);
           next_end_rev = get_youngest_end_rev(children_with_mergeinfo, 
@@ -4311,10 +4432,10 @@
       /* Establish RA sessions to our URLs. */
       SVN_ERR(svn_client__open_ra_session_internal(&ra_session1, url1,
                                                    NULL, NULL, NULL, 
-                                                   FALSE, TRUE, ctx, pool));
+                                                   FALSE, TRUE, ctx, subpool));
       SVN_ERR(svn_client__open_ra_session_internal(&ra_session2, url2,
                                                    NULL, NULL, NULL, 
-                                                   FALSE, TRUE, ctx, pool));
+                                                   FALSE, TRUE, ctx, subpool));
 
       /* Populate the portions of the merge context baton that need to
          be reset for each merge source iteration. */
@@ -4336,7 +4457,7 @@
         {
           SVN_ERR(svn_ra_has_capability(ra_session1,
                                         &merge_cmd_baton.mergeinfo_capable,
-                                        SVN_RA_CAPABILITY_MERGEINFO, pool));
+                                        SVN_RA_CAPABILITY_MERGEINFO, subpool));
           checked_mergeinfo_capability = TRUE;
         }
 
@@ -4355,6 +4476,7 @@
                                                          adm_access,
                                                          &merge_cmd_baton,
                                                          subpool));
+
           continue;
         }
 
@@ -4378,6 +4500,7 @@
                                             adm_access, ctx, subpool));
     }
 
+  svn_pool_destroy(subpool);
   return SVN_NO_ERROR;
 }
 
@@ -4414,6 +4537,8 @@
   svn_opt_revision_t working_rev;
   const char *yc_path = NULL;
   svn_revnum_t yc_rev = SVN_INVALID_REVNUM;
+  apr_pool_t *sesspool;
+  svn_boolean_t same_repos;
 
   /* Sanity check our input -- we require specified revisions. */
   if ((revision1->kind == svn_opt_revision_unspecified)
@@ -4459,22 +4584,30 @@
   SVN_ERR(svn_client__get_repos_root(&wc_repos_root, target_wcpath,
                                      &working_rev, adm_access, ctx, pool));
 
-  /* Open some RA sessions to our merge source sides, and get the root
-     URL from one of them (the other doesn't matter -- if it ain't the
-     same, other stuff would fall over later). */
+  /* Open some RA sessions to our merge source sides. */
+  sesspool = svn_pool_create(pool);
   SVN_ERR(svn_client__open_ra_session_internal(&ra_session1,
                                                URL1, NULL, NULL, NULL,
-                                               FALSE, FALSE, ctx, pool));
+                                               FALSE, TRUE, ctx, sesspool));
   SVN_ERR(svn_client__open_ra_session_internal(&ra_session2,
                                                URL2, NULL, NULL, NULL,
-                                               FALSE, FALSE, ctx, pool));
-  SVN_ERR(svn_ra_get_repos_root(ra_session1, &source_repos_root, pool));
+                                               FALSE, TRUE, ctx, sesspool));
 
   /* Resolve revisions to real numbers. */
-  SVN_ERR(svn_client__get_revision_number(&rev1, &youngest_rev,
-                                          ra_session1, revision1, NULL, pool));
-  SVN_ERR(svn_client__get_revision_number(&rev2, &youngest_rev,
-                                          ra_session2, revision2, NULL, pool));
+  SVN_ERR(svn_client__get_revision_number(&rev1, &youngest_rev, ra_session1, 
+                                          revision1, NULL, sesspool));
+  SVN_ERR(svn_client__get_revision_number(&rev2, &youngest_rev, ra_session2, 
+                                          revision2, NULL, sesspool));
+
+  /* Get the repository root URL from one of our sessions (the other
+     doesn't matter -- if it ain't the same, other stuff would fall
+     over later).  We have to dup this into our pool, since the API
+     declares that this data will live in the session's pool.  */
+  SVN_ERR(svn_ra_get_repos_root(ra_session1, &source_repos_root, sesspool));
+  source_repos_root = apr_pstrdup(pool, source_repos_root);
+
+  /* Do our working copy and sources come from the same repository? */
+  same_repos = (strcmp(source_repos_root, wc_repos_root) == 0) ? TRUE : FALSE;
 
   /* Unless we're ignoring ancestry, see if the two sources are related.  */
   if (! ignore_ancestry)
@@ -4489,11 +4622,23 @@
                                                        ctx, pool));
     }
 
-  /* If we have a youngest common ancestor, we might be doing a pair of
-     merges.  Given a requested merge of the differences between A and
-     B, and a common ancestor of C, we'll first merge the removal of
-     changes between C and A, then merge the addition of changes
-     between C and B.  */
+  /* Check for a youngest common ancestor.  If we have one, we'll be
+     doing merge tracking.
+
+     So, given a requested merge of the differences between A and
+     B, and a common ancestor of C, we will find ourselves in one of
+     four positions, and four different approaches:
+ 
+        A == B == C   there's nothing to merge
+
+        A == C != B   we merge the changes between A (or C) and B
+
+        B == C != A   we merge the changes between B (or C) and A
+
+        A != B != C   we merge the changes between A and B without
+                      merge recording, then record-only two merges:
+                      from A to C, and from C to B
+  */
   if (yc_path && SVN_IS_VALID_REVNUM(yc_rev))
     {
       apr_array_header_t *ranges;
@@ -4501,7 +4646,7 @@
       svn_opt_revision_t peg_revision;
       peg_revision.kind = svn_opt_revision_number;
 
-      /* Not that our merge sources are related. */
+      /* Note that our merge sources are related. */
       related = TRUE;
       
       /* Make YC_PATH into a full URL. */
@@ -4572,6 +4717,9 @@
                                           source_repos_root, &peg_revision, 
                                           ranges, ra_session2, ctx, pool));
 
+          /* Close our temporary RA sessions. */
+          svn_pool_destroy(sesspool);
+
           /* If this isn't a record-only merge, we'll first do a stupid
              point-to-point merge... */
           if (! record_only)
@@ -4586,8 +4734,7 @@
               faux_source->rev2 = rev2;
               APR_ARRAY_PUSH(faux_sources, merge_source_t *) = faux_source;
               SVN_ERR(do_merge(faux_sources, target_wcpath, entry, adm_access, 
-                               ancestral, related,
-                               (strcmp(wc_repos_root, source_repos_root) == 0),
+                               ancestral, related, same_repos,
                                ignore_ancestry, force, dry_run, 
                                record_only, depth, merge_options, ctx, pool));
             }
@@ -4596,16 +4743,15 @@
              fork of our merge source history tree has an ancestral
              relationship with the common ancestral, so we force
              ancestral=TRUE here.) */
-          SVN_ERR(do_merge(add_sources, target_wcpath, entry, 
-                           adm_access, TRUE, related,
-                           (strcmp(wc_repos_root, source_repos_root) == 0),
+          SVN_ERR(do_merge(add_sources, target_wcpath, entry, adm_access, 
+                           TRUE, related, same_repos,
                            ignore_ancestry, force, dry_run, 
                            TRUE, depth, merge_options, ctx, pool));
-          SVN_ERR(do_merge(remove_sources, target_wcpath, entry, 
-                           adm_access, TRUE, related,
-                           (strcmp(wc_repos_root, source_repos_root) == 0),
+          SVN_ERR(do_merge(remove_sources, target_wcpath, entry, adm_access, 
+                           TRUE, related, same_repos,
                            ignore_ancestry, force, dry_run, 
                            TRUE, depth, merge_options, ctx, pool));
+
           SVN_ERR(svn_wc_adm_close(adm_access));
           return SVN_NO_ERROR;
         }
@@ -4622,11 +4768,13 @@
       APR_ARRAY_PUSH(merge_sources, merge_source_t *) = merge_source;
     }
 
+  /* Close our temporary RA sessions. */
+  svn_pool_destroy(sesspool);
+
   SVN_ERR(do_merge(merge_sources, target_wcpath, entry, adm_access, 
-                   ancestral, related,
-                   (strcmp(wc_repos_root, source_repos_root) == 0),
-                   ignore_ancestry, force, dry_run, record_only, depth,
-                   merge_options, ctx, pool));
+                   ancestral, related, same_repos,
+                   ignore_ancestry, force, dry_run, 
+                   record_only, depth, merge_options, ctx, pool));
 
   SVN_ERR(svn_wc_adm_close(adm_access));
 
@@ -4694,6 +4842,7 @@
   const char *wc_repos_root, *source_repos_root;
   svn_opt_revision_t working_rev;
   svn_ra_session_t *ra_session;
+  apr_pool_t *sesspool;
 
   /* No ranges to merge?  No problem. */
   if (ranges_to_merge->nelts == 0)
@@ -4721,9 +4870,10 @@
                                      &working_rev, adm_access, ctx, pool));
 
   /* Open an RA session to our source URL, and determine its root URL. */
+  sesspool = svn_pool_create(pool);
   SVN_ERR(svn_client__open_ra_session_internal(&ra_session,
                                                URL, NULL, NULL, NULL,
-                                               FALSE, FALSE, ctx, pool));
+                                               FALSE, TRUE, ctx, sesspool));
   SVN_ERR(svn_ra_get_repos_root(ra_session, &source_repos_root, pool));
 
   /* Normalize our merge sources. */
@@ -4731,6 +4881,9 @@
                                   source_repos_root, peg_revision, 
                                   ranges_to_merge, ra_session, ctx, pool));
 
+  /* We're done with our little RA session. */
+  svn_pool_destroy(sesspool);
+
   /* Do the real merge!  (We say with confidence that our merge
      sources are both ancestral and related.) */
   SVN_ERR(do_merge(merge_sources, target_wcpath, entry, adm_access,
diff --git a/subversion/libsvn_client/mergeinfo.c b/subversion/libsvn_client/mergeinfo.c
index 53e40c6..589ea7d 100644
--- a/subversion/libsvn_client/mergeinfo.c
+++ b/subversion/libsvn_client/mergeinfo.c
@@ -241,7 +241,7 @@
       /* Mergeinfo may be inherited. */
       if (wc_mergeinfo)
         {
-          *inherited = (wc_mergeinfo && apr_hash_count(wc_mergeinfo) > 0);
+          *inherited = (wc_mergeinfo != NULL);
           *mergeinfo = apr_hash_make(pool);
           adjust_mergeinfo_source_paths(*mergeinfo, walk_path, wc_mergeinfo,
                                         pool);
@@ -488,72 +488,6 @@
 
 /*** Eliding mergeinfo. ***/
 
-/* Helper for elide_mergeinfo().
-
-   Find all paths in CHILD_MERGEINFO which map to empty revision ranges
-   and copy these from CHILD_MERGEINFO to *EMPTY_RANGE_MERGEINFO iff
-   PARENT_MERGEINFO is NULL or does not have mergeinfo for the path in
-   question.
-
-   All mergeinfo in CHILD_MERGEINFO not copied to *EMPTY_RANGE_MERGEINFO
-   is copied to *NONEMPTY_RANGE_MERGEINFO.
-
-   *EMPTY_RANGE_MERGEINFO and *NONEMPTY_RANGE_MERGEINFO are set to empty
-   hashes if nothing is copied into them.
-
-   All copied hashes are deep copies allocated in POOL. */
-static svn_error_t *
-get_empty_rangelists_unique_to_child(apr_hash_t **empty_range_mergeinfo,
-                                     apr_hash_t **nonempty_range_mergeinfo,
-                                     apr_hash_t *child_mergeinfo,
-                                     apr_hash_t *parent_mergeinfo,
-                                     apr_pool_t *pool)
-{
-  *empty_range_mergeinfo = apr_hash_make(pool);
-  *nonempty_range_mergeinfo = apr_hash_make(pool);
-
-  if (child_mergeinfo)
-    {
-      apr_hash_index_t *hi;
-      void *child_val;
-      const void *child_key;
-      apr_array_header_t *child_range;
-      const char *child_path;
-
-      /* Iterate through CHILD_MERGEINFO looking for mergeinfo with empty
-         revision ranges. */
-      for (hi = apr_hash_first(pool, child_mergeinfo); hi;
-           hi = apr_hash_next(hi))
-        {
-          apr_hash_this(hi, &child_key, NULL, &child_val);
-          child_path = child_key;
-          child_range = child_val;
-
-          /* Copy paths with empty revision ranges which don't exist in
-             PARENT_MERGEINFO from CHILD_MERGEINFO to *EMPTY_RANGE_MERGEINFO.
-             Copy everything else to *NONEMPTY_RANGE_MERGEINFO. */
-          if (child_range->nelts == 0
-              && (parent_mergeinfo == NULL
-                  || apr_hash_get(parent_mergeinfo, child_path,
-                                  APR_HASH_KEY_STRING) == NULL))
-            {
-              apr_hash_set(*empty_range_mergeinfo,
-                           apr_pstrdup(pool, child_path),
-                           APR_HASH_KEY_STRING,
-                           svn_rangelist_dup(child_range, pool));
-            }
-          else
-            {
-              apr_hash_set(*nonempty_range_mergeinfo,
-                           apr_pstrdup(pool, child_path),
-                           APR_HASH_KEY_STRING,
-                           svn_rangelist_dup(child_range, pool));
-            }
-        }
-    }
-  return SVN_NO_ERROR;
-}
-
 /* Helper for svn_client__elide_mergeinfo() and svn_client__elide_children().
 
    Given a working copy PATH, its mergeinfo hash CHILD_MERGEINFO, and the
@@ -582,133 +516,59 @@
                 svn_wc_adm_access_t *adm_access,
                 apr_pool_t *pool)
 {
-  apr_pool_t *subpool;
-  apr_hash_t *mergeinfo, *child_empty_mergeinfo, *child_nonempty_mergeinfo;
-  svn_boolean_t equal_mergeinfo;
-
-  /* A tri-state value describing the various types of elision possible for
-     svn:mergeinfo set on a WC path. */
-  enum wc_elision_type
-  {
-    elision_type_none,    /* No elision occurs. */
-    elision_type_partial, /* Paths that exist only in CHILD_MERGEINFO and
-                             map to empty revision ranges elide. */
-    elision_type_full     /* All mergeinfo in CHILD_MERGEINFO elides. */
-  } elision_type = elision_type_none;
+  apr_pool_t *subpool = NULL;
+  svn_boolean_t elides;
 
   /* Easy out: No child mergeinfo to elide. */
   if (child_mergeinfo == NULL)
-    return SVN_NO_ERROR;
-
-  subpool = svn_pool_create(pool);
-
-  /* Another easy out: If a child has empty mergeinfo but isn't overriding
-     any parent's mergeinfo then it fully elides. */
-  if (!parent_mergeinfo && apr_hash_count(child_mergeinfo) == 0)
     {
-      elision_type = elision_type_full;
+      elides = FALSE;
+    }
+  else if (apr_hash_count(child_mergeinfo) == 0)
+    {
+      /* Empty mergeinfo elides to empty mergeinfo or to "nothing",
+         i.e. it isn't overriding any parent. Otherwise it doesn't
+         elide. */
+      if (!parent_mergeinfo || apr_hash_count(parent_mergeinfo) == 0)
+        elides = TRUE;
+      else
+        elides = FALSE;
+    }
+  else if (!parent_mergeinfo || apr_hash_count(parent_mergeinfo) == 0)
+    {
+      /* Non-empty mergeinfo never elides to empty mergeinfo
+         or no mergeinfo. */
+      elides = FALSE;
     }
   else
     {
-      if (path_suffix && parent_mergeinfo)
-        {
-          apr_hash_index_t *hi;
-          void *val;
-          const void *key;
-          const char *new_path;
-          apr_array_header_t *rangelist;
+      /* Both CHILD_MERGEINFO and PARENT_MERGEINFO are non-NULL and
+         non-empty. */
+      apr_hash_t *path_tweaked_parent_mergeinfo;
+      subpool = svn_pool_create(pool);
 
-          mergeinfo = apr_hash_make(subpool);
-
-          for (hi = apr_hash_first(subpool, parent_mergeinfo); hi;
-               hi = apr_hash_next(hi))
-            {
-              apr_hash_this(hi, &key, NULL, &val);
-              new_path = svn_path_join((const char *) key, path_suffix,
-                                       subpool);
-              rangelist = val;
-              apr_hash_set(mergeinfo, new_path, APR_HASH_KEY_STRING,
-                           rangelist);
-            }
-        }
+      path_tweaked_parent_mergeinfo = apr_hash_make(subpool);
+      
+      /* If we need to adjust the paths in PARENT_MERGEINFO do it now. */
+      if (path_suffix)
+        adjust_mergeinfo_source_paths(path_tweaked_parent_mergeinfo,
+                                      path_suffix, child_mergeinfo,
+                                      subpool);
       else
-        {
-          mergeinfo = parent_mergeinfo;
-        }
+        path_tweaked_parent_mergeinfo = parent_mergeinfo;
 
-     /* Separate any mergeinfo with empty rev ranges for paths that exist only
-        in CHILD_MERGEINFO and store these in CHILD_EMPTY_MERGEINFO. */
-      SVN_ERR(get_empty_rangelists_unique_to_child(&child_empty_mergeinfo,
-                                                   &child_nonempty_mergeinfo,
-                                                   child_mergeinfo, mergeinfo,
-                                                   subpool));
+      SVN_ERR(svn_mergeinfo__equals(&elides,
+                                    path_tweaked_parent_mergeinfo,
+                                    child_mergeinfo, TRUE, subpool));
+    }
 
-      /* If *all* paths in CHILD_MERGEINFO map to empty revision ranges and
-         none of these paths exist in PARENT_MERGEINFO full elision occurs;
-         if only *some* of the paths in CHILD_MERGEINFO meet this criteria we
-         know, at a minimum, partial elision will occur. */
-      if (apr_hash_count(child_empty_mergeinfo) > 0)
-        elision_type = apr_hash_count(child_nonempty_mergeinfo) == 0
-                       ? elision_type_full : elision_type_partial;
+  if (elides)
+    SVN_ERR(svn_wc_prop_set2(SVN_PROP_MERGEINFO, NULL, path, adm_access,
+                             TRUE, pool));
 
-      if (elision_type == elision_type_none && mergeinfo)
-        {
-          apr_hash_t *parent_empty_mergeinfo, *parent_nonempty_mergeinfo;
+  if (subpool)
+    svn_pool_destroy(subpool);
 
-          /* Full elision also occurs if MERGEINFO and TARGET_MERGEINFO are
-             equal except for paths unique to MERGEINFO that map to empty
-             revision ranges.
-
-             Separate any mergeinfo with empty rev ranges for paths that exist
-             only in MERGEINFO and store these in PARENT_EMPTY_MERGEINFO and
-             compare that with CHILD_MERGEINFO. */
-          SVN_ERR(get_empty_rangelists_unique_to_child(
-            &parent_empty_mergeinfo, &parent_nonempty_mergeinfo, mergeinfo,
-            child_mergeinfo, subpool));
-          SVN_ERR(svn_mergeinfo__equals(&equal_mergeinfo,
-                                        parent_nonempty_mergeinfo,
-                                        child_mergeinfo,
-                                        TRUE,
-                                        subpool));
-          if (equal_mergeinfo)
-            elision_type = elision_type_full;
-        }
-
-      if (elision_type != elision_type_full && mergeinfo)
-        {
-          /* If no determination of elision status has been made yet or we
-            know only that partial elision occurs, compare
-            CHILD_NONEMPTY_MERGEINFO with the PATH_SUFFIX tweaked version of
-            PARENT_MERGEINFO for equality.
-
-            If we determined that at least partial elision occurs, full
-            elision may still yet occur if CHILD_NONEMPTY_MERGEINFO, which no
-            longer contains any paths unique to it that map to empty revision
-            ranges, is equivalent to PARENT_MERGEINFO. */
-          SVN_ERR(svn_mergeinfo__equals(&equal_mergeinfo,
-                                        child_nonempty_mergeinfo,
-                                        mergeinfo, TRUE,
-                                        subpool));
-          if (equal_mergeinfo)
-            elision_type = elision_type_full;
-        }
-      }
-    switch (elision_type)
-      {
-      case elision_type_full:
-        SVN_ERR(svn_wc_prop_set2(SVN_PROP_MERGEINFO, NULL, path, adm_access,
-                                 TRUE, subpool));
-        break;
-      case elision_type_partial:
-        SVN_ERR(svn_client__record_wc_mergeinfo(path,
-                                                child_nonempty_mergeinfo,
-                                                adm_access, subpool));
-        break;
-      default:
-        break; /* Leave mergeinfo on PATH as-is. */
-      }
-
-  svn_pool_destroy(subpool);
   return SVN_NO_ERROR;
 }
 
diff --git a/subversion/libsvn_client/mergeinfo.h b/subversion/libsvn_client/mergeinfo.h
index b4b933d..dbeeed3 100644
--- a/subversion/libsvn_client/mergeinfo.h
+++ b/subversion/libsvn_client/mergeinfo.h
@@ -179,27 +179,25 @@
    TARGET_PATH and WC_ELISION_LIMIT_PATH, if it exists, must both be absolute
    or relative to the working directory.
 
-   If TARGET_WCPATH's mergeinfo and its nearest ancestor's mergeinfo
-   differ by paths existing only in TARGET_PATH's mergeinfo that map to
-   empty revision ranges, then the mergeinfo between the two is considered
-   equivalent and elision occurs.  If the mergeinfo between the two still
-   differs then partial elision occurs: only the paths mapped to empty
-   revision ranges in TARGET_WCPATH's mergeinfo elide.
+   Elision occurs if:
 
-   If TARGET_WCPATH's mergeinfo and its nearest ancestor's mergeinfo
-   differ by paths existing only in the ancestor's mergeinfo that map to
-   empty revision ranges, then the mergeinfo between the two is considered
-   equivalent and elision occurs.
+     A) WCPATH has empty mergeinfo and no parent path with explicit mergeinfo
+        can be found in either the WC or the repository (WC_ELISION_LIMIT_PATH
+        must be NULL for this to occur).
 
-   If TARGET_WCPATH's mergeinfo consists only of paths mapped to empty
-   revision ranges and none of these paths exist in TARGET_WCPATH's nearest
-   ancestor, then elision occurs.
+     B) WCPATH has empty mergeinfo and its nearest parent also has empty
+        mergeinfo.
 
-   If TARGET_WCPATH's mergeinfo is empty or consists only of paths mapped to
-   empty revision ranges and TARGET_WCPATH has no working copy or repository
-   ancestor with mergeinfo (WC_ELISION_LIMIT_PATH must be NULL to ensure the
-   repository is checked), then elision occurs.
- */
+     C) WCPATH has the same mergeinfo as its nearest parent when that parent's
+        mergeinfo is adjusted for the path difference between the two, e.g.:
+
+                                WCPATH's                          Parent's
+                    WCPATH's    Nearest    Parent's   Path        Adjusted
+        WCPATH      mergeinfo   parent     Mergeinfo  Difference  Mergeinfo
+        -------     ---------   ---------  ---------  ----------  ---------
+        A_COPY/D/H  '/A/D/H:3'  A_COPY     '/A:3'     'D/H'       '/A/D/H:3'
+
+   If Elision occurs remove the svn:mergeinfo property from TARGET_WCPATH. */
 svn_error_t *
 svn_client__elide_mergeinfo(const char *target_wcpath,
                             const char *wc_elision_limit_path,
diff --git a/subversion/libsvn_client/util.c b/subversion/libsvn_client/util.c
index ce13ae1..f8a02ad 100644
--- a/subversion/libsvn_client/util.c
+++ b/subversion/libsvn_client/util.c
@@ -211,10 +211,13 @@
          a PATH_OR_URL of something not in that repository).  */
       const char *rel_url = svn_path_is_child(repos_root, path_or_url, pool);
       if (! rel_url)
-        err = svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL,
-                                _("URL '%s' is not a child of repository "
-                                  "root URL '%s'"),
-                                path_or_url, repos_root);
+        {
+          err = svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL,
+                                  _("URL '%s' is not a child of repository "
+                                    "root URL '%s'"),
+                                  path_or_url, repos_root);
+          goto cleanup;
+        }
       rel_url = svn_path_uri_decode(rel_url, pool);
       *rel_path = include_leading_slash 
                     ? apr_pstrcat(pool, "/", rel_url, NULL) : rel_url;
diff --git a/subversion/libsvn_fs_fs/fs_fs.c b/subversion/libsvn_fs_fs/fs_fs.c
index a0a7a7e..23d622a 100644
--- a/subversion/libsvn_fs_fs/fs_fs.c
+++ b/subversion/libsvn_fs_fs/fs_fs.c
@@ -4745,6 +4745,8 @@
       SVN_ERR(svn_io_file_flush_to_disk(file, pool));
       SVN_ERR(svn_io_file_close(file, pool));
     }
+  if (err)
+    return err;
 
 #ifdef __linux__
   {
@@ -4764,7 +4766,7 @@
   }
 #endif
 
-  return err;
+  return SVN_NO_ERROR;
 }
 
 /* Atomically update the current file to hold the specifed REV, NEXT_NODE_ID,
diff --git a/subversion/libsvn_fs_util/mergeinfo-sqlite-index.c b/subversion/libsvn_fs_util/mergeinfo-sqlite-index.c
index 038d22d..3310b0e 100644
--- a/subversion/libsvn_fs_util/mergeinfo-sqlite-index.c
+++ b/subversion/libsvn_fs_util/mergeinfo-sqlite-index.c
@@ -91,7 +91,7 @@
 {
   apr_hash_t *mergeinfo;
   apr_hash_index_t *hi;
-  sqlite3_stmt *stmt;
+  svn_fs__sqlite_stmt_t *stmt;
   svn_boolean_t remove_mergeinfo = FALSE;
 
   SVN_ERR(svn_mergeinfo_parse(&mergeinfo, mergeinfo_str->data, pool));
@@ -145,7 +145,7 @@
                                          "INSERT INTO mergeinfo (revision, "
                                          "mergedfrom, mergedto, mergedrevstart, "
                                          "mergedrevend, inheritable) VALUES (?, "
-                                         "?, ?, ?, ?, ?);"));
+                                         "?, ?, ?, ?, ?);", pool));
           SVN_ERR(svn_fs__sqlite_bind_int64(stmt, 1, new_rev));
           SVN_ERR(svn_fs__sqlite_bind_text(stmt, 2, from));
           SVN_ERR(svn_fs__sqlite_bind_text(stmt, 3, path));
@@ -180,7 +180,7 @@
 
   SVN_ERR(svn_fs__sqlite_prepare(&stmt, db,
                                  "INSERT INTO mergeinfo_changed (revision, "
-                                 "path) VALUES (?, ?);"));
+                                 "path) VALUES (?, ?);", pool));
   SVN_ERR(svn_fs__sqlite_bind_int64(stmt, 1, new_rev));
   SVN_ERR(svn_fs__sqlite_bind_text(stmt, 2, path));
 
@@ -230,9 +230,9 @@
                                        "SELECT 1 from %s WHERE "
                                        "revision = %ld;",
                                        table, rev);
-  sqlite3_stmt *stmt;
+  svn_fs__sqlite_stmt_t *stmt;
 
-  SVN_ERR(svn_fs__sqlite_prepare(&stmt, db, selection));
+  SVN_ERR(svn_fs__sqlite_prepare(&stmt, db, selection, pool));
   SVN_ERR(svn_fs__sqlite_step(has_any, stmt));
   SVN_ERR(svn_fs__sqlite_finalize(stmt));
   
@@ -337,14 +337,15 @@
                         apr_hash_t **result,
                         apr_pool_t *pool)
 {
-  sqlite3_stmt *stmt;
+  svn_fs__sqlite_stmt_t *stmt;
   svn_boolean_t got_row;
 
   SVN_ERR(svn_fs__sqlite_prepare(&stmt, db,
                                  "SELECT mergedfrom, mergedrevstart, "
                                  "mergedrevend, inheritable FROM mergeinfo "
                                  "WHERE mergedto = ? AND revision = ? "
-                                 "ORDER BY mergedfrom, mergedrevstart;"));
+                                 "ORDER BY mergedfrom, mergedrevstart;",
+                                 pool));
   SVN_ERR(svn_fs__sqlite_bind_text(stmt, 1, path));
   SVN_ERR(svn_fs__sqlite_bind_int64(stmt, 2, lastmerged_rev));
   SVN_ERR(svn_fs__sqlite_step(&got_row, stmt));
@@ -367,10 +368,10 @@
 
       while (got_row)
         {
-          mergedfrom = (char *) sqlite3_column_text(stmt, 0);
-          startrev = (svn_revnum_t) sqlite3_column_int64(stmt, 1);
-          endrev = (svn_revnum_t) sqlite3_column_int64(stmt, 2);
-          inheritable = sqlite3_column_int64(stmt, 3) == 0 ? FALSE : TRUE;
+          mergedfrom = svn_fs__sqlite_column_text(stmt, 0);
+          startrev = svn_fs__sqlite_column_revnum(stmt, 1);
+          endrev = svn_fs__sqlite_column_revnum(stmt, 2);
+          inheritable = svn_fs__sqlite_column_boolean(stmt, 3);
 
           mergedfrom = apr_pstrdup(pool, mergedfrom);
           if (lastmergedfrom && strcmp(mergedfrom, lastmergedfrom) != 0)
@@ -465,7 +466,7 @@
                        apr_pool_t *pool)
 {
   apr_hash_t *path_mergeinfo;
-  sqlite3_stmt *stmt;
+  svn_fs__sqlite_stmt_t *stmt;
   svn_revnum_t lastmerged_rev;
 
   if (inherit == svn_mergeinfo_nearest_ancestor)
@@ -491,13 +492,13 @@
       SVN_ERR(svn_fs__sqlite_prepare(&stmt, db,
                                      "SELECT MAX(revision) FROM "
                                      "mergeinfo_changed WHERE path = ? AND "
-                                     "revision <= ?;"));
+                                     "revision <= ?;", pool));
 
       SVN_ERR(svn_fs__sqlite_bind_text(stmt, 1, path));
       SVN_ERR(svn_fs__sqlite_bind_int64(stmt, 2, rev));
       SVN_ERR(svn_fs__sqlite_step_row(stmt));
 
-      lastmerged_rev = (svn_revnum_t) sqlite3_column_int64(stmt, 0);
+      lastmerged_rev = svn_fs__sqlite_column_revnum(stmt, 0);
       SVN_ERR(svn_fs__sqlite_finalize(stmt));
 
       /* If we've got mergeinfo data, transform it from the db into a
@@ -583,7 +584,7 @@
                            void *filter_func_baton,
                            apr_pool_t *pool)
 {
-  sqlite3_stmt *stmt;
+  svn_fs__sqlite_stmt_t *stmt;
   apr_pool_t *subpool = svn_pool_create(pool);
   char *like_path;
   svn_boolean_t got_row;
@@ -593,7 +594,7 @@
                                  "SELECT MAX(revision), path "
                                  "FROM mergeinfo_changed "
                                  "WHERE path LIKE ? AND revision <= ? "
-                                 "GROUP BY path;"));
+                                 "GROUP BY path;", pool));
 
   like_path = apr_psprintf(subpool, "%s/%%", path);
 
@@ -608,8 +609,8 @@
 
       svn_pool_clear(subpool);
 
-      lastmerged_rev = (svn_revnum_t) sqlite3_column_int64(stmt, 0);
-      merged_path = (const char *) sqlite3_column_text(stmt, 1);
+      lastmerged_rev = svn_fs__sqlite_column_revnum(stmt, 0);
+      merged_path = svn_fs__sqlite_column_text(stmt, 1);
 
       /* If we've got a merged revision, go get the mergeinfo from the db */
       if (lastmerged_rev > 0)
diff --git a/subversion/libsvn_fs_util/node-origins-sqlite-index.c b/subversion/libsvn_fs_util/node-origins-sqlite-index.c
index f6c2d75..aa275a0 100644
--- a/subversion/libsvn_fs_util/node-origins-sqlite-index.c
+++ b/subversion/libsvn_fs_util/node-origins-sqlite-index.c
@@ -48,17 +48,17 @@
            const char *node_id,
            apr_pool_t *pool)
 {
-  sqlite3_stmt *stmt;
+  svn_fs__sqlite_stmt_t *stmt;
   svn_boolean_t got_row;
 
   SVN_ERR(svn_fs__sqlite_prepare(&stmt, db,
                                  "SELECT node_rev_id FROM node_origins "
-                                 "WHERE node_id = ?"));
+                                 "WHERE node_id = ?", pool));
   SVN_ERR(svn_fs__sqlite_bind_text(stmt, 1, node_id));
   SVN_ERR(svn_fs__sqlite_step(&got_row, stmt));
   
   *node_rev_id = got_row 
-    ? apr_pstrdup(pool, (const char *) sqlite3_column_text(stmt, 0))
+    ? apr_pstrdup(pool, svn_fs__sqlite_column_text(stmt, 0))
     : NULL;
 
   SVN_ERR(svn_fs__sqlite_finalize(stmt));
@@ -72,7 +72,7 @@
            const svn_string_t *node_rev_id,
            apr_pool_t *pool)
 {
-  sqlite3_stmt *stmt;
+  svn_fs__sqlite_stmt_t *stmt;
   const char *old_node_rev_id;
 
   /* First figure out if it's already there.  (Don't worry, we're in a
@@ -92,7 +92,7 @@
 
   SVN_ERR(svn_fs__sqlite_prepare(&stmt, db,
                                  "INSERT INTO node_origins (node_id, "
-                                 "node_rev_id) VALUES (?, ?);"));
+                                 "node_rev_id) VALUES (?, ?);", pool));
   SVN_ERR(svn_fs__sqlite_bind_text(stmt, 1, node_id));
   SVN_ERR(svn_fs__sqlite_bind_text(stmt, 2, node_rev_id->data));
 
diff --git a/subversion/libsvn_fs_util/sqlite-util.c b/subversion/libsvn_fs_util/sqlite-util.c
index 43b3566..de9278d 100644
--- a/subversion/libsvn_fs_util/sqlite-util.c
+++ b/subversion/libsvn_fs_util/sqlite-util.c
@@ -48,6 +48,12 @@
 }
 #endif
 
+struct svn_fs__sqlite_stmt_t
+{
+  sqlite3_stmt *s3stmt;
+  sqlite3 *db;
+};
+
 /* Convert SQLite error codes to SVN */
 #define SQLITE_ERROR_CODE(x) ((x) == SQLITE_READONLY ?     \
                                 SVN_ERR_FS_SQLITE_READONLY \
@@ -80,14 +86,18 @@
 }
 
 svn_error_t *
-svn_fs__sqlite_prepare(sqlite3_stmt **stmt, sqlite3 *db, const char *text)
+svn_fs__sqlite_prepare(svn_fs__sqlite_stmt_t **stmt, sqlite3 *db,
+                       const char *text, apr_pool_t *pool)
 {
-  SQLITE_ERR(sqlite3_prepare(db, text, -1, stmt, NULL), db);
+  svn_fs__sqlite_stmt_t *s = apr_palloc(pool, sizeof(*s));
+  s->db = db;
+  SQLITE_ERR(sqlite3_prepare(db, text, -1, &(s->s3stmt), NULL), db);
+  *stmt = s;
   return SVN_NO_ERROR;
 }
 
 static svn_error_t *
-step_with_expectation(sqlite3_stmt* stmt, 
+step_with_expectation(svn_fs__sqlite_stmt_t* stmt, 
                       svn_boolean_t expecting_row)
 {
   svn_boolean_t got_row;
@@ -104,21 +114,21 @@
 }
 
 svn_error_t *
-svn_fs__sqlite_step_done(sqlite3_stmt *stmt)
+svn_fs__sqlite_step_done(svn_fs__sqlite_stmt_t *stmt)
 {
   return step_with_expectation(stmt, FALSE);
 }
 
 svn_error_t *
-svn_fs__sqlite_step_row(sqlite3_stmt *stmt)
+svn_fs__sqlite_step_row(svn_fs__sqlite_stmt_t *stmt)
 {
   return step_with_expectation(stmt, TRUE);
 }
 
 svn_error_t *
-svn_fs__sqlite_step(svn_boolean_t *got_row, sqlite3_stmt *stmt)
+svn_fs__sqlite_step(svn_boolean_t *got_row, svn_fs__sqlite_stmt_t *stmt)
 {
-  int sqlite_result = sqlite3_step(stmt);
+  int sqlite_result = sqlite3_step(stmt->s3stmt);
   if (sqlite_result != SQLITE_DONE && sqlite_result != SQLITE_ROW)
     {
       /* Extract the real error value with finalize. */
@@ -133,43 +143,62 @@
 }
 
 svn_error_t *
-svn_fs__sqlite_bind_int64(sqlite3_stmt *stmt,
+svn_fs__sqlite_bind_int64(svn_fs__sqlite_stmt_t *stmt,
                           int slot,
                           sqlite_int64 val)
 {
-  sqlite3 *db = sqlite3_db_handle(stmt);
-  SQLITE_ERR(sqlite3_bind_int64(stmt, slot, val), db);
+  SQLITE_ERR(sqlite3_bind_int64(stmt->s3stmt, slot, val), stmt->db);
   return SVN_NO_ERROR;
 }
 
 svn_error_t *
-svn_fs__sqlite_bind_text(sqlite3_stmt *stmt,
+svn_fs__sqlite_bind_text(svn_fs__sqlite_stmt_t *stmt,
                          int slot,
                          const char *val)
 {
-  sqlite3 *db = sqlite3_db_handle(stmt);
-  SQLITE_ERR(sqlite3_bind_text(stmt, slot, val, -1, SQLITE_TRANSIENT), db);
+  SQLITE_ERR(sqlite3_bind_text(stmt->s3stmt, slot, val, -1, SQLITE_TRANSIENT), 
+             stmt->db);
   return SVN_NO_ERROR;
 }
 
-svn_error_t *
-svn_fs__sqlite_finalize(sqlite3_stmt *stmt)
+const char *
+svn_fs__sqlite_column_text(svn_fs__sqlite_stmt_t *stmt, int column)
 {
-  sqlite3 *db = sqlite3_db_handle(stmt);
-  SQLITE_ERR(sqlite3_finalize(stmt), db);
-  return SVN_NO_ERROR;
+  return (const char *) sqlite3_column_text(stmt->s3stmt, column);
 }
 
-svn_error_t *
-svn_fs__sqlite_reset(sqlite3_stmt *stmt)
+svn_revnum_t
+svn_fs__sqlite_column_revnum(svn_fs__sqlite_stmt_t *stmt, int column)
 {
-  sqlite3 *db = sqlite3_db_handle(stmt);
-  SQLITE_ERR(sqlite3_reset(stmt), db);
+  return (svn_revnum_t) sqlite3_column_int64(stmt->s3stmt, column);
+}
+
+svn_boolean_t
+svn_fs__sqlite_column_boolean(svn_fs__sqlite_stmt_t *stmt, int column)
+{
+  return (sqlite3_column_int64(stmt->s3stmt, column) == 0
+          ? FALSE : TRUE);
+}
+
+int
+svn_fs__sqlite_column_int(svn_fs__sqlite_stmt_t *stmt, int column)
+{
+  return sqlite3_column_int(stmt->s3stmt, column);
+}
+
+svn_error_t *
+svn_fs__sqlite_finalize(svn_fs__sqlite_stmt_t *stmt)
+{
+  SQLITE_ERR(sqlite3_finalize(stmt->s3stmt), stmt->db);
   return SVN_NO_ERROR;
 }
 
 svn_error_t *
-svn_fs__sqlite_reset(sqlite3_stmt *stmt);
+svn_fs__sqlite_reset(svn_fs__sqlite_stmt_t *stmt)
+{
+  SQLITE_ERR(sqlite3_reset(stmt->s3stmt), stmt->db);
+  return SVN_NO_ERROR;
+}
 
 /* Time (in milliseconds) to wait for sqlite locks before giving up. */
 #define BUSY_TIMEOUT 10000
@@ -249,17 +278,17 @@
 static svn_error_t *
 check_format(sqlite3 *db, apr_pool_t *pool)
 {
-  sqlite3_stmt *stmt;
+  svn_fs__sqlite_stmt_t *stmt;
   int schema_format;
   
-  SVN_ERR(svn_fs__sqlite_prepare(&stmt, db, "PRAGMA user_version;"));
+  SVN_ERR(svn_fs__sqlite_prepare(&stmt, db, "PRAGMA user_version;", pool));
   SVN_ERR(svn_fs__sqlite_step_row(stmt));
 
   /* Validate that the schema exists as expected and that the
      schema and repository versions match. */
-  schema_format = sqlite3_column_int(stmt, 0);
+  schema_format = svn_fs__sqlite_column_int(stmt, 0);
 
-  SQLITE_ERR(sqlite3_finalize(stmt), db);
+  SVN_ERR(svn_fs__sqlite_finalize(stmt));
 
   if (schema_format == latest_schema_format)
     return SVN_NO_ERROR;
diff --git a/subversion/libsvn_fs_util/sqlite-util.h b/subversion/libsvn_fs_util/sqlite-util.h
index 40015eb..5500886 100644
--- a/subversion/libsvn_fs_util/sqlite-util.h
+++ b/subversion/libsvn_fs_util/sqlite-util.h
@@ -25,22 +25,24 @@
 extern "C" {
 #endif /* __cplusplus */
 
+typedef struct svn_fs__sqlite_stmt_t svn_fs__sqlite_stmt_t;
+
 /* Steps the given statement; raises an SVN error (and finalizes the
    statement) if it doesn't return SQLITE_DONE. */
 svn_error_t *
-svn_fs__sqlite_step_done(sqlite3_stmt *stmt);
+svn_fs__sqlite_step_done(svn_fs__sqlite_stmt_t *stmt);
 
 /* Steps the given statement; raises an SVN error (and finalizes the
    statement) if it doesn't return SQLITE_ROW. */
 svn_error_t *
-svn_fs__sqlite_step_row(sqlite3_stmt *stmt);
+svn_fs__sqlite_step_row(svn_fs__sqlite_stmt_t *stmt);
 
 /* Steps the given statement; raises an SVN error (and finalizes the
    statement) if it doesn't return SQLITE_DONE or SQLITE_ROW.  Sets 
    *GOT_ROW to true iff it got SQLITE_ROW.
 */
 svn_error_t *
-svn_fs__sqlite_step(svn_boolean_t *got_row, sqlite3_stmt *stmt);
+svn_fs__sqlite_step(svn_boolean_t *got_row, svn_fs__sqlite_stmt_t *stmt);
 
 /* Execute SQL on the sqlite database DB, and raise an SVN error if the
    result is not okay.  */
@@ -56,24 +58,43 @@
 
 /* Prepares TEXT as a statement in DB, returning a statement in *STMT. */
 svn_error_t *
-svn_fs__sqlite_prepare(sqlite3_stmt **stmt, sqlite3 *db, const char *text);
+svn_fs__sqlite_prepare(svn_fs__sqlite_stmt_t **stmt, sqlite3 *db, 
+                       const char *text, apr_pool_t *pool);
 
 /* Error-handling wrapper around sqlite3_bind_int64. */
 svn_error_t *
-svn_fs__sqlite_bind_int64(sqlite3_stmt *stmt, int slot, sqlite_int64 val);
+svn_fs__sqlite_bind_int64(svn_fs__sqlite_stmt_t *stmt, int slot, 
+                          sqlite_int64 val);
 
 /* Error-handling wrapper around sqlite3_bind_text. VAL cannot contain
    zero bytes; we always pass SQLITE_TRANSIENT. */
 svn_error_t *
-svn_fs__sqlite_bind_text(sqlite3_stmt *stmt, int slot, const char *val);
+svn_fs__sqlite_bind_text(svn_fs__sqlite_stmt_t *stmt, int slot, 
+                         const char *val);
+
+/* Wrapper around sqlite3_column_text. */
+const char *
+svn_fs__sqlite_column_text(svn_fs__sqlite_stmt_t *stmt, int column);
+
+/* Wrapper around sqlite3_column_int64. */
+svn_revnum_t
+svn_fs__sqlite_column_revnum(svn_fs__sqlite_stmt_t *stmt, int column);
+
+/* Wrapper around sqlite3_column_int64. */
+svn_boolean_t
+svn_fs__sqlite_column_boolean(svn_fs__sqlite_stmt_t *stmt, int column);
+
+/* Wrapper around sqlite3_column_int. */
+int
+svn_fs__sqlite_column_int(svn_fs__sqlite_stmt_t *stmt, int column);
 
 /* Error-handling wrapper around sqlite3_finalize. */
 svn_error_t *
-svn_fs__sqlite_finalize(sqlite3_stmt *stmt);
+svn_fs__sqlite_finalize(svn_fs__sqlite_stmt_t *stmt);
 
 /* Error-handling wrapper around sqlite3_reset. */
 svn_error_t *
-svn_fs__sqlite_reset(sqlite3_stmt *stmt);
+svn_fs__sqlite_reset(svn_fs__sqlite_stmt_t *stmt);
 
 /* Close DB, returning any ERR which may've necessitated an early connection
    closure, or -- if none -- the error from the closure itself. */
diff --git a/subversion/libsvn_repos/hooks.c b/subversion/libsvn_repos/hooks.c
index 171bd0e..251281c 100644
--- a/subversion/libsvn_repos/hooks.c
+++ b/subversion/libsvn_repos/hooks.c
@@ -548,7 +548,7 @@
     }
   else if (hook)
     {
-      const char *args[4];
+      const char *args[5];
       char *capabilities_string = svn_cstring_join(capabilities, ":", pool);
 
       /* Get rid of that annoying final colon. */
diff --git a/subversion/libsvn_repos/reporter.c b/subversion/libsvn_repos/reporter.c
index 2824706..38c8278 100644
--- a/subversion/libsvn_repos/reporter.c
+++ b/subversion/libsvn_repos/reporter.c
@@ -157,6 +157,18 @@
   char *buf;
 
   SVN_ERR(read_number(&len, temp, pool));
+
+  /* Len can never be less than zero.  But could len be so large that
+     len + 1 wraps around and we end up passing 0 to apr_palloc(),
+     thus getting a pointer to no storage?  Probably not (16 exabyte
+     string, anyone?) but let's be future-proof anyway. */
+  if (len + 1 < len)
+    {
+      return svn_error_createf(SVN_ERR_REPOS_BAD_REVISION_REPORT, NULL,
+                               _("Invalid length (%" APR_UINT64_T_FMT ") "
+                                 "when about to read a string"), len);
+    }
+
   buf = apr_palloc(pool, len + 1);
   SVN_ERR(svn_io_file_read_full(temp, buf, len, NULL, pool));
   buf[len] = 0;
@@ -263,13 +275,13 @@
           (!*prefix || pi->path[plen] == '/'));
 }
 
-/* Fetch the next pathinfo from B->tempfile for a descendent of
+/* Fetch the next pathinfo from B->tempfile for a descendant of
    PREFIX.  If the next pathinfo is for an immediate child of PREFIX,
    set *ENTRY to the path component of the report information and
    *INFO to the path information for that entry.  If the next pathinfo
-   is for a grandchild or other more remote descendent of PREFIX, set
-   *ENTRY to the immediate child corresponding to that descendent and
-   set *INFO to NULL.  If the next pathinfo is not for a descendent of
+   is for a grandchild or other more remote descendant of PREFIX, set
+   *ENTRY to the immediate child corresponding to that descendant and
+   set *INFO to NULL.  If the next pathinfo is not for a descendant of
    PREFIX, or if we reach the end of the report, set both *ENTRY and
    *INFO to NULL.
 
diff --git a/subversion/libsvn_wc/ambient_depth_filter_editor.c b/subversion/libsvn_wc/ambient_depth_filter_editor.c
index e9b211b..10de8fb 100644
--- a/subversion/libsvn_wc/ambient_depth_filter_editor.c
+++ b/subversion/libsvn_wc/ambient_depth_filter_editor.c
@@ -71,7 +71,7 @@
      additional stipulation that as soon as we find a subtree is not
      present at all, due to being omitted for depth reasons, we set the
      ambiently_excluded flag in its baton, which signals that
-     all descendent batons should be ignored.
+     all descendant batons should be ignored.
      (In fact, we may just re-use the parent baton, since none of the
      other fields will be used anyway.)
 
diff --git a/subversion/libsvn_wc/entries.c b/subversion/libsvn_wc/entries.c
index 1e935ba..bee551a 100644
--- a/subversion/libsvn_wc/entries.c
+++ b/subversion/libsvn_wc/entries.c
@@ -491,10 +491,10 @@
   {
     const char *result;
     SVN_ERR(read_val(&result, buf, end));
-    if (result[0] == '\0')
-      entry->depth = svn_depth_infinity;
-    else
+    if (result)
       entry->depth = svn_depth_from_word(result);
+    else
+      entry->depth = svn_depth_infinity;
   }
   MAYBE_DONE;
 
diff --git a/subversion/libsvn_wc/lock.c b/subversion/libsvn_wc/lock.c
index ecc8b09..d89e5d3 100644
--- a/subversion/libsvn_wc/lock.c
+++ b/subversion/libsvn_wc/lock.c
@@ -2,7 +2,7 @@
  * lock.c:  routines for locking working copy subdirectories.
  *
  * ====================================================================
- * Copyright (c) 2000-2006 CollabNet.  All rights reserved.
+ * Copyright (c) 2000-2007 CollabNet.  All rights reserved.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
@@ -24,6 +24,7 @@
 #include "svn_pools.h"
 #include "svn_path.h"
 #include "svn_sorts.h"
+#include "svn_types.h"
 
 #include "wc.h"
 #include "adm_files.h"
@@ -1314,7 +1315,7 @@
 /* Does the work of closing the access baton ADM_ACCESS.  Any physical
    locks are removed from the working copy if PRESERVE_LOCK is FALSE, or
    are left if PRESERVE_LOCK is TRUE.  Any associated access batons that
-   are direct descendents will also be closed.
+   are direct descendants will also be closed.
 
    ### FIXME: If the set has a "hole", say it contains locks for the
    ### directories A, A/B, A/B/C/X but not A/B/C then closing A/B will not
@@ -1617,3 +1618,53 @@
 
   return FALSE;
 }
+
+
+/* Extend the scope of the svn_adm_access_t * passed in as WALK_BATON
+   for its entire WC tree.  An implementation of
+   svn_wc_entry_callbacks2_t's found_entry() API. */
+static svn_error_t *
+extend_lock_found_entry(const char *path,
+                        const svn_wc_entry_t *entry,
+                        void *walk_baton,
+                        apr_pool_t *pool)
+{
+  /* If PATH is a directory, and it's not already locked, lock it all
+     the way down to its leaf nodes. */
+  if (entry->kind == svn_node_dir &&
+      strcmp(entry->name, SVN_WC_ENTRY_THIS_DIR) != 0)
+    {
+      svn_wc_adm_access_t *anchor_access = walk_baton, *adm_access;
+      svn_boolean_t write_lock =
+        (anchor_access->type == svn_wc__adm_access_write_lock);
+      svn_error_t *err = svn_wc_adm_probe_try3(&adm_access, anchor_access, path,
+                                               write_lock, -1, NULL, NULL, pool);
+      if (err)
+        {
+          if (err->apr_err == SVN_ERR_WC_LOCKED)
+            /* Good!  The directory is *already* locked... */
+            svn_error_clear(err);
+          else
+            return err;
+        }
+    }
+  return SVN_NO_ERROR;
+}
+
+
+/* WC entry walker callbacks for svn_wc__adm_extend_lock_to_tree(). */
+static svn_wc_entry_callbacks2_t extend_lock_walker =
+  {
+    extend_lock_found_entry,
+    svn_wc__walker_default_error_handler
+  };
+
+
+svn_error_t *
+svn_wc__adm_extend_lock_to_tree(svn_wc_adm_access_t *adm_access,
+                                apr_pool_t *pool)
+{
+  return svn_wc_walk_entries3(adm_access->path, adm_access,
+                              &extend_lock_walker, adm_access,
+                              svn_depth_infinity, FALSE, NULL, NULL, pool);
+}
diff --git a/subversion/libsvn_wc/lock.h b/subversion/libsvn_wc/lock.h
index 493e18f..baf7316 100644
--- a/subversion/libsvn_wc/lock.h
+++ b/subversion/libsvn_wc/lock.h
@@ -119,6 +119,14 @@
  */
 svn_error_t *svn_wc__adm_write_check(svn_wc_adm_access_t *adm_access);
 
+/* Ensure ADM_ACCESS has a lock and for an entire WC tree (all the way
+   to its leaf nodes).  While locking a tree up front using
+   LEVELS_TO_LOCK of -1 is a more appropriate operation, this function
+   can be used to extend the depth of a lock via a tree-crawl after a
+   lock is taken out.  Use POOL for temporary allocations. */
+svn_error_t *svn_wc__adm_extend_lock_to_tree(svn_wc_adm_access_t *adm_access,
+                                             apr_pool_t *pool);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
diff --git a/subversion/libsvn_wc/log.c b/subversion/libsvn_wc/log.c
index 1c22800..b6eb3d9 100644
--- a/subversion/libsvn_wc/log.c
+++ b/subversion/libsvn_wc/log.c
@@ -977,6 +977,9 @@
         }
       else
         {
+          /* Deleting full_path requires that any children it has are
+             also locked (issue #3039). */
+          SVN_ERR(svn_wc__adm_extend_lock_to_tree(adm_access, loggy->pool));
           err = svn_wc_remove_from_revision_control(adm_access,
                                                     SVN_WC_ENTRY_THIS_DIR,
                                                     TRUE, /* destroy */
@@ -994,13 +997,15 @@
                                                 loggy->pool);
     }
 
-    if ((err) && (err->apr_err == SVN_ERR_WC_LEFT_LOCAL_MOD))
-      {
-        svn_error_clear(err);
-        return SVN_NO_ERROR;
-      }
-    else
-        return err;
+  if (err && err->apr_err == SVN_ERR_WC_LEFT_LOCAL_MOD)
+    {
+      svn_error_clear(err);
+      return SVN_NO_ERROR;
+    }
+  else
+    {
+      return err;
+    }
 }
 
 static svn_error_t *
diff --git a/subversion/libsvn_wc/status.c b/subversion/libsvn_wc/status.c
index 0db02a7..8ee3005 100644
--- a/subversion/libsvn_wc/status.c
+++ b/subversion/libsvn_wc/status.c
@@ -1041,7 +1041,7 @@
    (BATON == THIS_DIR_BATON) and out-of-date directories' parents
    (BATON == THIS_DIR_BATON->parent_baton).  In the latter case THIS_DIR_BATON
    contains the ood info we want to bubble up to ancestor directories so these
-   accurately reflect the fact they have an ood descendent.
+   accurately reflect the fact they have an ood descendant.
 
    Merge REPOS_TEXT_STATUS and REPOS_PROP_STATUS into the status structure's
    "network" fields.
@@ -1693,7 +1693,7 @@
   svn_wc_status2_t *dir_status = NULL;
 
   /* If nothing has changed and directory has no out of
-     date descendents, return. */
+     date descendants, return. */
   if (db->added || db->prop_changed || db->text_changed
       || db->ood_last_cmt_rev != SVN_INVALID_REVNUM)
     {
diff --git a/subversion/po/fr.po b/subversion/po/fr.po
index bfcd3ad..a1d5ee8 100644
--- a/subversion/po/fr.po
+++ b/subversion/po/fr.po
@@ -9,8 +9,8 @@
 msgstr ""
 "Project-Id-Version: subversion 1.5\n"
 "Report-Msgid-Bugs-To: dev@subversion.tigris.org\n"
-"POT-Creation-Date: 2007-12-05 20:37+0100\n"
-"PO-Revision-Date: 2007-12-05 20:40+0100\n"
+"POT-Creation-Date: 2007-12-09 12:39+0100\n"
+"PO-Revision-Date: 2007-12-09 12:45+0100\n"
 "Last-Translator: Subversion Developers <dev@subversion.tigris.org>\n"
 "Language-Team: French <dev@subversion.tigris.org>\n"
 "MIME-Version: 1.0\n"
@@ -1389,8 +1389,8 @@
 msgid "Cannot display: file marked as a binary type.%s"
 msgstr "Impossible d'afficher : fichier considéré comme binaire.%s"
 
-#: ../libsvn_client/diff.c:881 ../libsvn_client/merge.c:3466
-#: ../libsvn_client/merge.c:4416
+#: ../libsvn_client/diff.c:881 ../libsvn_client/merge.c:3467
+#: ../libsvn_client/merge.c:4422
 msgid "Not all required revisions are specified"
 msgstr "Toutes les révisions requises ne sont pas précisées"
 
@@ -1506,8 +1506,8 @@
 "Aucun parent commun trouvé, impossible de travailler avec des arguments "
 "disjoints"
 
-#: ../libsvn_client/locking_commands.c:261 ../libsvn_client/merge.c:4433
-#: ../libsvn_client/merge.c:4439 ../libsvn_client/merge.c:4569
+#: ../libsvn_client/locking_commands.c:261 ../libsvn_client/merge.c:4439
+#: ../libsvn_client/merge.c:4445 ../libsvn_client/merge.c:4715
 #: ../libsvn_client/ra.c:378 ../libsvn_client/ra.c:415
 #: ../libsvn_client/ra.c:616
 #, c-format
@@ -1569,16 +1569,16 @@
 #. xgettext: the '.working', '.merge-left.r%ld' and
 #. '.merge-right.r%ld' strings are used to tag onto a file
 #. name in case of a merge conflict
-#: ../libsvn_client/merge.c:493
+#: ../libsvn_client/merge.c:495
 msgid ".working"
 msgstr ".courant"
 
-#: ../libsvn_client/merge.c:495
+#: ../libsvn_client/merge.c:497
 #, c-format
 msgid ".merge-left.r%ld"
 msgstr ".fusion-gauche.r%ld"
 
-#: ../libsvn_client/merge.c:498
+#: ../libsvn_client/merge.c:500
 #, c-format
 msgid ".merge-right.r%ld"
 msgstr ".fusion-droit.r%ld"
@@ -1596,7 +1596,7 @@
 "résoudre tous les conflits et ré-exécuter la fusion (merge) pour \n"
 "appliquer les révisions non-fusionnées restantes"
 
-#: ../libsvn_client/merge.c:4246
+#: ../libsvn_client/merge.c:4247
 msgid "Use of two URLs is not compatible with mergeinfo modification"
 msgstr ""
 "L'utilisation de deux URLs n'est pas compatible avec la modification des "
@@ -2837,20 +2837,20 @@
 "L'origine du nœud pour '%s' existe avec une valeur différente (%s) que celle "
 "que nous étions prêt à stocker (%s)"
 
-#: ../libsvn_fs_util/sqlite-util.c:100
+#: ../libsvn_fs_util/sqlite-util.c:110
 msgid "Expected database row missing"
 msgstr "Tuple attendu manquant dans la base de données"
 
-#: ../libsvn_fs_util/sqlite-util.c:101
+#: ../libsvn_fs_util/sqlite-util.c:111
 msgid "Extra database row found"
 msgstr "Tuple en trop dans la base de données"
 
-#: ../libsvn_fs_util/sqlite-util.c:270
+#: ../libsvn_fs_util/sqlite-util.c:299
 #, c-format
 msgid "Index schema format %d not recognized"
 msgstr "Format du schéma d'index %d non reconnu"
 
-#: ../libsvn_fs_util/sqlite-util.c:292
+#: ../libsvn_fs_util/sqlite-util.c:321
 msgid "SQLite is required to be compiled and run in thread-safe mode"
 msgstr ""
 "SQLite doit être compilé et s'exécuter en mode sûr vis à vis des threads"
@@ -2978,7 +2978,7 @@
 
 #: ../libsvn_ra_neon/commit.c:510 ../libsvn_ra_neon/props.c:210
 #: ../libsvn_ra_neon/util.c:518 ../libsvn_ra_serf/commit.c:1337
-#: ../libsvn_ra_serf/commit.c:1727 ../libsvn_ra_serf/update.c:2107
+#: ../libsvn_ra_serf/commit.c:1727 ../libsvn_ra_serf/update.c:2123
 #, c-format
 msgid "Unable to parse URL '%s'"
 msgstr "Impossible d'analyser l'URL '%s'"
@@ -3033,12 +3033,12 @@
 msgid "Missing rev attr in target-revision element"
 msgstr "Attribut révision 'rev' manquant dans un élément 'target-revision'"
 
-#: ../libsvn_ra_neon/fetch.c:1428 ../libsvn_ra_serf/update.c:1433
+#: ../libsvn_ra_neon/fetch.c:1428 ../libsvn_ra_serf/update.c:1449
 #, c-format
 msgid "Missing name attr in absent-directory element"
 msgstr "Attribut nom 'name' manquant dans un élément 'absent-directory'"
 
-#: ../libsvn_ra_neon/fetch.c:1444 ../libsvn_ra_serf/update.c:1456
+#: ../libsvn_ra_neon/fetch.c:1444 ../libsvn_ra_serf/update.c:1472
 #, c-format
 msgid "Missing name attr in absent-file element"
 msgstr "Attribut nom 'name' manquant dans un élément 'absent-directory'"
@@ -3054,13 +3054,13 @@
 msgstr "Attribut révision 'rev' manquant dans un élément 'open-directory'"
 
 #: ../libsvn_ra_neon/fetch.c:1499 ../libsvn_ra_serf/replay.c:255
-#: ../libsvn_ra_serf/update.c:1262
+#: ../libsvn_ra_serf/update.c:1278
 #, c-format
 msgid "Missing name attr in open-directory element"
 msgstr "Attribut nom 'name' manquant dans un élément 'open-directory'"
 
 #: ../libsvn_ra_neon/fetch.c:1526 ../libsvn_ra_serf/replay.c:281
-#: ../libsvn_ra_serf/update.c:1297
+#: ../libsvn_ra_serf/update.c:1313
 #, c-format
 msgid "Missing name attr in add-directory element"
 msgstr "Attribut nom 'name' manquant dans un élément 'add-directory'"
@@ -3076,13 +3076,13 @@
 msgstr "Attribut révision 'rev' manquant dans un élément 'open-file'"
 
 #: ../libsvn_ra_neon/fetch.c:1623 ../libsvn_ra_serf/replay.c:316
-#: ../libsvn_ra_serf/update.c:1337
+#: ../libsvn_ra_serf/update.c:1353
 #, c-format
 msgid "Missing name attr in open-file element"
 msgstr "Attribut nom 'name' manquant dans un élément 'open-file'"
 
 #: ../libsvn_ra_neon/fetch.c:1649 ../libsvn_ra_serf/replay.c:342
-#: ../libsvn_ra_serf/update.c:1372
+#: ../libsvn_ra_serf/update.c:1388
 #, c-format
 msgid "Missing name attr in add-file element"
 msgstr "Attribut nom 'name' manquant dans un élément 'add-file'"
@@ -3103,7 +3103,7 @@
 msgstr "Attribut nom 'name' manquant dans élément 'remove-prop'"
 
 #: ../libsvn_ra_neon/fetch.c:1805 ../libsvn_ra_serf/replay.c:229
-#: ../libsvn_ra_serf/update.c:1402
+#: ../libsvn_ra_serf/update.c:1418
 #, c-format
 msgid "Missing name attr in delete-entry element"
 msgstr "Attribut nom 'name' manquant dans un élément 'delete-entry'"
@@ -3167,7 +3167,7 @@
 msgstr "Données de verrouillage incomplètes"
 
 #: ../libsvn_ra_neon/get_locks.c:297 ../libsvn_ra_serf/property.c:354
-#: ../libsvn_ra_serf/update.c:1864
+#: ../libsvn_ra_serf/update.c:1880
 #, c-format
 msgid "Got unrecognized encoding '%s'"
 msgstr "Encodage non reconnu : '%s'"
@@ -3481,7 +3481,7 @@
 msgstr "Échec de la requête %s sur '%s'"
 
 #: ../libsvn_ra_serf/blame.c:464 ../libsvn_ra_serf/serf.c:512
-#: ../libsvn_ra_serf/update.c:2166 ../libsvn_ra_serf/util.c:1194
+#: ../libsvn_ra_serf/update.c:2182 ../libsvn_ra_serf/util.c:1194
 msgid ""
 "The OPTIONS response did not include the requested version-controlled-"
 "configuration value"
@@ -3498,7 +3498,7 @@
 
 #: ../libsvn_ra_serf/blame.c:496 ../libsvn_ra_serf/commit.c:1128
 #: ../libsvn_ra_serf/property.c:923 ../libsvn_ra_serf/serf.c:528
-#: ../libsvn_ra_serf/update.c:1103 ../libsvn_ra_serf/update.c:1647
+#: ../libsvn_ra_serf/update.c:1119 ../libsvn_ra_serf/update.c:1663
 msgid "The OPTIONS response did not include the requested checked-in value"
 msgstr "La réponse à OPTIONS n'inclut pas de valeur pour 'checked-in'"
 
@@ -3561,7 +3561,7 @@
 msgid "Unlock request failed: %d %s"
 msgstr "Échec de la demande de déverrouillage: %d %s"
 
-#: ../libsvn_ra_serf/replay.c:192 ../libsvn_ra_serf/update.c:1200
+#: ../libsvn_ra_serf/replay.c:192 ../libsvn_ra_serf/update.c:1216
 msgid "Missing revision attr in target-revision element"
 msgstr "Attribut révision 'rev' manquant dans un élément 'target-revision'"
 
@@ -3573,17 +3573,17 @@
 msgid "Missing revision attr in delete-entry element"
 msgstr "Attribut de révision manquant dans un élément 'delete-entry'"
 
-#: ../libsvn_ra_serf/replay.c:261 ../libsvn_ra_serf/update.c:1218
-#: ../libsvn_ra_serf/update.c:1253
+#: ../libsvn_ra_serf/replay.c:261 ../libsvn_ra_serf/update.c:1234
+#: ../libsvn_ra_serf/update.c:1269
 msgid "Missing revision attr in open-directory element"
 msgstr "Attribut révision 'revision' manquant dans un élément 'open-directory'"
 
-#: ../libsvn_ra_serf/replay.c:322 ../libsvn_ra_serf/update.c:1346
+#: ../libsvn_ra_serf/replay.c:322 ../libsvn_ra_serf/update.c:1362
 msgid "Missing revision attr in open-file element"
 msgstr "Attribut révision 'revision' manquant dans un élément 'open-file'"
 
-#: ../libsvn_ra_serf/replay.c:409 ../libsvn_ra_serf/update.c:1492
-#: ../libsvn_ra_serf/update.c:1569
+#: ../libsvn_ra_serf/replay.c:409 ../libsvn_ra_serf/update.c:1508
+#: ../libsvn_ra_serf/update.c:1585
 #, c-format
 msgid "Missing name attr in %s element"
 msgstr "Attribut nom 'name' manquant dans un élément %s"
@@ -3615,7 +3615,7 @@
 msgid "Unsupported RA loader version (%d) for ra_serf"
 msgstr "Version %d du chargeur RA (accès dépôt) non supportée pour ra_serf"
 
-#: ../libsvn_ra_serf/update.c:2237
+#: ../libsvn_ra_serf/update.c:2253
 #, c-format
 msgid "Error retrieving REPORT (%d)"
 msgstr "Erreur à la récupération du REPORT (%d)"
@@ -5983,12 +5983,17 @@
 msgid "File '%s' has binary mime type property"
 msgstr "Le fichier '%s' a un type mime binaire"
 
-#: ../libsvn_wc/props.c:3199 ../libsvn_wc/props.c:3266
+#: ../libsvn_wc/props.c:2609
+#, c-format
+msgid "Unrecognized line ending style for '%s'"
+msgstr "Style de fin de ligne non reconnu pour '%s'"
+
+#: ../libsvn_wc/props.c:3206 ../libsvn_wc/props.c:3273
 #, c-format
 msgid "Error parsing %s property on '%s': '%s'"
 msgstr "Erreur d'analyse de la propriété %s sur '%s' : '%s'"
 
-#: ../libsvn_wc/props.c:3316
+#: ../libsvn_wc/props.c:3323
 #, c-format
 msgid ""
 "Invalid %s property on '%s': target '%s' is an absolute path or involves '..'"
@@ -6432,7 +6437,7 @@
 "Subversion est un outil pour gérer des versions.\n"
 "Pour plus d'informations, voir http://subversion.tigris.org/\n"
 
-#: ../svn/help-cmd.c:65 ../svnsync/main.c:1653
+#: ../svn/help-cmd.c:65 ../svnsync/main.c:1656
 msgid ""
 "The following repository access (RA) modules are available:\n"
 "\n"
@@ -6458,7 +6463,7 @@
 msgid "'%s' has invalid revision"
 msgstr "'%s' a une révision invalide"
 
-#: ../svn/info-cmd.c:239 ../svn/mergeinfo-cmd.c:112 ../svnadmin/main.c:1146
+#: ../svn/info-cmd.c:239 ../svn/mergeinfo-cmd.c:169 ../svnadmin/main.c:1146
 #, c-format
 msgid "Path: %s\n"
 msgstr "Chemin : %s\n"
@@ -6797,7 +6802,7 @@
 
 #: ../svn/main.c:92 ../svnadmin/main.c:237 ../svndumpfilter/main.c:882
 #: ../svnlook/main.c:134 ../svnserve/main.c:151 ../svnsync/main.c:136
-#: ../svnversion/main.c:126
+#: ../svnversion/main.c:127
 msgid "show program version information"
 msgstr "affiche la version du programme"
 
@@ -7023,7 +7028,11 @@
 "précise l'action de la résolution de conflit\n"
 "    ('"
 
-#: ../svn/main.c:261
+#: ../svn/main.c:224
+msgid "query a particular merge source URL\n"
+msgstr "interroge une URL source de fusion particulière\n"
+
+#: ../svn/main.c:263
 msgid ""
 "Put files and directories under version control, scheduling\n"
 "them for addition to repository.  They will be added in next commit.\n"
@@ -7033,11 +7042,11 @@
 "prévoyant leur ajout au dépôt lors de la prochaine propagation (commit).\n"
 "usage : add CHEMIN...\n"
 
-#: ../svn/main.c:267
+#: ../svn/main.c:269
 msgid "add intermediate parents"
 msgstr "ajoute les répertoires intermédiaires"
 
-#: ../svn/main.c:270
+#: ../svn/main.c:272
 msgid ""
 "Output the content of specified files or\n"
 "URLs with revision and author information in-line.\n"
@@ -7052,7 +7061,7 @@
 "\n"
 "  Si précisée, REV détermine quelle révision est d'abord regardée.\n"
 
-#: ../svn/main.c:280
+#: ../svn/main.c:282
 msgid ""
 "Output the content of specified files or URLs.\n"
 "usage: cat TARGET[@REV]...\n"
@@ -7065,7 +7074,7 @@
 "\n"
 "  Si précisée, REV détermine quelle révision est d'abord regardée.\n"
 
-#: ../svn/main.c:288
+#: ../svn/main.c:290
 msgid ""
 "Associate (or deassociate) local paths with changelist CLNAME.\n"
 "usage: 1. changelist CLNAME TARGET...\n"
@@ -7075,7 +7084,7 @@
 "usage : 1. changelist CLNOM CIBLE...\n"
 "        2. changelist --remove CIBLE...\n"
 
-#: ../svn/main.c:294
+#: ../svn/main.c:296
 msgid ""
 "Check out a working copy from a repository.\n"
 "usage: checkout URL[@REV]... [PATH]\n"
@@ -7121,7 +7130,7 @@
 "  modification locale à la copie de travail.\n"
 "  Toutes les propriétés stockées dans le dépôt sont appliquées aux objets.\n"
 
-#: ../svn/main.c:319
+#: ../svn/main.c:321
 msgid ""
 "Recursively clean up the working copy, removing locks, resuming\n"
 "unfinished operations, etc.\n"
@@ -7131,7 +7140,7 @@
 "reprenant les opérations en cours, etc.\n"
 "usage : cleanup [CHEMIN...]\n"
 
-#: ../svn/main.c:326
+#: ../svn/main.c:328
 msgid ""
 "Send changes from your working copy to the repository.\n"
 "usage: commit [PATH...]\n"
@@ -7149,7 +7158,7 @@
 "  Les éléments propagés (commit) qui étaient verrouillés (locked) sont\n"
 "  déverrouillés (unlock) en cas de réussite.\n"
 
-#: ../svn/main.c:334
+#: ../svn/main.c:336
 msgid ""
 "Send changes from your working copy to the repository.\n"
 "usage: commit [PATH...]\n"
@@ -7168,7 +7177,7 @@
 "  (sauf sous OS400). Les éléments propagés (commit) qui étaient verrouillés\n"
 "  (locked) sont déverrouillés (unlock) en cas de réussite.\n"
 
-#: ../svn/main.c:348
+#: ../svn/main.c:350
 msgid ""
 "Duplicate something in working copy or repository, remembering\n"
 "history.\n"
@@ -7198,7 +7207,7 @@
 "    URL -> URL : copie côté serveur ; utilisée pour les branches et marques\n"
 "  Toutes les sources doivent être du même type.\n"
 
-#: ../svn/main.c:364
+#: ../svn/main.c:366
 msgid ""
 "Remove files and directories from version control.\n"
 "usage: 1. delete PATH...\n"
@@ -7228,7 +7237,7 @@
 "\n"
 "  2. Chaque URL est supprimée du dépôt via une propagation immédiate.\n"
 
-#: ../svn/main.c:381
+#: ../svn/main.c:383
 msgid ""
 "Display the differences between two revisions or paths.\n"
 "usage: 1. diff [-c M | -r N[:M]] [TARGET[@REV]...]\n"
@@ -7293,7 +7302,7 @@
 "  Utiliser simplement 'svn diff' pour afficher les modifications locales\n"
 "  dans la copie de travail.\n"
 
-#: ../svn/main.c:411
+#: ../svn/main.c:413
 msgid ""
 "Create an unversioned copy of a tree.\n"
 "usage: 1. export [-r REV] URL[@PEGREV] [PATH]\n"
@@ -7331,7 +7340,7 @@
 "\n"
 "  Si spécifiée, PEGREV donne la révision de la cible d'abord regardée.\n"
 
-#: ../svn/main.c:433
+#: ../svn/main.c:435
 msgid ""
 "Describe the usage of this program or its subcommands.\n"
 "usage: help [SUBCOMMAND...]\n"
@@ -7339,7 +7348,7 @@
 "Décrit l'usage de ce programme ou de ses sous-commandes.\n"
 "usage : help [SOUS_COMMANDE...]\n"
 
-#: ../svn/main.c:439
+#: ../svn/main.c:441
 msgid ""
 "Commit an unversioned file or tree into the repository.\n"
 "usage: import [PATH] URL\n"
@@ -7363,7 +7372,7 @@
 "  Les objects non versionnables tels les périphériques ou les pipes sont\n"
 "  ignorés si l'option '--force' est spécifiée.\n"
 
-#: ../svn/main.c:454
+#: ../svn/main.c:456
 msgid ""
 "Display information about a local or remote item.\n"
 "usage: info [TARGET[@REV]...]\n"
@@ -7379,7 +7388,7 @@
 "  CIBLE peut être un chemin dans une copie de travail ou une URL.\n"
 "  Si REV est spécifié, cette révision est d'abord regardée.\n"
 
-#: ../svn/main.c:465
+#: ../svn/main.c:467
 msgid ""
 "List directory entries in the repository.\n"
 "usage: list [TARGET[@REV]...]\n"
@@ -7416,7 +7425,7 @@
 "  Taille (en octets)\n"
 "  Date et heure de la dernière propagation\n"
 
-#: ../svn/main.c:487
+#: ../svn/main.c:489
 msgid ""
 "Lock working copy paths or URLs in the repository, so that\n"
 "no other user can commit changes to them.\n"
@@ -7430,19 +7439,19 @@
 "  Utiliser --force pour voler le verrou d'un autre utilisateur ou d'une\n"
 "  autre copie de travail.\n"
 
-#: ../svn/main.c:494
+#: ../svn/main.c:496
 msgid "read lock comment from file ARG"
 msgstr "lit les commentaire de verrouillage à partir du fichier ARG"
 
-#: ../svn/main.c:495
+#: ../svn/main.c:497
 msgid "specify lock comment ARG"
 msgstr "précise le commentaire de verrouillage ARG"
 
-#: ../svn/main.c:496
+#: ../svn/main.c:498
 msgid "force validity of lock comment source"
 msgstr "force la validité de la source du commentaire de verrouillage"
 
-#: ../svn/main.c:499
+#: ../svn/main.c:501
 msgid ""
 "Show the log messages for a set of revision(s) and/or file(s).\n"
 "usage: 1. log [PATH]\n"
@@ -7497,15 +7506,15 @@
 "    svn log http://www.exemple.fr/depot/projet/truc.c\n"
 "    svn log http://www.exemple.fr/depot/projet truc.c bidule.c\n"
 
-#: ../svn/main.c:528
+#: ../svn/main.c:530
 msgid "retrieve revision property ARG"
 msgstr "Retrouve la propriété de révision ARG"
 
-#: ../svn/main.c:529
+#: ../svn/main.c:531
 msgid "the change made by ARG"
 msgstr "Le changement fait par ARG"
 
-#: ../svn/main.c:532
+#: ../svn/main.c:534
 msgid ""
 "Apply the differences between two sources to a working copy path.\n"
 "usage: 1. merge sourceURL1[@N] sourceURL2[@M] [WCPATH]\n"
@@ -7555,15 +7564,19 @@
 "  2. Les URLs sont déduites des chemins dans la copie de travail.\n"
 "     Les révisions doivent être précisées.\n"
 "\n"
-"  3. Dans cette troisième forme, SOURCE est une URL ou un chemin dans la copie\n"
+"  3. Dans cette troisième forme, SOURCE est une URL ou un chemin dans la "
+"copie\n"
 "     de travail (auquel cas l'URL correspondante est utilisée). \n"
 "     Si non spécifiée, SOURCE sera identique à CHEMIN.\n"
 "     La SOURCE à la révision REV est comparée telle qu'elle existait entre\n"
 "     les révisions N et M pour chaque intervalle de révision fourni.\n"
 "     Si REV n'est pas précisée, HEAD est utilisée. '-c M' est équivalent\n"
-"     à '-r <M-1>:M' et '-c -M' à l'inverse, '-r M:<M-1>'. Si aucun intervalle\n"
-"     de révision n'est précisé, 1:HEAD est utilisé. Des intervalles multiples\n"
-"     avec '-c' et/ou '-r' peuvent être utilisé, et il est possible de mélanger\n"
+"     à '-r <M-1>:M' et '-c -M' à l'inverse, '-r M:<M-1>'. Si aucun "
+"intervalle\n"
+"     de révision n'est précisé, 1:HEAD est utilisé. Des intervalles "
+"multiples\n"
+"     avec '-c' et/ou '-r' peuvent être utilisé, et il est possible de "
+"mélanger\n"
 "     des intervalles avant et arrière -- les intervalles sont en interne \n"
 "     compacté en une représentation minimale avant d'être fusionnés, \n"
 "     ce qui peut résulter en une opération vide.\n"
@@ -7573,10 +7586,11 @@
 "  identique à un fichier dans '.', auquel cas ce fichier sera modifié.\n"
 "\n"
 "  NOTE : Subversion garde trace en interne des fusions opérées si les deux\n"
-"  sources sont parentes l'une de l'autre, dans un sens ou dans l'autre. Cela\n"
+"  sources sont parentes l'une de l'autre, dans un sens ou dans l'autre. "
+"Cela\n"
 "  est garanti si la troisième forme ci-dessus est utilisée.\n"
 
-#: ../svn/main.c:573
+#: ../svn/main.c:575
 msgid ""
 "Query merge-related information.\n"
 "usage: mergeinfo [TARGET[@REV]...]\n"
@@ -7584,7 +7598,7 @@
 "Demande les informations liées à la fusion (merge).\n"
 "usage : mergeinfo [CIBLE[@REV]...]\n"
 
-#: ../svn/main.c:578
+#: ../svn/main.c:580
 msgid ""
 "Create a new directory under version control.\n"
 "usage: 1. mkdir PATH...\n"
@@ -7613,7 +7627,7 @@
 "  Dans les deux cas, les répertoires intermédiaires doivent déjà exister,\n"
 "  sauf si l'option --parents est présente.\n"
 
-#: ../svn/main.c:595
+#: ../svn/main.c:597
 msgid ""
 "Move and/or rename something in working copy or repository.\n"
 "usage: move SRC... DST\n"
@@ -7644,7 +7658,7 @@
 "    URL -> URL : effectue un renommage côté serveur.\n"
 "  Toutes les sources doivent être du même type.\n"
 
-#: ../svn/main.c:612
+#: ../svn/main.c:614
 msgid ""
 "Remove a property from files, dirs, or revisions.\n"
 "usage: 1. propdel PROPNAME [PATH...]\n"
@@ -7662,7 +7676,7 @@
 "  2. Supprime une propriété non versionnée d'une révision du dépôt.\n"
 "     CIBLE détermine uniquement à quel dépôt accéder.\n"
 
-#: ../svn/main.c:624
+#: ../svn/main.c:626
 msgid ""
 "Edit a property with an external editor.\n"
 "usage: 1. propedit PROPNAME TARGET...\n"
@@ -7684,7 +7698,7 @@
 "\n"
 "Voir 'svn help propset' pour plus d'informations sur les propriétés.\n"
 
-#: ../svn/main.c:638
+#: ../svn/main.c:640
 msgid ""
 "Print the value of a property on files, dirs, or revisions.\n"
 "usage: 1. propget PROPNAME [TARGET[@REV]...]\n"
@@ -7717,7 +7731,7 @@
 "  Utiliser --strict pour désactiver ces améliorations esthétiques, par\n"
 "  exemple pour rediriger les propriétés binaires vers un fichier.\n"
 
-#: ../svn/main.c:657
+#: ../svn/main.c:659
 msgid ""
 "List all properties on files, dirs, or revisions.\n"
 "usage: 1. proplist [TARGET[@REV]...]\n"
@@ -7737,7 +7751,7 @@
 "  2. Liste les propriétés non versionnées d'une révision du dépôt.\n"
 "     CIBLE détermine uniquement à quel dépôt accéder.\n"
 
-#: ../svn/main.c:669
+#: ../svn/main.c:671
 msgid ""
 "Set the value of a property on files, dirs, or revisions.\n"
 "usage: 1. propset PROPNAME PROPVAL PATH...\n"
@@ -7858,11 +7872,11 @@
 "  modification non récursive sur un répertoire échouera. Une modification\n"
 "  récursive s'appliquera seulement aux fichiers fils du répertoire.\n"
 
-#: ../svn/main.c:730
+#: ../svn/main.c:732
 msgid "read property value from file ARG"
 msgstr "prend la valeur d'une propriété dans le fichier ARG"
 
-#: ../svn/main.c:733
+#: ../svn/main.c:735
 msgid ""
 "Remove 'conflicted' state on working copy files or directories.\n"
 "usage: resolved PATH...\n"
@@ -7878,7 +7892,7 @@
 "  supprime simplement les fichiers relatifs au conflit pour permettre une\n"
 "  propagation (commit) ultérieure.\n"
 
-#: ../svn/main.c:740
+#: ../svn/main.c:742
 msgid ""
 "specify automatic conflict resolution source\n"
 "                             '"
@@ -7886,7 +7900,7 @@
 "précise la source de la résolution automatique de conflit\n"
 "    '"
 
-#: ../svn/main.c:747
+#: ../svn/main.c:749
 msgid ""
 "Restore pristine working copy file (undo most local edits).\n"
 "usage: revert PATH...\n"
@@ -7900,7 +7914,7 @@
 "  Note : cette sous-commande n'a pas besoin d'accès réseau, et résout les\n"
 "  conflits. Elle ne restaure cependant pas les répertoires supprimés.\n"
 
-#: ../svn/main.c:756
+#: ../svn/main.c:758
 msgid ""
 "Print the status of working copy files and directories.\n"
 "usage: status [PATH...]\n"
@@ -8051,7 +8065,7 @@
 "                 965       687 suzy         wc/zig.c\n"
 "    État par rapport à la révision   981\n"
 
-#: ../svn/main.c:833
+#: ../svn/main.c:835
 msgid ""
 "Update the working copy to a different URL.\n"
 "usage: 1. switch URL[@PEGREV] [PATH]\n"
@@ -8108,7 +8122,7 @@
 "  modification locale à la copie de travail.\n"
 "  Toutes les propriétés stockées dans le dépôt sont appliquées aux objets.\n"
 
-#: ../svn/main.c:863
+#: ../svn/main.c:865
 msgid ""
 "Unlock working copy paths or URLs.\n"
 "usage: unlock TARGET...\n"
@@ -8120,7 +8134,7 @@
 "\n"
 "  Utiliser --force pour casser le verrou.\n"
 
-#: ../svn/main.c:870
+#: ../svn/main.c:872
 msgid ""
 "Bring changes from the repository into the working copy.\n"
 "usage: update [PATH...]\n"
@@ -8186,52 +8200,52 @@
 "colonne.\n"
 "\n"
 
-#: ../svn/main.c:947 ../svnadmin/main.c:78 ../svnlook/main.c:329
+#: ../svn/main.c:949 ../svnadmin/main.c:78 ../svnlook/main.c:329
 #: ../svnsync/main.c:184
 msgid "Caught signal"
 msgstr "Signal reçu"
 
-#: ../svn/main.c:966
+#: ../svn/main.c:968
 msgid "Revision property pair is empty"
 msgstr "La paire de la propriété de révision est vide"
 
-#: ../svn/main.c:986 ../svn/propedit-cmd.c:60 ../svn/propget-cmd.c:181
+#: ../svn/main.c:988 ../svn/propedit-cmd.c:60 ../svn/propget-cmd.c:181
 #: ../svn/propset-cmd.c:65
 #, c-format
 msgid "'%s' is not a valid Subversion property name"
 msgstr "'%s' n'est pas un nom de propriété de Subversion valide"
 
-#: ../svn/main.c:1106 ../svnlook/main.c:2083
+#: ../svn/main.c:1108 ../svnlook/main.c:2083
 msgid "Non-numeric limit argument given"
 msgstr "L'argument de l'option limit doit être numérique"
 
-#: ../svn/main.c:1112 ../svnlook/main.c:2089
+#: ../svn/main.c:1114 ../svnlook/main.c:2089
 msgid "Argument to --limit must be positive"
 msgstr "L'argument de --limit doit être positif"
 
-#: ../svn/main.c:1134 ../svn/main.c:1342
+#: ../svn/main.c:1136 ../svn/main.c:1344
 msgid "Can't specify -c with --old"
 msgstr "Option -c incompatible avec --old"
 
-#: ../svn/main.c:1141
+#: ../svn/main.c:1143
 msgid "Non-numeric change argument given to -c"
 msgstr "L'argument de l'option -c doit être numérique"
 
-#: ../svn/main.c:1148
+#: ../svn/main.c:1150
 msgid "There is no change 0"
 msgstr "Il n'y a pas de changement (option -c) 0"
 
-#: ../svn/main.c:1182 ../svnadmin/main.c:1345
+#: ../svn/main.c:1184 ../svnadmin/main.c:1345
 #, c-format
 msgid "Syntax error in revision argument '%s'"
 msgstr "Erreur de syntaxe à l'argument de révision '%s'"
 
-#: ../svn/main.c:1255
+#: ../svn/main.c:1257
 #, c-format
 msgid "Error converting depth from locale to UTF8"
 msgstr "Erreur en convertissant la profondeur de la 'locale' vers UTF8"
 
-#: ../svn/main.c:1263
+#: ../svn/main.c:1265
 #, c-format
 msgid ""
 "'%s' is not a valid depth; try 'empty', 'files', 'immediates', or 'infinity'"
@@ -8239,29 +8253,29 @@
 "'%s' n'est pas un profondeur valide ; essayer 'empty' (vide), "
 "'files' (fichiers), 'immediates' (immédiat) ou 'infinity' (infini)"
 
-#: ../svn/main.c:1370
+#: ../svn/main.c:1372
 #, c-format
 msgid "Syntax error in native-eol argument '%s'"
 msgstr ""
 "Erreur de syntaxe à l'argument de fin de ligne native (native-eol) '%s'"
 
-#: ../svn/main.c:1414
+#: ../svn/main.c:1416
 #, c-format
 msgid "'%s' is not a valid accept value"
 msgstr "'%s' n'est pas une valeur d'acceptation valide"
 
-#: ../svn/main.c:1467 ../svndumpfilter/main.c:1314 ../svnlook/main.c:2161
+#: ../svn/main.c:1473 ../svndumpfilter/main.c:1314 ../svnlook/main.c:2161
 #, c-format
 msgid "Subcommand argument required\n"
 msgstr "Argument de la sous-commande attendu\n"
 
-#: ../svn/main.c:1486 ../svnadmin/main.c:1477 ../svndumpfilter/main.c:1333
+#: ../svn/main.c:1492 ../svnadmin/main.c:1477 ../svndumpfilter/main.c:1333
 #: ../svnlook/main.c:2180
 #, c-format
 msgid "Unknown command: '%s'\n"
 msgstr "Commande inconnue : '%s'\n"
 
-#: ../svn/main.c:1520
+#: ../svn/main.c:1526
 #, c-format
 msgid ""
 "Subcommand '%s' doesn't accept option '%s'\n"
@@ -8270,7 +8284,7 @@
 "La sous-commande '%s' n'accepte pas l'option '%s'\n"
 "Entrer 'svn help %s' pour l'aide.\n"
 
-#: ../svn/main.c:1534
+#: ../svn/main.c:1540
 msgid ""
 "Multiple revision arguments encountered; can't specify -c twice, or both -c "
 "and -r"
@@ -8278,17 +8292,17 @@
 "Arguments de révision multiples : ne pas répéter -c, ou utiliser à la fois -"
 "c et -r"
 
-#: ../svn/main.c:1586
+#: ../svn/main.c:1592
 msgid "Log message file is a versioned file; use '--force-log' to override"
 msgstr ""
 "Le fichier de l'entrée du journal est versionné; forcer avec '--force-log'"
 
-#: ../svn/main.c:1593
+#: ../svn/main.c:1599
 msgid "Lock comment file is a versioned file; use '--force-log' to override"
 msgstr ""
 "Le fichier de commentaire du verrou est versionné ; forcer avec '--force-log'"
 
-#: ../svn/main.c:1613
+#: ../svn/main.c:1619
 msgid ""
 "The log message is a pathname (was -F intended?); use '--force-log' to "
 "override"
@@ -8296,7 +8310,7 @@
 "Le message de propagation donné est un chemin (-F était voulu ?) ; forcer "
 "avec '--force-log'"
 
-#: ../svn/main.c:1620
+#: ../svn/main.c:1626
 msgid ""
 "The lock comment is a pathname (was -F intended?); use '--force-log' to "
 "override"
@@ -8304,24 +8318,24 @@
 "Le commentaire du verrou est un chemin de fichier (-F était voulu ?) ; "
 "forcer avec '--force-log'"
 
-#: ../svn/main.c:1631
+#: ../svn/main.c:1637
 msgid "--relocate and --depth are mutually exclusive"
 msgstr "--relocate et --depth sont mutuellement exclusives"
 
-#: ../svn/main.c:1698
+#: ../svn/main.c:1704
 msgid "--auto-props and --no-auto-props are mutually exclusive"
 msgstr "--auto-props et --no-auto-props sont mutuellement exclusives"
 
-#: ../svn/main.c:1810 ../svn/main.c:1816
+#: ../svn/main.c:1816 ../svn/main.c:1822
 #, c-format
 msgid "--accept=%s incompatible with --non-interactive"
 msgstr "--accept=%s incompatible avec --non-interactive"
 
-#: ../svn/main.c:1843
+#: ../svn/main.c:1849
 msgid "Try 'svn help' for more info"
 msgstr "Essayer 'svn help' pour plus d'information."
 
-#: ../svn/main.c:1853
+#: ../svn/main.c:1859
 msgid ""
 "svn: run 'svn cleanup' to remove locks (type 'svn help cleanup' for "
 "details)\n"
@@ -8341,12 +8355,12 @@
 msgstr ""
 "Une fusion à partir de sources locales nécessite une révision explicite"
 
-#: ../svn/mergeinfo-cmd.c:135
+#: ../svn/mergeinfo-cmd.c:77
 #, c-format
 msgid "  Source path: %s\n"
 msgstr "  Chemin de la source : %s\n"
 
-#: ../svn/mergeinfo-cmd.c:137
+#: ../svn/mergeinfo-cmd.c:79
 #, c-format
 msgid "    Merged ranges: "
 msgstr "    Révisions fusionnées : "
@@ -8361,12 +8375,12 @@
 #. ### may just mean the system has to work harder to
 #. ### provide that information.
 #.
-#: ../svn/mergeinfo-cmd.c:152
+#: ../svn/mergeinfo-cmd.c:93
 #, c-format
 msgid "    Eligible ranges: "
 msgstr "    Fusions possibles : "
 
-#: ../svn/mergeinfo-cmd.c:165
+#: ../svn/mergeinfo-cmd.c:106
 #, c-format
 msgid "(source no longer available in HEAD)\n"
 msgstr "(source non disponible à la révision de tête - HEAD)\n"
@@ -9996,7 +10010,7 @@
 msgid "run in foreground (useful for debugging)"
 msgstr "lancement en avant-plan (foreground, utile pour le déboguage)"
 
-#: ../svnserve/main.c:149 ../svnversion/main.c:124
+#: ../svnserve/main.c:149 ../svnversion/main.c:125
 msgid "display this help"
 msgstr "affiche cet aide"
 
@@ -10114,20 +10128,20 @@
 msgid "Can't create thread"
 msgstr "Impossible de créer une thread"
 
-#: ../svnserve/serve.c:1495
+#: ../svnserve/serve.c:1498
 msgid "Path is not a string"
 msgstr "Le chemin n'est pas une chaîne de caractère"
 
-#: ../svnserve/serve.c:1638
+#: ../svnserve/serve.c:1641
 msgid "Log revprop entry not a string"
 msgstr "L'entrée 'log' n'est pas une chaîne de caractères"
 
-#: ../svnserve/serve.c:1645
+#: ../svnserve/serve.c:1648
 #, c-format
 msgid "Unknown revprop word '%s' in log command"
 msgstr "Mot de propriété de révision '%s' inconnu dans une commande de log"
 
-#: ../svnserve/serve.c:1661
+#: ../svnserve/serve.c:1664
 msgid "Log path entry not a string"
 msgstr "L'entrée 'path' n'est pas une chaîne de caractères"
 
@@ -10306,8 +10320,8 @@
 msgid "Destination repository is already synchronizing from '%s'"
 msgstr "Le dépôt destination est déjà synchronisé à partir de '%s'"
 
-#: ../svnsync/main.c:683 ../svnsync/main.c:686 ../svnsync/main.c:1472
-#: ../svnsync/main.c:1622
+#: ../svnsync/main.c:683 ../svnsync/main.c:686 ../svnsync/main.c:1475
+#: ../svnsync/main.c:1625
 #, c-format
 msgid "Path '%s' is not a URL"
 msgstr "Le chemin '%s' n'est pas une URL"
@@ -10326,12 +10340,12 @@
 msgid "UUID of source repository (%s) does not match expected UUID (%s)"
 msgstr "UUID du dépôt source (%s) différent de celui attendu (%s)"
 
-#: ../svnsync/main.c:1271
+#: ../svnsync/main.c:1274
 #, c-format
 msgid "Commit created rev %ld but should have created %ld"
 msgstr "La propagation (commit) a créé la révision %ld au lieu de la %ld"
 
-#: ../svnsync/main.c:1376
+#: ../svnsync/main.c:1379
 #, c-format
 msgid ""
 "Revision being currently copied (%ld), last merged revision (%ld), and "
@@ -10342,7 +10356,7 @@
 "et la révision de tête de la destination (%ld) sont incohérentes. Auriez-"
 "vous propagé vers la destination sans utiliser 'svnsync' ?"
 
-#: ../svnsync/main.c:1415
+#: ../svnsync/main.c:1418
 #, c-format
 msgid ""
 "Destination HEAD (%ld) is not the last merged revision (%ld); have you "
@@ -10352,7 +10366,7 @@
 "dernière révision fusionnée (%ld). Auriez-vous propagé vers la destination "
 "sans utiliser 'svnsync' ?"
 
-#: ../svnsync/main.c:1515 ../svnsync/main.c:1520
+#: ../svnsync/main.c:1518 ../svnsync/main.c:1523
 #, c-format
 msgid ""
 "Cannot copy revprops for a revision (%ld) that has not been synchronized yet"
@@ -10360,17 +10374,17 @@
 "Impossible de copier les propriétés de révision d'une révision (%ld) non "
 "encore synchronisée"
 
-#: ../svnsync/main.c:1572
+#: ../svnsync/main.c:1575
 #, c-format
 msgid "'%s' is not a valid revision range"
 msgstr "'%s' n'est pas un intervalle de révisions valide"
 
-#: ../svnsync/main.c:1586 ../svnsync/main.c:1606
+#: ../svnsync/main.c:1589 ../svnsync/main.c:1609
 #, c-format
 msgid "Invalid revision number (%ld)"
 msgstr "Numéro de révision invalide (%ld)"
 
-#: ../svnsync/main.c:1646
+#: ../svnsync/main.c:1649
 msgid ""
 "general usage: svnsync SUBCOMMAND DEST_URL  [ARGS & OPTIONS ...]\n"
 "Type 'svnsync help <subcommand>' for help on a specific subcommand.\n"
@@ -10384,7 +10398,7 @@
 "\n"
 "Sous-commandes disponibles :\n"
 
-#: ../svnsync/main.c:1808
+#: ../svnsync/main.c:1811
 msgid ""
 "Cannot use --username or --password with any of --source-username, --source-"
 "password, --sync-username, or --sync-password.\n"
@@ -10392,7 +10406,7 @@
 "Impossible d'utiliser --username ou --password pour un des --source-"
 "username, --source-password, --sync-username ou --sync-password.\n"
 
-#: ../svnsync/main.c:1888
+#: ../svnsync/main.c:1891
 #, c-format
 msgid ""
 "Subcommand '%s' doesn't accept option '%s'\n"
@@ -10401,7 +10415,7 @@
 "La sous-commande '%s' n'accepte pas l'option '%s'\n"
 "Entrer 'svnsync help %s' pour l'aide.\n"
 
-#: ../svnsync/main.c:1960
+#: ../svnsync/main.c:1963
 msgid "Try 'svnsync help' for more info"
 msgstr "Essayer 'svnsync help' pour plus d'information"
 
@@ -10432,6 +10446,7 @@
 "   4123:4168     mixed revision working copy\n"
 "   4168M         modified working copy\n"
 "   4123S         switched working copy\n"
+"   4123P         partial working copy, from a sparse checkout\n"
 "   4123:4168MS   mixed revision, modified, switched working copy\n"
 "\n"
 "  If invoked on a directory that is not a working copy, an\n"
@@ -10459,6 +10474,7 @@
 "    4123:4168     copie mixte, composée de différentes révisions\n"
 "    4168M         copie localement modifiée\n"
 "    4123S         copie ré-aiguillée\n"
+"    4123P         copie partielle tirée d'une extraction partielle (sparse)\n"
 "    4123:4168MS   copie mixte, modifiée, ré-aiguillée...\n"
 "\n"
 "  Quand la commande est invoquée sur un répertoire qui n'est pas une copie\n"
@@ -10468,20 +10484,20 @@
 "\n"
 "Options disponibles :\n"
 
-#: ../svnversion/main.c:122
+#: ../svnversion/main.c:123
 msgid "do not output the trailing newline"
 msgstr "pas de fin de ligne"
 
-#: ../svnversion/main.c:123
+#: ../svnversion/main.c:124
 msgid "last changed rather than current revisions"
 msgstr "dernière révision modifiée plutôt que la courante"
 
-#: ../svnversion/main.c:222
+#: ../svnversion/main.c:223
 #, c-format
 msgid "exported%s"
 msgstr "exporté%s"
 
-#: ../svnversion/main.c:231
+#: ../svnversion/main.c:232
 #, c-format
 msgid "'%s' not versioned, and not exported\n"
 msgstr "'%s' non versionné et non exporté\n"
diff --git a/subversion/po/pl.po b/subversion/po/pl.po
index 104ceb5..420d33d 100644
--- a/subversion/po/pl.po
+++ b/subversion/po/pl.po
@@ -34,7 +34,7 @@
 msgstr ""
 "Project-Id-Version: subversion 1.5\n"
 "Report-Msgid-Bugs-To: dev@subversion.tigris.org\n"
-"POT-Creation-Date: 2007-12-02 21:30+0100\n"
+"POT-Creation-Date: 2007-12-09 20:32+0100\n"
 "PO-Revision-Date: 2007-12-02 21:30+0100\n"
 "Last-Translator: Subversion Developers <dev@subversion.tigris.org>\n"
 "Language-Team: Polish <dev@subversion.tigris.org>\n"
@@ -1288,8 +1288,8 @@
 msgid "Cannot display: file marked as a binary type.%s"
 msgstr "Nie można wyświetlić: plik binarny.%s"
 
-#: ../libsvn_client/diff.c:881 ../libsvn_client/merge.c:3464
-#: ../libsvn_client/merge.c:4414
+#: ../libsvn_client/diff.c:881 ../libsvn_client/merge.c:3467
+#: ../libsvn_client/merge.c:4422
 msgid "Not all required revisions are specified"
 msgstr "Nie wszystkie wymagane wersje zostały podane"
 
@@ -1407,8 +1407,8 @@
 msgstr ""
 "Nie znaleziono wspólnego rodzica, nie można użyć rozłącznych argumentów"
 
-#: ../libsvn_client/locking_commands.c:261 ../libsvn_client/merge.c:4431
-#: ../libsvn_client/merge.c:4437 ../libsvn_client/merge.c:4567
+#: ../libsvn_client/locking_commands.c:261 ../libsvn_client/merge.c:4439
+#: ../libsvn_client/merge.c:4445 ../libsvn_client/merge.c:4715
 #: ../libsvn_client/ra.c:378 ../libsvn_client/ra.c:415
 #: ../libsvn_client/ra.c:616
 #, c-format
@@ -1471,21 +1471,21 @@
 #. xgettext: the '.working', '.merge-left.r%ld' and
 #. '.merge-right.r%ld' strings are used to tag onto a file
 #. name in case of a merge conflict
-#: ../libsvn_client/merge.c:493
+#: ../libsvn_client/merge.c:495
 msgid ".working"
 msgstr ".robocza"
 
-#: ../libsvn_client/merge.c:495
+#: ../libsvn_client/merge.c:497
 #, c-format
 msgid ".merge-left.r%ld"
 msgstr ".merge-lewo.w%ld"
 
-#: ../libsvn_client/merge.c:498
+#: ../libsvn_client/merge.c:500
 #, c-format
 msgid ".merge-right.r%ld"
 msgstr ".merge-prawo.w%ld"
 
-#: ../libsvn_client/merge.c:2112
+#: ../libsvn_client/merge.c:2114
 #, c-format
 msgid ""
 "One or more conflicts were produced while merging r%ld:%ld into\n"
@@ -1498,7 +1498,7 @@
 "rozwiąż wszystkie konflikty i uruchom merge ponownie, by zastosować\n"
 "pozostałe wersje"
 
-#: ../libsvn_client/merge.c:4244
+#: ../libsvn_client/merge.c:4247
 msgid "Use of two URLs is not compatible with mergeinfo modification"
 msgstr ""
 "Użycie dwu URL-i jest niekompatybilne z modyfikacją informacji połączenia"
@@ -2723,20 +2723,20 @@
 "Pochodzenie węzła dla '%s' istnieje z inną wartością (%s) niż ta, którą "
 "prawie mieliśmy zapisać (%s)"
 
-#: ../libsvn_fs_util/sqlite-util.c:100
+#: ../libsvn_fs_util/sqlite-util.c:110
 msgid "Expected database row missing"
 msgstr "Brak oczekiwanego wiersza bazy danych"
 
-#: ../libsvn_fs_util/sqlite-util.c:101
+#: ../libsvn_fs_util/sqlite-util.c:111
 msgid "Extra database row found"
 msgstr "Znaleziono dodatkowy wiersz bazy danych"
 
-#: ../libsvn_fs_util/sqlite-util.c:270
+#: ../libsvn_fs_util/sqlite-util.c:299
 #, c-format
 msgid "Index schema format %d not recognized"
 msgstr "Format %d schematu indeksu nierozpoznany"
 
-#: ../libsvn_fs_util/sqlite-util.c:292
+#: ../libsvn_fs_util/sqlite-util.c:321
 msgid "SQLite is required to be compiled and run in thread-safe mode"
 msgstr "SQLite musi być zbudowane i uruchomione w trybie bezpiecznowątkowym"
 
@@ -2863,7 +2863,7 @@
 
 #: ../libsvn_ra_neon/commit.c:510 ../libsvn_ra_neon/props.c:210
 #: ../libsvn_ra_neon/util.c:518 ../libsvn_ra_serf/commit.c:1337
-#: ../libsvn_ra_serf/commit.c:1727 ../libsvn_ra_serf/update.c:2107
+#: ../libsvn_ra_serf/commit.c:1727 ../libsvn_ra_serf/update.c:2123
 #, c-format
 msgid "Unable to parse URL '%s'"
 msgstr "Nie można parsować URL-u: '%s'"
@@ -2918,12 +2918,12 @@
 msgid "Missing rev attr in target-revision element"
 msgstr "Brak atrybutu wersji w elemencie target-revision"
 
-#: ../libsvn_ra_neon/fetch.c:1428 ../libsvn_ra_serf/update.c:1433
+#: ../libsvn_ra_neon/fetch.c:1428 ../libsvn_ra_serf/update.c:1449
 #, c-format
 msgid "Missing name attr in absent-directory element"
 msgstr "Brak atrybutu nazwy w elemencie absent-directory"
 
-#: ../libsvn_ra_neon/fetch.c:1444 ../libsvn_ra_serf/update.c:1456
+#: ../libsvn_ra_neon/fetch.c:1444 ../libsvn_ra_serf/update.c:1472
 #, c-format
 msgid "Missing name attr in absent-file element"
 msgstr "Brak atrybutu nazwy w elemencie absent-file"
@@ -2939,13 +2939,13 @@
 msgstr "Brak atrybutu wersji w elemencie open-directory"
 
 #: ../libsvn_ra_neon/fetch.c:1499 ../libsvn_ra_serf/replay.c:255
-#: ../libsvn_ra_serf/update.c:1262
+#: ../libsvn_ra_serf/update.c:1278
 #, c-format
 msgid "Missing name attr in open-directory element"
 msgstr "Brak atrybutu nazwy w elemencie open-directory"
 
 #: ../libsvn_ra_neon/fetch.c:1526 ../libsvn_ra_serf/replay.c:281
-#: ../libsvn_ra_serf/update.c:1297
+#: ../libsvn_ra_serf/update.c:1313
 #, c-format
 msgid "Missing name attr in add-directory element"
 msgstr "Brak atrybutu nazwy w elemencie add-directory"
@@ -2961,13 +2961,13 @@
 msgstr "Brak atrybutu wersji w elemencie open-file"
 
 #: ../libsvn_ra_neon/fetch.c:1623 ../libsvn_ra_serf/replay.c:316
-#: ../libsvn_ra_serf/update.c:1337
+#: ../libsvn_ra_serf/update.c:1353
 #, c-format
 msgid "Missing name attr in open-file element"
 msgstr "Brak atrybutu nazwy w elemencie open-file"
 
 #: ../libsvn_ra_neon/fetch.c:1649 ../libsvn_ra_serf/replay.c:342
-#: ../libsvn_ra_serf/update.c:1372
+#: ../libsvn_ra_serf/update.c:1388
 #, c-format
 msgid "Missing name attr in add-file element"
 msgstr "Brak atrybutu nazwy w elemencie add-file"
@@ -2988,7 +2988,7 @@
 msgstr "Brak atrybutu nazwy w elemencie remove-prop"
 
 #: ../libsvn_ra_neon/fetch.c:1805 ../libsvn_ra_serf/replay.c:229
-#: ../libsvn_ra_serf/update.c:1402
+#: ../libsvn_ra_serf/update.c:1418
 #, c-format
 msgid "Missing name attr in delete-entry element"
 msgstr "Brak atrybutu nazwy w elemencie delete-entry"
@@ -3050,7 +3050,7 @@
 msgstr "Zwrócono niepełne dane blokady"
 
 #: ../libsvn_ra_neon/get_locks.c:297 ../libsvn_ra_serf/property.c:354
-#: ../libsvn_ra_serf/update.c:1864
+#: ../libsvn_ra_serf/update.c:1880
 #, c-format
 msgid "Got unrecognized encoding '%s'"
 msgstr "Uzyskano nierozpoznane kodowanie: '%s'"
@@ -3365,7 +3365,7 @@
 msgstr "Żądanie %s nie powiodło się dla '%s'"
 
 #: ../libsvn_ra_serf/blame.c:464 ../libsvn_ra_serf/serf.c:512
-#: ../libsvn_ra_serf/update.c:2166 ../libsvn_ra_serf/util.c:1194
+#: ../libsvn_ra_serf/update.c:2182 ../libsvn_ra_serf/util.c:1194
 msgid ""
 "The OPTIONS response did not include the requested version-controlled-"
 "configuration value"
@@ -3382,7 +3382,7 @@
 
 #: ../libsvn_ra_serf/blame.c:496 ../libsvn_ra_serf/commit.c:1128
 #: ../libsvn_ra_serf/property.c:923 ../libsvn_ra_serf/serf.c:528
-#: ../libsvn_ra_serf/update.c:1103 ../libsvn_ra_serf/update.c:1647
+#: ../libsvn_ra_serf/update.c:1119 ../libsvn_ra_serf/update.c:1663
 msgid "The OPTIONS response did not include the requested checked-in value"
 msgstr "Odpowiedź OPTIONS nie zawiera wymaganej wartości checked-in"
 
@@ -3445,7 +3445,7 @@
 msgid "Unlock request failed: %d %s"
 msgstr "Żądanie zdjęcia blokady nie powiodło się: %d %s"
 
-#: ../libsvn_ra_serf/replay.c:192 ../libsvn_ra_serf/update.c:1200
+#: ../libsvn_ra_serf/replay.c:192 ../libsvn_ra_serf/update.c:1216
 msgid "Missing revision attr in target-revision element"
 msgstr "Brak atrybutu wersji w elemencie target-revision"
 
@@ -3457,17 +3457,17 @@
 msgid "Missing revision attr in delete-entry element"
 msgstr "Brak atrybutu wersji w elemencie delete-entry"
 
-#: ../libsvn_ra_serf/replay.c:261 ../libsvn_ra_serf/update.c:1218
-#: ../libsvn_ra_serf/update.c:1253
+#: ../libsvn_ra_serf/replay.c:261 ../libsvn_ra_serf/update.c:1234
+#: ../libsvn_ra_serf/update.c:1269
 msgid "Missing revision attr in open-directory element"
 msgstr "Brak atrybutu wersji w elemencie open-directory"
 
-#: ../libsvn_ra_serf/replay.c:322 ../libsvn_ra_serf/update.c:1346
+#: ../libsvn_ra_serf/replay.c:322 ../libsvn_ra_serf/update.c:1362
 msgid "Missing revision attr in open-file element"
 msgstr "Brak atrybutu wersji w elemencie open-file"
 
-#: ../libsvn_ra_serf/replay.c:409 ../libsvn_ra_serf/update.c:1492
-#: ../libsvn_ra_serf/update.c:1569
+#: ../libsvn_ra_serf/replay.c:409 ../libsvn_ra_serf/update.c:1508
+#: ../libsvn_ra_serf/update.c:1585
 #, c-format
 msgid "Missing name attr in %s element"
 msgstr "Brak atrybutu nazwy w elemencie %s"
@@ -3501,7 +3501,7 @@
 msgid "Unsupported RA loader version (%d) for ra_serf"
 msgstr "Nieobsługiwana wersja loadera RA (%d) dla ra_serf"
 
-#: ../libsvn_ra_serf/update.c:2237
+#: ../libsvn_ra_serf/update.c:2253
 #, c-format
 msgid "Error retrieving REPORT (%d)"
 msgstr "Błąd podczas odbierania RAPORTU (%d)"
@@ -4778,17 +4778,22 @@
 msgid "Unable to parse unordered revision ranges '%s' and '%s'"
 msgstr "Nie można parsować nieuporządkowanych zakresów wersji '%s' i '%s'"
 
-#: ../libsvn_subr/mergeinfo.c:452
+#: ../libsvn_subr/mergeinfo.c:444
+#, c-format
+msgid "Mergeinfo for '%s' maps to an empty revision range"
+msgstr "Informacje o połączeniach zmian dla '%s' odnoszą się do pustego zakresu wersji"
+
+#: ../libsvn_subr/mergeinfo.c:458
 #, c-format
 msgid "Invalid character '%c' found in revision list"
 msgstr "Znaleziono nieprawidłowy znak '%c' w liście wersji"
 
-#: ../libsvn_subr/mergeinfo.c:466
+#: ../libsvn_subr/mergeinfo.c:472
 #, c-format
 msgid "Unable to parse reversed revision range '%ld-%ld'"
 msgstr "Nie można parsować odwróconego zakresu wersji '%ld-%ld'"
 
-#: ../libsvn_subr/mergeinfo.c:471
+#: ../libsvn_subr/mergeinfo.c:477
 #, c-format
 msgid ""
 "Unable to parse revision range '%ld-%ld' with same start and end revisions"
@@ -4796,20 +4801,20 @@
 "Nie można parsować zakresu wersji '%ld-%ld' z tą samą początkową i końcową "
 "wersją"
 
-#: ../libsvn_subr/mergeinfo.c:511 ../libsvn_subr/mergeinfo.c:518
+#: ../libsvn_subr/mergeinfo.c:517 ../libsvn_subr/mergeinfo.c:524
 #, c-format
 msgid "Invalid character '%c' found in range list"
 msgstr "Znaleziono nieprawidłowy znak '%c' w liście zakresu"
 
-#: ../libsvn_subr/mergeinfo.c:525
+#: ../libsvn_subr/mergeinfo.c:531
 msgid "Range list parsing ended before hitting newline"
 msgstr "Skończono parsowanie lisy zakresu przed osiągnięciem znaku nowej linii"
 
-#: ../libsvn_subr/mergeinfo.c:544
+#: ../libsvn_subr/mergeinfo.c:550
 msgid "Pathname not terminated by ':'"
 msgstr "Ścieżka nie zakończona znakiem ':'"
 
-#: ../libsvn_subr/mergeinfo.c:552
+#: ../libsvn_subr/mergeinfo.c:558
 #, c-format
 msgid "Could not find end of line in range list line in '%s'"
 msgstr "Nie znaleziono końca linii w linii listy zakresu w '%s'"
@@ -5016,53 +5021,53 @@
 msgid "Can't lock charset translation mutex"
 msgstr "Nie można zablokować muteksu translacji zestawu znaków"
 
-#: ../libsvn_subr/utf.c:213 ../libsvn_subr/utf.c:322
+#: ../libsvn_subr/utf.c:213 ../libsvn_subr/utf.c:323
 msgid "Can't unlock charset translation mutex"
 msgstr "Nie można odblokować muteksu translacji zestawu znaków"
 
-#: ../libsvn_subr/utf.c:274
+#: ../libsvn_subr/utf.c:275
 #, c-format
 msgid "Can't create a character converter from native encoding to '%s'"
 msgstr "Nie można stworzyć konwertera znaków z natywnego kodowania do '%s'"
 
-#: ../libsvn_subr/utf.c:278
+#: ../libsvn_subr/utf.c:279
 #, c-format
 msgid "Can't create a character converter from '%s' to native encoding"
 msgstr "Nie można stworzyć konwertera znaków z natywnego kodowania do '%s'"
 
-#: ../libsvn_subr/utf.c:282
+#: ../libsvn_subr/utf.c:283
 #, c-format
 msgid "Can't create a character converter from '%s' to '%s'"
 msgstr "Nie można stworzyć konwertera z kodowania znaków '%s' do '%s'"
 
-#: ../libsvn_subr/utf.c:288
+#: ../libsvn_subr/utf.c:289
 #, c-format
 msgid "Can't create a character converter from '%i' to '%i'"
 msgstr "Nie można stworzyć konwertera znaków z kodowania znaków '%i' do '%i'"
 
-#: ../libsvn_subr/utf.c:522
+#: ../libsvn_subr/utf.c:524
 #, c-format
 msgid "Can't convert string from native encoding to '%s':"
 msgstr ""
 "Nie można dokonać konwersji ciągu znaków z natywnego kodowania do '%s':"
 
-#: ../libsvn_subr/utf.c:526
+#: ../libsvn_subr/utf.c:528
 #, c-format
 msgid "Can't convert string from '%s' to native encoding:"
 msgstr ""
 "Nie można dokonać konwersji ciągu znaków z '%s' do natywnego kodowania:"
 
-#: ../libsvn_subr/utf.c:530
+#: ../libsvn_subr/utf.c:532
 #, c-format
 msgid "Can't convert string from '%s' to '%s':"
 msgstr "Nie można dokonać konwersji ciągu znaków z '%s' do '%s'"
 
-#: ../libsvn_subr/utf.c:536
+#: ../libsvn_subr/utf.c:538
 #, c-format
 msgid "Can't convert string from CCSID '%i' to CCSID '%i'"
 msgstr "Nie można dokonać konwersji ciągu znaków z CCSID '%i' do CCSID '%i'"
 
-#: ../libsvn_subr/utf.c:581
+#: ../libsvn_subr/utf.c:583
 #, c-format
 msgid ""
 "Safe data '%s' was followed by non-ASCII byte %d: unable to convert to/from "
@@ -5071,7 +5076,7 @@
 "Bezpieczne dane '%s' następują przed znakiem nie-ASCII %d: nie można "
 "przeprowadzić konwersji do/z UTF-8"
 
-#: ../libsvn_subr/utf.c:589
+#: ../libsvn_subr/utf.c:591
 #, c-format
 msgid ""
 "Non-ASCII character (code %d) detected, and unable to convert to/from UTF-8"
@@ -5079,7 +5084,7 @@
 "Wykryto znak nie-ASCII o kodzie %d, nie można przeprowadzić konwersji do/z "
 "UTF-8"
 
-#: ../libsvn_subr/utf.c:631
+#: ../libsvn_subr/utf.c:633
 #, c-format
 msgid ""
 "Valid UTF-8 data\n"
@@ -5840,12 +5845,17 @@
 msgid "File '%s' has binary mime type property"
 msgstr "Plik '%s' ma binarny typ MIME"
 
-#: ../libsvn_wc/props.c:3194 ../libsvn_wc/props.c:3261
+#: ../libsvn_wc/props.c:2609
+#, c-format
+msgid "Unrecognized line ending style for '%s'"
+msgstr "Nierozpoznany sposób zapisywania końców wiersza dla '%s'"
+
+#: ../libsvn_wc/props.c:3206 ../libsvn_wc/props.c:3273
 #, c-format
 msgid "Error parsing %s property on '%s': '%s'"
 msgstr "Błąd podczas parsowania atrybutu %s dla '%s': '%s'"
 
-#: ../libsvn_wc/props.c:3311
+#: ../libsvn_wc/props.c:3323
 #, c-format
 msgid ""
 "Invalid %s property on '%s': target '%s' is an absolute path or involves '..'"
@@ -6282,7 +6292,7 @@
 "Subversion jest narzędziem zarządzania wersjami.\n"
 "Dla dodatkowych informacji zobacz http://subversion.tigris.org/\n"
 
-#: ../svn/help-cmd.c:65 ../svnsync/main.c:1653
+#: ../svn/help-cmd.c:65 ../svnsync/main.c:1656
 msgid ""
 "The following repository access (RA) modules are available:\n"
 "\n"
@@ -6308,7 +6318,7 @@
 msgid "'%s' has invalid revision"
 msgstr "'%s' ma niewłaściwą wersję"
 
-#: ../svn/info-cmd.c:239 ../svn/mergeinfo-cmd.c:112 ../svnadmin/main.c:1146
+#: ../svn/info-cmd.c:239 ../svn/mergeinfo-cmd.c:169 ../svnadmin/main.c:1146
 #, c-format
 msgid "Path: %s\n"
 msgstr "Ścieżka: %s\n"
@@ -6653,7 +6663,7 @@
 
 #: ../svn/main.c:92 ../svnadmin/main.c:237 ../svndumpfilter/main.c:882
 #: ../svnlook/main.c:134 ../svnserve/main.c:151 ../svnsync/main.c:136
-#: ../svnversion/main.c:126
+#: ../svnversion/main.c:127
 msgid "show program version information"
 msgstr "pokaż informację o wersji programu"
 
@@ -6886,7 +6896,11 @@
 "określ akcję automatycznego rozwiązywania konfliktów\n"
 "                            ('"
 
-#: ../svn/main.c:261
+#: ../svn/main.c:224
+msgid "query a particular merge source URL\n"
+msgstr "sprawdź szczegółowy URL źródła łączenia zmian\n"
+
+#: ../svn/main.c:263
 msgid ""
 "Put files and directories under version control, scheduling\n"
 "them for addition to repository.  They will be added in next commit.\n"
@@ -6897,11 +6911,11 @@
 "następnym zatwierdzaniu.\n"
 "Użycie: add ŚCIEŻKA...\n"
 
-#: ../svn/main.c:267
+#: ../svn/main.c:269
 msgid "add intermediate parents"
 msgstr "dodaj pośrednie katalogi nadrzędne"
 
-#: ../svn/main.c:270
+#: ../svn/main.c:272
 msgid ""
 "Output the content of specified files or\n"
 "URLs with revision and author information in-line.\n"
@@ -6918,7 +6932,7 @@
 "  Argument WERSJA określa, w której wersji OBIEKT będzie najpierw "
 "sprawdzany.\n"
 
-#: ../svn/main.c:280
+#: ../svn/main.c:282
 msgid ""
 "Output the content of specified files or URLs.\n"
 "usage: cat TARGET[@REV]...\n"
@@ -6932,7 +6946,7 @@
 "  Argument WERSJA określa, w której wersji OBIEKT będzie najpierw\n"
 "sprawdzany.\n"
 
-#: ../svn/main.c:288
+#: ../svn/main.c:290
 msgid ""
 "Associate (or deassociate) local paths with changelist CLNAME.\n"
 "usage: 1. changelist CLNAME TARGET...\n"
@@ -6942,7 +6956,7 @@
 "Użycie: 1. changelist NAZWALZ CEL...\n"
 "        2. changelist --remove CEL...\n"
 
-#: ../svn/main.c:294
+#: ../svn/main.c:296
 msgid ""
 "Check out a working copy from a repository.\n"
 "usage: checkout URL[@REV]... [PATH]\n"
@@ -6991,7 +7005,7 @@
 "  modyfikacje w kopii roboczej. Wszystkie atrybuty z repozytorium są\n"
 "  zastosowywane do zagradzających ścieżek.\n"
 
-#: ../svn/main.c:319
+#: ../svn/main.c:321
 msgid ""
 "Recursively clean up the working copy, removing locks, resuming\n"
 "unfinished operations, etc.\n"
@@ -7001,7 +7015,7 @@
 "przerwane operacje itp.\n"
 "Użycie: cleanup [ŚCIEŻKA...]\n"
 
-#: ../svn/main.c:326
+#: ../svn/main.c:328
 msgid ""
 "Send changes from your working copy to the repository.\n"
 "usage: commit [PATH...]\n"
@@ -7021,7 +7035,7 @@
 "  polecenia zawiera zablokowane obiekty, to po udanej operacji\n"
 "  zatwierdzania blokady na tych obiektach będą zdjęte.\n"
 
-#: ../svn/main.c:334
+#: ../svn/main.c:336
 msgid ""
 "Send changes from your working copy to the repository.\n"
 "usage: commit [PATH...]\n"
@@ -7042,7 +7056,7 @@
 "  polecenia zawiera zablokowane obiekty, to po udanej operacji\n"
 "  zatwierdzania blokady na tych obiektach będą zdjęte.\n"
 
-#: ../svn/main.c:348
+#: ../svn/main.c:350
 msgid ""
 "Duplicate something in working copy or repository, remembering\n"
 "history.\n"
@@ -7082,7 +7096,7 @@
 "                 odgałęzień i tagów.\n"
 "  Wszystkie ŹRÓDŁA muszą być tego samego typu.\n"
 
-#: ../svn/main.c:364
+#: ../svn/main.c:366
 msgid ""
 "Remove files and directories from version control.\n"
 "usage: 1. delete PATH...\n"
@@ -7114,7 +7128,7 @@
 "      repozytorium, przy czym operacja ta jest natychmiastowo\n"
 "      zatwierdzana.\n"
 
-#: ../svn/main.c:381
+#: ../svn/main.c:383
 msgid ""
 "Display the differences between two revisions or paths.\n"
 "usage: 1. diff [-c M | -r N[:M]] [TARGET[@REV]...]\n"
@@ -7172,7 +7186,7 @@
 "  wprowadzone w kopii roboczej w stosunku do wersji pobranej z\n"
 "  repozytorium (zmiany do zatwierdzenia).\n"
 
-#: ../svn/main.c:411
+#: ../svn/main.c:413
 msgid ""
 "Create an unversioned copy of a tree.\n"
 "usage: 1. export [-r REV] URL[@PEGREV] [PATH]\n"
@@ -7214,7 +7228,7 @@
 "Argument WERSJA, jeśli został podany, określa numer wersji, która będzie\n"
 "rozpatrywana jako pierwsza.\n"
 
-#: ../svn/main.c:433
+#: ../svn/main.c:435
 msgid ""
 "Describe the usage of this program or its subcommands.\n"
 "usage: help [SUBCOMMAND...]\n"
@@ -7222,7 +7236,7 @@
 "Opisz użycie tego programu lub jego podpoleceń.\n"
 "Użycie: help [PODPOLECENIE...]\n"
 
-#: ../svn/main.c:439
+#: ../svn/main.c:441
 msgid ""
 "Commit an unversioned file or tree into the repository.\n"
 "usage: import [PATH] URL\n"
@@ -7247,7 +7261,7 @@
 "  Niewersjonowalne obiekty takie jak pliki urządzeń i potoki są ignorowane,\n"
 "  gdy użyto --force.\n"
 
-#: ../svn/main.c:454
+#: ../svn/main.c:456
 msgid ""
 "Display information about a local or remote item.\n"
 "usage: info [TARGET[@REV]...]\n"
@@ -7264,7 +7278,7 @@
 "ją\n"
 "  podano, określa, w której wersji cel jest najpierw sprawdzany.\n"
 
-#: ../svn/main.c:465
+#: ../svn/main.c:467
 msgid ""
 "List directory entries in the repository.\n"
 "usage: list [TARGET[@REV]...]\n"
@@ -7308,7 +7322,7 @@
 "    Rozmiar (w bajtach)\n"
 "    Data i czas ostatniej zmiany\n"
 
-#: ../svn/main.c:487
+#: ../svn/main.c:489
 msgid ""
 "Lock working copy paths or URLs in the repository, so that\n"
 "no other user can commit changes to them.\n"
@@ -7324,19 +7338,19 @@
 "Użyj opcję --force, aby odebrać blokadę innemu użytkownikowi lub\n"
 "ścieżce innej kopii roboczej.\n"
 
-#: ../svn/main.c:494
+#: ../svn/main.c:496
 msgid "read lock comment from file ARG"
 msgstr "odczytaj opis blokady z pliku ARG"
 
-#: ../svn/main.c:495
+#: ../svn/main.c:497
 msgid "specify lock comment ARG"
 msgstr "określ opis blokady jako argument ARG"
 
-#: ../svn/main.c:496
+#: ../svn/main.c:498
 msgid "force validity of lock comment source"
 msgstr "wymuś uznanie komentarza blokady za poprawny"
 
-#: ../svn/main.c:499
+#: ../svn/main.c:501
 msgid ""
 "Show the log messages for a set of revision(s) and/or file(s).\n"
 "usage: 1. log [PATH]\n"
@@ -7395,15 +7409,15 @@
 "    svn log http://www.example.com/repo/project/foo.c\n"
 "    svn log http://www.example.com/repo/project foo.c bar.c\n"
 
-#: ../svn/main.c:528
+#: ../svn/main.c:530
 msgid "retrieve revision property ARG"
 msgstr "pobierz atrybut wersji podany jako ARG"
 
-#: ../svn/main.c:529
+#: ../svn/main.c:531
 msgid "the change made by ARG"
 msgstr "zmiana wykonana przez argument ARG"
 
-#: ../svn/main.c:532
+#: ../svn/main.c:534
 msgid ""
 "Apply the differences between two sources to a working copy path.\n"
 "usage: 1. merge sourceURL1[@N] sourceURL2[@M] [WCPATH]\n"
@@ -7486,7 +7500,7 @@
 "podczas\n"
 "  używania trzeciej formy wymienionej powyżej.\n"
 
-#: ../svn/main.c:573
+#: ../svn/main.c:575
 msgid ""
 "Query merge-related information.\n"
 "usage: mergeinfo [TARGET[@REV]...]\n"
@@ -7494,7 +7508,7 @@
 "Sprawdź informacje dotyczące połączeń zmian.\n"
 "Użycie: mergeinfo [CEL[@WERSJA]...]\n"
 
-#: ../svn/main.c:578
+#: ../svn/main.c:580
 msgid ""
 "Create a new directory under version control.\n"
 "usage: 1. mkdir PATH...\n"
@@ -7526,7 +7540,7 @@
 "  W obydwu wypadkach wszelkie nadrzędne katalogi muszą już istnieć,\n"
 "  jeśli nie podano opcji --parents.\n"
 
-#: ../svn/main.c:595
+#: ../svn/main.c:597
 msgid ""
 "Move and/or rename something in working copy or repository.\n"
 "usage: move SRC... DST\n"
@@ -7560,7 +7574,7 @@
 "                 kopii roboczej.\n"
 "  Wszystkie ŹRÓDŁA muszą być takiego samego typu.\n"
 
-#: ../svn/main.c:612
+#: ../svn/main.c:614
 msgid ""
 "Remove a property from files, dirs, or revisions.\n"
 "usage: 1. propdel PROPNAME [PATH...]\n"
@@ -7579,7 +7593,7 @@
 "  2. Usuwa niewersjonowane, zdalne atrybuty wersji w repozytorium.\n"
 "     CEL tylko określa, do którego repozytorium uzyskać dostęp.\n"
 
-#: ../svn/main.c:624
+#: ../svn/main.c:626
 msgid ""
 "Edit a property with an external editor.\n"
 "usage: 1. propedit PROPNAME TARGET...\n"
@@ -7603,7 +7617,7 @@
 "Zobacz 'svn help propset' w celu uzyskania dodatkowych informacji o\n"
 "ustawianiu atrybutów.\n"
 
-#: ../svn/main.c:638
+#: ../svn/main.c:640
 msgid ""
 "Print the value of a property on files, dirs, or revisions.\n"
 "usage: 1. propget PROPNAME [TARGET[@REV]...]\n"
@@ -7636,7 +7650,7 @@
 "  dana wartość. Opcja --strict powoduje pominięcie tych ozdobników (jest to\n"
 "  (użyteczne np. podczas kopiowania binarnej wartości atrybutu do pliku).\n"
 
-#: ../svn/main.c:657
+#: ../svn/main.c:659
 msgid ""
 "List all properties on files, dirs, or revisions.\n"
 "usage: 1. proplist [TARGET[@REV]...]\n"
@@ -7656,7 +7670,7 @@
 "  2. Wypisuje niewersjonowane, zdalne atrybuty wersji w repozytorium.\n"
 "     CEL tylko określa, do którego repozytorium uzyskać dostęp.\n"
 
-#: ../svn/main.c:669
+#: ../svn/main.c:671
 msgid ""
 "Set the value of a property on files, dirs, or revisions.\n"
 "usage: 1. propset PROPNAME PROPVAL PATH...\n"
@@ -7792,11 +7806,11 @@
 "  a uruchomienie z opcją --recursive spowoduje ustawienie atrybutu dla\n"
 "  wszystkich plików w tym katalogu.\n"
 
-#: ../svn/main.c:730
+#: ../svn/main.c:732
 msgid "read property value from file ARG"
 msgstr "odczytaj wartość atrybutu z pliku ARG"
 
-#: ../svn/main.c:733
+#: ../svn/main.c:735
 msgid ""
 "Remove 'conflicted' state on working copy files or directories.\n"
 "usage: resolved PATH...\n"
@@ -7814,7 +7828,7 @@
 "  możliwość zatwierdzenia zmian. Powinno być używane po ręcznym\n"
 "  rozwiązaniu konfliktu.\n"
 
-#: ../svn/main.c:740
+#: ../svn/main.c:742
 msgid ""
 "specify automatic conflict resolution source\n"
 "                             '"
@@ -7822,7 +7836,7 @@
 "określ źródło automatycznego rozwiązywania konfliktów\n"
 "                             '"
 
-#: ../svn/main.c:747
+#: ../svn/main.c:749
 msgid ""
 "Restore pristine working copy file (undo most local edits).\n"
 "usage: revert PATH...\n"
@@ -7838,7 +7852,7 @@
 "  rozwiązuje wszelkie konflikty. Jednak nie może ono odtworzyć skasowanych\n"
 "  katalogów.\n"
 
-#: ../svn/main.c:756
+#: ../svn/main.c:758
 msgid ""
 "Print the status of working copy files and directories.\n"
 "usage: status [PATH...]\n"
@@ -7992,7 +8006,7 @@
 "                 965       687 joe          wc/zig.c\n"
 "    Status względem wersji:   981\n"
 
-#: ../svn/main.c:833
+#: ../svn/main.c:835
 msgid ""
 "Update the working copy to a different URL.\n"
 "usage: 1. switch URL[@PEGREV] [PATH]\n"
@@ -8051,7 +8065,7 @@
 "  roboczej. Wszystkie atrybuty z repozytorium są zastosowywane do\n"
 "  zagradzających ścieżek.\n"
 
-#: ../svn/main.c:863
+#: ../svn/main.c:865
 msgid ""
 "Unlock working copy paths or URLs.\n"
 "usage: unlock TARGET...\n"
@@ -8063,7 +8077,7 @@
 "\n"
 "  Użyj opcję --force, aby zerwać blokadę.\n"
 
-#: ../svn/main.c:870
+#: ../svn/main.c:872
 msgid ""
 "Bring changes from the repository into the working copy.\n"
 "usage: update [PATH...]\n"
@@ -8136,52 +8150,52 @@
 "  zagradzających ścieżek. Zagradzające ścieżki są zgłaszane w pierwszej\n"
 "  kolumnie przy użyciu litery 'E'.\n"
 
-#: ../svn/main.c:947 ../svnadmin/main.c:78 ../svnlook/main.c:329
+#: ../svn/main.c:949 ../svnadmin/main.c:78 ../svnlook/main.c:329
 #: ../svnsync/main.c:184
 msgid "Caught signal"
 msgstr "Złapano sygnał"
 
-#: ../svn/main.c:966
+#: ../svn/main.c:968
 msgid "Revision property pair is empty"
 msgstr "Para atrybutów wersji jest pusta"
 
-#: ../svn/main.c:986 ../svn/propedit-cmd.c:60 ../svn/propget-cmd.c:181
+#: ../svn/main.c:988 ../svn/propedit-cmd.c:60 ../svn/propget-cmd.c:181
 #: ../svn/propset-cmd.c:65
 #, c-format
 msgid "'%s' is not a valid Subversion property name"
 msgstr "'%s' nie jest poprawną nazwą atrybutu Subversion"
 
-#: ../svn/main.c:1106 ../svnlook/main.c:2083
+#: ../svn/main.c:1108 ../svnlook/main.c:2083
 msgid "Non-numeric limit argument given"
 msgstr "Nienumeryczny argument określający limit podany"
 
-#: ../svn/main.c:1112 ../svnlook/main.c:2089
+#: ../svn/main.c:1114 ../svnlook/main.c:2089
 msgid "Argument to --limit must be positive"
 msgstr "Argument dla --limit musi być dodatni"
 
-#: ../svn/main.c:1134 ../svn/main.c:1342
+#: ../svn/main.c:1136 ../svn/main.c:1344
 msgid "Can't specify -c with --old"
 msgstr "Nie można użyć opcji -c wraz z opcją --old"
 
-#: ../svn/main.c:1141
+#: ../svn/main.c:1143
 msgid "Non-numeric change argument given to -c"
 msgstr "Nienumeryczny argument określający zmianę podany do -c"
 
-#: ../svn/main.c:1148
+#: ../svn/main.c:1150
 msgid "There is no change 0"
 msgstr "Nie ma zmiany 0"
 
-#: ../svn/main.c:1182 ../svnadmin/main.c:1345
+#: ../svn/main.c:1184 ../svnadmin/main.c:1345
 #, c-format
 msgid "Syntax error in revision argument '%s'"
 msgstr "Błąd składniowy w numerze wersji '%s'"
 
-#: ../svn/main.c:1255
+#: ../svn/main.c:1257
 #, c-format
 msgid "Error converting depth from locale to UTF8"
 msgstr "Błąd podczas konwersji głębokości z lokalnego kodowania do UTF8"
 
-#: ../svn/main.c:1263
+#: ../svn/main.c:1265
 #, c-format
 msgid ""
 "'%s' is not a valid depth; try 'empty', 'files', 'immediates', or 'infinity'"
@@ -8189,28 +8203,28 @@
 "'%s' nie jest właściwą głębokością; spróbuj 'empty', 'files', 'immediates' "
 "lub 'infinity'"
 
-#: ../svn/main.c:1370
+#: ../svn/main.c:1372
 #, c-format
 msgid "Syntax error in native-eol argument '%s'"
 msgstr "Błąd składniowy w argumencie native-eol '%s'"
 
-#: ../svn/main.c:1414
+#: ../svn/main.c:1416
 #, c-format
 msgid "'%s' is not a valid accept value"
 msgstr "'%s' nie jest poprawną, akceptowaną wartością"
 
-#: ../svn/main.c:1467 ../svndumpfilter/main.c:1314 ../svnlook/main.c:2161
+#: ../svn/main.c:1473 ../svndumpfilter/main.c:1314 ../svnlook/main.c:2161
 #, c-format
 msgid "Subcommand argument required\n"
 msgstr "Podpolecenie wymaga podania argumentu\n"
 
-#: ../svn/main.c:1486 ../svnadmin/main.c:1477 ../svndumpfilter/main.c:1333
+#: ../svn/main.c:1492 ../svnadmin/main.c:1477 ../svndumpfilter/main.c:1333
 #: ../svnlook/main.c:2180
 #, c-format
 msgid "Unknown command: '%s'\n"
 msgstr "Nieznane polecenie: '%s'\n"
 
-#: ../svn/main.c:1520
+#: ../svn/main.c:1526
 #, c-format
 msgid ""
 "Subcommand '%s' doesn't accept option '%s'\n"
@@ -8219,7 +8233,7 @@
 "Podpolecenie '%s' nie obsługuje opcji '%s'.\n"
 "Użyj 'svn help %s', by uzyskać informacje o użyciu.\n"
 
-#: ../svn/main.c:1534
+#: ../svn/main.c:1540
 msgid ""
 "Multiple revision arguments encountered; can't specify -c twice, or both -c "
 "and -r"
@@ -8227,19 +8241,19 @@
 "Wielokrotnie podano opcję numeru wersji; nie można określić -c dwa razy, lub "
 "obydwu -c i -r"
 
-#: ../svn/main.c:1586
+#: ../svn/main.c:1592
 msgid "Log message file is a versioned file; use '--force-log' to override"
 msgstr ""
 "Plik z opisem zmian jest plikiem podlegającym zarządzaniu wersjami; użyj '--"
 "force-log', by wymusić jego użycie."
 
-#: ../svn/main.c:1593
+#: ../svn/main.c:1599
 msgid "Lock comment file is a versioned file; use '--force-log' to override"
 msgstr ""
 "Plik z opisem blokady jest plikiem podlegającym zarządzaniu wersjami; użyj "
 "'--force-log', by wymusić jego użycie."
 
-#: ../svn/main.c:1613
+#: ../svn/main.c:1619
 msgid ""
 "The log message is a pathname (was -F intended?); use '--force-log' to "
 "override"
@@ -8247,7 +8261,7 @@
 "Opis zmian jest ścieżką (chciano użyć -F?); użyj --force-log, by wymusić "
 "użycie takiego opisu"
 
-#: ../svn/main.c:1620
+#: ../svn/main.c:1626
 msgid ""
 "The lock comment is a pathname (was -F intended?); use '--force-log' to "
 "override"
@@ -8255,24 +8269,24 @@
 "Opis blokady jest ścieżką (chciano użyć -F?); użyj --force-log, bywymusić "
 "użycie takiego opisu"
 
-#: ../svn/main.c:1631
+#: ../svn/main.c:1637
 msgid "--relocate and --depth are mutually exclusive"
 msgstr "Opcje --relocate i --depth nie mogą występować równocześnie"
 
-#: ../svn/main.c:1698
+#: ../svn/main.c:1704
 msgid "--auto-props and --no-auto-props are mutually exclusive"
 msgstr "Opcje --auto-props i --no-auto-props nie mogą występować równocześnie"
 
-#: ../svn/main.c:1810 ../svn/main.c:1816
+#: ../svn/main.c:1816 ../svn/main.c:1822
 #, c-format
 msgid "--accept=%s incompatible with --non-interactive"
 msgstr "--accept=%s jest niekompatybilne z --non-interactive"
 
-#: ../svn/main.c:1843
+#: ../svn/main.c:1849
 msgid "Try 'svn help' for more info"
 msgstr "Użyj 'svn help', by otrzymać dodatkowe instrukcje"
 
-#: ../svn/main.c:1853
+#: ../svn/main.c:1859
 msgid ""
 "svn: run 'svn cleanup' to remove locks (type 'svn help cleanup' for "
 "details)\n"
@@ -8293,12 +8307,12 @@
 msgstr ""
 "Użycie kopii roboczej jako źródła dla dołączania wymaga podania jawnej wersji"
 
-#: ../svn/mergeinfo-cmd.c:135
+#: ../svn/mergeinfo-cmd.c:77
 #, c-format
 msgid "  Source path: %s\n"
 msgstr "  Ścieżka źródłowa: %s\n"
 
-#: ../svn/mergeinfo-cmd.c:137
+#: ../svn/mergeinfo-cmd.c:79
 #, c-format
 msgid "    Merged ranges: "
 msgstr "    Zakres połączonych zmian: "
@@ -8313,12 +8327,12 @@
 #. ### may just mean the system has to work harder to
 #. ### provide that information.
 #.
-#: ../svn/mergeinfo-cmd.c:152
+#: ../svn/mergeinfo-cmd.c:93
 #, c-format
 msgid "    Eligible ranges: "
 msgstr "    Wybieralne zakresy: "
 
-#: ../svn/mergeinfo-cmd.c:165
+#: ../svn/mergeinfo-cmd.c:106
 #, c-format
 msgid "(source no longer available in HEAD)\n"
 msgstr "(źródło nie jest już dłużej dostępne w wersji HEAD)\n"
@@ -9967,7 +9981,7 @@
 msgstr ""
 "uruchom jako zadanie pierwszoplanowe (użyteczne przy poszukiwaniu błędów)"
 
-#: ../svnserve/main.c:149 ../svnversion/main.c:124
+#: ../svnserve/main.c:149 ../svnversion/main.c:125
 msgid "display this help"
 msgstr "wyświetl tekst pomocy"
 
@@ -10087,20 +10101,20 @@
 msgid "Can't create thread"
 msgstr "Nie można utworzyć wątku"
 
-#: ../svnserve/serve.c:1495
+#: ../svnserve/serve.c:1498
 msgid "Path is not a string"
 msgstr "Ścieżka nie jest ciągiem znaków"
 
-#: ../svnserve/serve.c:1638
+#: ../svnserve/serve.c:1641
 msgid "Log revprop entry not a string"
 msgstr "Element log revprop nie jest ciągiem znaków"
 
-#: ../svnserve/serve.c:1645
+#: ../svnserve/serve.c:1648
 #, c-format
 msgid "Unknown revprop word '%s' in log command"
 msgstr "Nieznany wyraz '%s' atrybutu wersji w poleceniu log"
 
-#: ../svnserve/serve.c:1661
+#: ../svnserve/serve.c:1664
 msgid "Log path entry not a string"
 msgstr "Element log path nie jest ciągiem znaków"
 
@@ -10287,8 +10301,8 @@
 msgid "Destination repository is already synchronizing from '%s'"
 msgstr "Repozytorium docelowe jest już synchronizujące z '%s'"
 
-#: ../svnsync/main.c:683 ../svnsync/main.c:686 ../svnsync/main.c:1472
-#: ../svnsync/main.c:1622
+#: ../svnsync/main.c:683 ../svnsync/main.c:686 ../svnsync/main.c:1475
+#: ../svnsync/main.c:1625
 #, c-format
 msgid "Path '%s' is not a URL"
 msgstr "Ścieżka '%s' nie jest URL-em"
@@ -10308,13 +10322,13 @@
 msgstr ""
 "UUID źródłowego repozytorium (%s) nie zgadza się z oczekiwanym UUID (%s)"
 
-#: ../svnsync/main.c:1271
+#: ../svnsync/main.c:1274
 #, c-format
 msgid "Commit created rev %ld but should have created %ld"
 msgstr ""
 "Zatwierdzanie zmian stworzyło wersję o numerze %ld, a powinno stworzyć %ld"
 
-#: ../svnsync/main.c:1376
+#: ../svnsync/main.c:1379
 #, c-format
 msgid ""
 "Revision being currently copied (%ld), last merged revision (%ld), and "
@@ -10325,7 +10339,7 @@
 "wersja HEAD (%ld) są niespójne; czy przeprowadziłeś zatwierdzenie do "
 "docelowego repozytorium bez użycia svnsync?"
 
-#: ../svnsync/main.c:1415
+#: ../svnsync/main.c:1418
 #, c-format
 msgid ""
 "Destination HEAD (%ld) is not the last merged revision (%ld); have you "
@@ -10334,7 +10348,7 @@
 "Docelowa wersja HEAD (%ld) nie jest ostatnio połączoną wersją (%ld); czy "
 "przeprowadziłeś zatwierdzenie do docelowego repozytorium bez użycia svnsync?"
 
-#: ../svnsync/main.c:1515 ../svnsync/main.c:1520
+#: ../svnsync/main.c:1518 ../svnsync/main.c:1523
 #, c-format
 msgid ""
 "Cannot copy revprops for a revision (%ld) that has not been synchronized yet"
@@ -10342,17 +10356,17 @@
 "Nie można skopiować atrybutów wersji (%ld), która jeszcze nie była "
 "synchronizowana"
 
-#: ../svnsync/main.c:1572
+#: ../svnsync/main.c:1575
 #, c-format
 msgid "'%s' is not a valid revision range"
 msgstr "'%s' nie jest poprawnym zakresem wersji"
 
-#: ../svnsync/main.c:1586 ../svnsync/main.c:1606
+#: ../svnsync/main.c:1589 ../svnsync/main.c:1609
 #, c-format
 msgid "Invalid revision number (%ld)"
 msgstr "Błędny numer wersji (%ld)"
 
-#: ../svnsync/main.c:1646
+#: ../svnsync/main.c:1649
 msgid ""
 "general usage: svnsync SUBCOMMAND DEST_URL  [ARGS & OPTIONS ...]\n"
 "Type 'svnsync help <subcommand>' for help on a specific subcommand.\n"
@@ -10368,7 +10382,7 @@
 "\n"
 "Dostępne podpolecenia:\n"
 
-#: ../svnsync/main.c:1808
+#: ../svnsync/main.c:1811
 msgid ""
 "Cannot use --username or --password with any of --source-username, --source-"
 "password, --sync-username, or --sync-password.\n"
@@ -10377,7 +10391,7 @@
 "opcji --source-username, --source-password, --sync-username lub --sync-"
 "password.\n"
 
-#: ../svnsync/main.c:1888
+#: ../svnsync/main.c:1891
 #, c-format
 msgid ""
 "Subcommand '%s' doesn't accept option '%s'\n"
@@ -10386,7 +10400,7 @@
 "Podpolecenie '%s' nie obsługuje opcji '%s'.\n"
 "Użyj 'svnsync help %s', by uzyskać informacje o użyciu.\n"
 
-#: ../svnsync/main.c:1960
+#: ../svnsync/main.c:1963
 msgid "Try 'svnsync help' for more info"
 msgstr "Użyj 'svnsync help', aby uzyskać więcej informacji"
 
@@ -10417,6 +10431,7 @@
 "   4123:4168     mixed revision working copy\n"
 "   4168M         modified working copy\n"
 "   4123S         switched working copy\n"
+"   4123P         partial working copy, from a sparse checkout\n"
 "   4123:4168MS   mixed revision, modified, switched working copy\n"
 "\n"
 "  If invoked on a directory that is not a working copy, an\n"
@@ -10447,6 +10462,7 @@
 "   4168M         kopia robocza jest zmodyfikowana w stosunku do "
 "repozytorium\n"
 "   4123S         kopia robocza jest repozycjonowana\n"
+"   4123P         częściowa kopia robocza, z katalogami rzadkimi\n"
 "   4123:4168MS   wszystkie te efekty równocześnie\n"
 "\n"
 "  Przy uruchomieniu na katalogu, który nie jest kopią roboczą (np. na\n"
@@ -10456,20 +10472,20 @@
 "\n"
 "Poprawne opcje:\n"
 
-#: ../svnversion/main.c:122
+#: ../svnversion/main.c:123
 msgid "do not output the trailing newline"
 msgstr "nie wypisuj końcowego znaku nowego wiersza"
 
-#: ../svnversion/main.c:123
+#: ../svnversion/main.c:124
 msgid "last changed rather than current revisions"
 msgstr "ostatnio zmieniona a nie aktualna wersja"
 
-#: ../svnversion/main.c:222
+#: ../svnversion/main.c:223
 #, c-format
 msgid "exported%s"
 msgstr "wyeksportowane%s"
 
-#: ../svnversion/main.c:231
+#: ../svnversion/main.c:232
 #, c-format
 msgid "'%s' not versioned, and not exported\n"
 msgstr "%s' niepodlegające zarządzaniu wersjami i niewyeksportowane\n"
diff --git a/subversion/svn/cl.h b/subversion/svn/cl.h
index 4b1ae55..130c344 100644
--- a/subversion/svn/cl.h
+++ b/subversion/svn/cl.h
@@ -41,57 +41,6 @@
 
 /*** Option processing ***/
 
-/* Add an identifier here for long options that don't have a short
-   option. Options that have both long and short options should just
-   use the short option letter as identifier.  */
-typedef enum {
-  svn_cl__ancestor_path_opt = SVN_OPT_FIRST_LONGOPT_ID,
-  svn_cl__auth_password_opt,
-  svn_cl__auth_username_opt,
-  svn_cl__autoprops_opt,
-  svn_cl__changelist_opt,
-  svn_cl__config_dir_opt,
-  svn_cl__diff_cmd_opt,
-  svn_cl__dry_run_opt,
-  svn_cl__editor_cmd_opt,
-  svn_cl__encoding_opt,
-  svn_cl__force_log_opt,
-  svn_cl__force_opt,
-  svn_cl__keep_changelist_opt,
-  svn_cl__ignore_ancestry_opt,
-  svn_cl__ignore_externals_opt,
-  svn_cl__incremental_opt,
-  svn_cl__merge_cmd_opt,
-  svn_cl__native_eol_opt,
-  svn_cl__new_cmd_opt,
-  svn_cl__no_auth_cache_opt,
-  svn_cl__no_autoprops_opt,
-  svn_cl__no_diff_deleted,
-  svn_cl__no_ignore_opt,
-  svn_cl__no_unlock_opt,
-  svn_cl__non_interactive_opt,
-  svn_cl__notice_ancestry_opt,
-  svn_cl__old_cmd_opt,
-  svn_cl__record_only_opt,
-  svn_cl__relocate_opt,
-  svn_cl__remove_opt,
-  svn_cl__revprop_opt,
-  svn_cl__stop_on_copy_opt,
-  svn_cl__strict_opt,
-  svn_cl__summarize,
-  svn_cl__targets_opt,
-  svn_cl__depth_opt,
-  svn_cl__version_opt,
-  svn_cl__xml_opt,
-  svn_cl__keep_local_opt,
-  svn_cl__with_revprop_opt,
-  svn_cl__with_all_revprops_opt,
-  svn_cl__parents_opt,
-  svn_cl__accept_opt,
-  svn_cl__from_source_opt
-} svn_cl__longopt_t;
-
-
 /* --accept actions */
 typedef enum
 {
diff --git a/subversion/svn/main.c b/subversion/svn/main.c
index 013c5b4..3beeb85 100644
--- a/subversion/svn/main.c
+++ b/subversion/svn/main.c
@@ -51,14 +51,64 @@
 
 /*** Option Processing ***/
 
+/* Add an identifier here for long options that don't have a short
+   option. Options that have both long and short options should just
+   use the short option letter as identifier.  */
+typedef enum {
+  opt_ancestor_path = SVN_OPT_FIRST_LONGOPT_ID,
+  opt_auth_password,
+  opt_auth_username,
+  opt_autoprops,
+  opt_changelist,
+  opt_config_dir,
+  opt_diff_cmd,
+  opt_dry_run,
+  opt_editor_cmd,
+  opt_encoding,
+  opt_force_log,
+  opt_force,
+  opt_keep_changelist,
+  opt_ignore_ancestry,
+  opt_ignore_externals,
+  opt_incremental,
+  opt_merge_cmd,
+  opt_native_eol,
+  opt_new_cmd,
+  opt_no_auth_cache,
+  opt_no_autoprops,
+  opt_no_diff_deleted,
+  opt_no_ignore,
+  opt_no_unlock,
+  opt_non_interactive,
+  opt_notice_ancestry,
+  opt_old_cmd,
+  opt_record_only,
+  opt_relocate,
+  opt_remove,
+  opt_revprop,
+  opt_stop_on_copy,
+  opt_strict,
+  opt_summarize,
+  opt_targets,
+  opt_depth,
+  opt_version,
+  opt_xml,
+  opt_keep_local,
+  opt_with_revprop,
+  opt_with_all_revprops,
+  opt_parents,
+  opt_accept,
+  opt_from_source
+} svn_cl__longopt_t;
+
 /* Option codes and descriptions for the command line client.
  *
  * The entire list must be terminated with an entry of nulls.
  */
 const apr_getopt_option_t svn_cl__options[] =
 {
-  {"force",         svn_cl__force_opt, 0, N_("force operation to run")},
-  {"force-log",     svn_cl__force_log_opt, 0,
+  {"force",         opt_force, 0, N_("force operation to run")},
+  {"force-log",     opt_force_log, 0,
                     N_("force validity of log message source")},
   {"help",          'h', 0, N_("show help on a subcommand")},
   {NULL,            '?', 0, N_("show help on a subcommand")},
@@ -82,20 +132,17 @@
    /* spacing corresponds to svn_opt_format_option */
   },
   {"file",          'F', 1, N_("read log message from file ARG")},
-  {"incremental",   svn_cl__incremental_opt, 0,
+  {"incremental",   opt_incremental, 0,
                     N_("give output suitable for concatenation")},
 #ifndef AS400
-  {"encoding",      svn_cl__encoding_opt, 1,
+  {"encoding",      opt_encoding, 1,
                     N_("treat value as being in charset encoding ARG")},
 #endif
-  {"version",       svn_cl__version_opt, 0,
-                    N_("show program version information")},
+  {"version",       opt_version, 0, N_("show program version information")},
   {"verbose",       'v', 0, N_("print extra information")},
   {"show-updates",  'u', 0, N_("display update information")},
-  {"username",      svn_cl__auth_username_opt, 1,
-                    N_("specify a username ARG")},
-  {"password",      svn_cl__auth_password_opt, 1,
-                    N_("specify a password ARG")},
+  {"username",      opt_auth_username, 1, N_("specify a username ARG")},
+  {"password",      opt_auth_password, 1, N_("specify a password ARG")},
 #ifndef AS400
   {"extensions",    'x', 1,
                     N_("Default: '-u'. When Subversion is invoking an\n"
@@ -126,57 +173,49 @@
                        "                            "
                        "       Ignore changes in EOL style")},
 #endif
-  {"targets",       svn_cl__targets_opt, 1,
+  {"targets",       opt_targets, 1,
                     N_("pass contents of file ARG as additional args")},
-  {"depth",         svn_cl__depth_opt, 1,
+  {"depth",         opt_depth, 1,
                     N_("pass depth ('empty', 'files', 'immediates', or\n"
                        "                            "
                        "'infinity') as ARG")},
-  {"xml",           svn_cl__xml_opt, 0, N_("output in XML")},
-  {"strict",        svn_cl__strict_opt, 0, N_("use strict semantics")},
-  {"stop-on-copy",  svn_cl__stop_on_copy_opt, 0,
+  {"xml",           opt_xml, 0, N_("output in XML")},
+  {"strict",        opt_strict, 0, N_("use strict semantics")},
+  {"stop-on-copy",  opt_stop_on_copy, 0,
                     N_("do not cross copies while traversing history")},
-  {"no-ignore",     svn_cl__no_ignore_opt, 0,
+  {"no-ignore",     opt_no_ignore, 0,
                     N_("disregard default and svn:ignore property ignores")},
-  {"no-auth-cache", svn_cl__no_auth_cache_opt, 0,
+  {"no-auth-cache", opt_no_auth_cache, 0,
                     N_("do not cache authentication tokens")},
-  {"non-interactive", svn_cl__non_interactive_opt, 0,
+  {"non-interactive", opt_non_interactive, 0,
                     N_("do no interactive prompting")},
-  {"dry-run",       svn_cl__dry_run_opt, 0,
+  {"dry-run",       opt_dry_run, 0,
                     N_("try operation but make no changes")},
-  {"no-diff-deleted", svn_cl__no_diff_deleted, 0,
+  {"no-diff-deleted", opt_no_diff_deleted, 0,
                     N_("do not print differences for deleted files")},
-  {"notice-ancestry", svn_cl__notice_ancestry_opt, 0,
+  {"notice-ancestry", opt_notice_ancestry, 0,
                     N_("notice ancestry when calculating differences")},
-  {"ignore-ancestry", svn_cl__ignore_ancestry_opt, 0,
+  {"ignore-ancestry", opt_ignore_ancestry, 0,
                     N_("ignore ancestry when calculating merges")},
-  {"ignore-externals", svn_cl__ignore_externals_opt, 0,
+  {"ignore-externals", opt_ignore_externals, 0,
                     N_("ignore externals definitions")},
 #ifndef AS400
-  {"diff-cmd",      svn_cl__diff_cmd_opt, 1,
-                    N_("use ARG as diff command")},
-  {"diff3-cmd",     svn_cl__merge_cmd_opt, 1,
-                    N_("use ARG as merge command")},
-  {"editor-cmd",    svn_cl__editor_cmd_opt, 1,
-                    N_("use ARG as external editor")},
+  {"diff-cmd",      opt_diff_cmd, 1, N_("use ARG as diff command")},
+  {"diff3-cmd",     opt_merge_cmd, 1, N_("use ARG as merge command")},
+  {"editor-cmd",    opt_editor_cmd, 1, N_("use ARG as external editor")},
 #endif
-  {"record-only",   svn_cl__record_only_opt, 0,
+  {"record-only",   opt_record_only, 0,
                     N_("mark revisions as merged (use with -r)")},
-  {"old",           svn_cl__old_cmd_opt, 1,
-                    N_("use ARG as the older target")},
-  {"new",           svn_cl__new_cmd_opt, 1,
-                    N_("use ARG as the newer target")},
-  {"revprop",       svn_cl__revprop_opt, 0,
+  {"old",           opt_old_cmd, 1, N_("use ARG as the older target")},
+  {"new",           opt_new_cmd, 1, N_("use ARG as the newer target")},
+  {"revprop",       opt_revprop, 0,
                     N_("operate on a revision property (use with -r)")},
-  {"relocate",      svn_cl__relocate_opt, 0,
-                    N_("relocate via URL-rewriting")},
-  {"config-dir",    svn_cl__config_dir_opt, 1,
+  {"relocate",      opt_relocate, 0, N_("relocate via URL-rewriting")},
+  {"config-dir",    opt_config_dir, 1,
                     N_("read user configuration files from directory ARG")},
-  {"auto-props",    svn_cl__autoprops_opt, 0,
-                    N_("enable automatic properties")},
-  {"no-auto-props", svn_cl__no_autoprops_opt, 0,
-                    N_("disable automatic properties")},
-  {"native-eol",    svn_cl__native_eol_opt, 1,
+  {"auto-props",    opt_autoprops, 0, N_("enable automatic properties")},
+  {"no-auto-props", opt_no_autoprops, 0, N_("disable automatic properties")},
+  {"native-eol",    opt_native_eol, 1,
                     N_("use a different EOL marker than the standard\n"
                        "                             "
                        "system marker for files with the svn:eol-style\n"
@@ -184,33 +223,27 @@
                        "property set to 'native'.\n"
                        "                             "
                        "ARG may be one of 'LF', 'CR', 'CRLF'")},
-  {"limit",         'l', 1,
-                    N_("maximum number of log entries")},
-  {"no-unlock",     svn_cl__no_unlock_opt, 0,
-                    N_("don't unlock the targets")},
-  {"summarize",     svn_cl__summarize, 0,
-                    N_("show a summary of the results")},
-  {"remove",         svn_cl__remove_opt, 0,
-                    N_("remove changelist association")},
-  {"changelist",    svn_cl__changelist_opt, 1,
+  {"limit",         'l', 1, N_("maximum number of log entries")},
+  {"no-unlock",     opt_no_unlock, 0, N_("don't unlock the targets")},
+  {"summarize",     opt_summarize, 0, N_("show a summary of the results")},
+  {"remove",         opt_remove, 0, N_("remove changelist association")},
+  {"changelist",    opt_changelist, 1,
                     N_("operate only on members of changelist ARG")},
-  {"keep-changelist", svn_cl__keep_changelist_opt, 0,
+  {"keep-changelist", opt_keep_changelist, 0,
                     N_("don't delete changelist after commit")},
-  {"keep-local",    svn_cl__keep_local_opt, 0,
-                    N_("keep path in working copy")},
-  {"with-all-revprops",  svn_cl__with_all_revprops_opt, 0,
+  {"keep-local",    opt_keep_local, 0, N_("keep path in working copy")},
+  {"with-all-revprops",  opt_with_all_revprops, 0,
                     N_("retrieve all revision properties")},
-  {"with-revprop",  svn_cl__with_revprop_opt, 1,
+  {"with-revprop",  opt_with_revprop, 1,
                     N_("set revision property ARG in new revision\n"
                        "                             "
                        "using the name=value format")},
-  {"parents",       svn_cl__parents_opt, 0,
-                    N_("make intermediate directories")},
+  {"parents",       opt_parents, 0, N_("make intermediate directories")},
   {"use-merge-history", 'g', 0,
                     N_("use/display additional information from merge\n"
                        "                             "
                        "history")},
-  {"accept",        svn_cl__accept_opt, 1,
+  {"accept",        opt_accept, 1,
                     N_("specify automatic conflict resolution action\n"
                        "                            "
                        "('" SVN_CL__ACCEPT_POSTPONE "',"
@@ -220,7 +253,7 @@
                        " '" SVN_CL__ACCEPT_EDIT "',"
                        "\n                            "
                        " '" SVN_CL__ACCEPT_LAUNCH "')")},
-  {"from-source",   svn_cl__from_source_opt, 1,
+  {"from-source",   opt_from_source, 1,
                     N_("query a particular merge source URL\n")},
   {0,               0, 0, 0},
 };
@@ -244,18 +277,17 @@
    command to take these arguments allows scripts to just pass them
    willy-nilly to every invocation of 'svn') . */
 const int svn_cl__global_options[] =
-{ svn_cl__auth_username_opt, svn_cl__auth_password_opt,
-  svn_cl__no_auth_cache_opt, svn_cl__non_interactive_opt,
-  svn_cl__config_dir_opt, 0
+{ opt_auth_username, opt_auth_password, opt_no_auth_cache, opt_non_interactive,
+  opt_config_dir, 0
 };
 
 /* Options for giving a log message.  (Some of these also have other uses.)
  */
 #define SVN_CL__LOG_MSG_OPTIONS 'm', 'F', \
-                                svn_cl__force_log_opt, \
-                                svn_cl__editor_cmd_opt, \
-                                svn_cl__encoding_opt, \
-                                svn_cl__with_revprop_opt
+                                opt_force_log, \
+                                opt_editor_cmd, \
+                                opt_encoding, \
+                                opt_with_revprop
 
 const svn_opt_subcommand_desc2_t svn_cl__cmd_table[] =
 {
@@ -263,10 +295,9 @@
     ("Put files and directories under version control, scheduling\n"
      "them for addition to repository.  They will be added in next commit.\n"
      "usage: add PATH...\n"),
-    {svn_cl__targets_opt, 'N', svn_cl__depth_opt, 'q',
-     svn_cl__force_opt, svn_cl__no_ignore_opt, svn_cl__autoprops_opt,
-     svn_cl__no_autoprops_opt, svn_cl__parents_opt },
-     {{svn_cl__parents_opt, N_("add intermediate parents")}} },
+    {opt_targets, 'N', opt_depth, 'q', opt_force, opt_no_ignore, opt_autoprops,
+     opt_no_autoprops, opt_parents },
+     {{opt_parents, N_("add intermediate parents")}} },
 
   { "blame", svn_cl__blame, {"praise", "annotate", "ann"}, N_
     ("Output the content of specified files or\n"
@@ -275,8 +306,7 @@
      "\n"
      "  If specified, REV determines in which revision the target is first\n"
      "  looked up.\n"),
-    {'r', 'v', 'g', svn_cl__incremental_opt, svn_cl__xml_opt, 'x',
-     svn_cl__force_opt} },
+    {'r', 'v', 'g', opt_incremental, opt_xml, 'x', opt_force} },
 
   { "cat", svn_cl__cat, {0}, N_
     ("Output the content of specified files or URLs.\n"
@@ -290,7 +320,7 @@
     ("Associate (or deassociate) local paths with changelist CLNAME.\n"
      "usage: 1. changelist CLNAME TARGET...\n"
      "       2. changelist --remove TARGET...\n"),
-    { svn_cl__remove_opt, svn_cl__targets_opt, svn_cl__changelist_opt} },
+    { opt_remove, opt_targets, opt_changelist} },
 
   { "checkout", svn_cl__checkout, {"co"}, N_
     ("Check out a working copy from a repository.\n"
@@ -314,14 +344,13 @@
      "  obstruction and the repository are treated like a local modification\n"
      "  to the working copy.  All properties from the repository are applied\n"
      "  to the obstructing path.\n"),
-    {'r', 'q', 'N', svn_cl__depth_opt, svn_cl__force_opt,
-     svn_cl__ignore_externals_opt, svn_cl__accept_opt} },
+    {'r', 'q', 'N', opt_depth, opt_force, opt_ignore_externals, opt_accept} },
 
   { "cleanup", svn_cl__cleanup, {0}, N_
     ("Recursively clean up the working copy, removing locks, resuming\n"
      "unfinished operations, etc.\n"
      "usage: cleanup [PATH...]\n"),
-    {svn_cl__merge_cmd_opt} },
+    {opt_merge_cmd} },
 
   { "commit", svn_cl__commit, {"ci"},
 #ifndef AS400
@@ -342,9 +371,8 @@
        "  (or contain) locked items, those will be unlocked after a\n"
        "  successful commit.\n"),
 #endif
-    {'q', 'N', svn_cl__depth_opt, svn_cl__targets_opt,
-     svn_cl__no_unlock_opt, SVN_CL__LOG_MSG_OPTIONS,
-     svn_cl__changelist_opt, svn_cl__keep_changelist_opt} },
+    {'q', 'N', opt_depth, opt_targets, opt_no_unlock, SVN_CL__LOG_MSG_OPTIONS,
+     opt_changelist, opt_keep_changelist} },
 
   { "copy", svn_cl__copy, {"cp"}, N_
     ("Duplicate something in working copy or repository, remembering\n"
@@ -360,7 +388,7 @@
      "    URL -> WC:   check out URL into WC, schedule for addition\n"
      "    URL -> URL:  complete server-side copy;  used to branch & tag\n"
      "  All the SRCs must be of the same type.\n"),
-    {'r', 'q', svn_cl__parents_opt, SVN_CL__LOG_MSG_OPTIONS} },
+    {'r', 'q', opt_parents, SVN_CL__LOG_MSG_OPTIONS} },
 
   { "delete", svn_cl__delete, {"del", "remove", "rm"}, N_
     ("Remove files and directories from version control.\n"
@@ -376,8 +404,7 @@
      "\n"
      "  2. Each item specified by a URL is deleted from the repository\n"
      "    via an immediate commit.\n"),
-    {svn_cl__force_opt, 'q', svn_cl__targets_opt,
-     SVN_CL__LOG_MSG_OPTIONS, svn_cl__keep_local_opt} },
+    {opt_force, 'q', opt_targets, SVN_CL__LOG_MSG_OPTIONS, opt_keep_local} },
 
   { "diff", svn_cl__diff, {"di"}, N_
     ("Display the differences between two revisions or paths.\n"
@@ -403,11 +430,9 @@
      "  3. Shorthand for 'svn diff --old=OLD-URL[@OLDREV] --new=NEW-URL[@NEWREV]'\n"
      "\n"
      "  Use just 'svn diff' to display local modifications in a working copy.\n"),
-    {'r', 'c', svn_cl__old_cmd_opt, svn_cl__new_cmd_opt, 'N',
-     svn_cl__depth_opt, svn_cl__diff_cmd_opt, 'x',
-     svn_cl__no_diff_deleted, svn_cl__notice_ancestry_opt,
-     svn_cl__summarize, svn_cl__changelist_opt, svn_cl__force_opt,
-     svn_cl__xml_opt} },
+    {'r', 'c', opt_old_cmd, opt_new_cmd, 'N', opt_depth, opt_diff_cmd, 'x',
+     opt_no_diff_deleted, opt_notice_ancestry, opt_summarize, opt_changelist, 
+     opt_force, opt_xml} },
 
   { "export", svn_cl__export, {0}, N_
     ("Create an unversioned copy of a tree.\n"
@@ -428,8 +453,7 @@
      "\n"
      "  If specified, PEGREV determines in which revision the target is first\n"
      "  looked up.\n"),
-    {'r', 'q', 'N', svn_cl__depth_opt, svn_cl__force_opt,
-     svn_cl__native_eol_opt, svn_cl__ignore_externals_opt} },
+    {'r', 'q', 'N', opt_depth, opt_force, opt_native_eol, opt_ignore_externals} },
 
   { "help", svn_cl__help, {"?", "h"}, N_
     ("Describe the usage of this program or its subcommands.\n"
@@ -448,9 +472,8 @@
      "  directly under URL.\n"
      "  Unversionable items such as device files and pipes are ignored\n"
      "  if --force is specified.\n"),
-    {'q', 'N', svn_cl__depth_opt, svn_cl__autoprops_opt,
-     svn_cl__force_opt, svn_cl__no_autoprops_opt,
-     SVN_CL__LOG_MSG_OPTIONS, svn_cl__no_ignore_opt} },
+    {'q', 'N', opt_depth, opt_autoprops, opt_force, opt_no_autoprops,
+     SVN_CL__LOG_MSG_OPTIONS, opt_no_ignore} },
 
   { "info", svn_cl__info, {0}, N_
     ("Display information about a local or remote item.\n"
@@ -459,8 +482,7 @@
      "  Print information about each TARGET (default: '.')\n"
      "  TARGET may be either a working-copy path or URL.  If specified, REV\n"
      "  determines in which revision the target is first looked up.\n"),
-    {'r', 'R', svn_cl__depth_opt, svn_cl__targets_opt,
-     svn_cl__incremental_opt, svn_cl__xml_opt, svn_cl__changelist_opt}
+    {'r', 'R', opt_depth, opt_targets, opt_incremental, opt_xml, opt_changelist}
   },
 
   { "list", svn_cl__list, {"ls"}, N_
@@ -482,8 +504,7 @@
      "    If locked, the letter 'O'.  (Use 'svn info URL' to see details)\n"
      "    Size (in bytes)\n"
      "    Date and time of the last commit\n"),
-    {'r', 'v', 'R', svn_cl__depth_opt, svn_cl__incremental_opt,
-     svn_cl__xml_opt} },
+    {'r', 'v', 'R', opt_depth, opt_incremental, opt_xml} },
 
   { "lock", svn_cl__lock, {0}, N_
     ("Lock working copy paths or URLs in the repository, so that\n"
@@ -491,11 +512,11 @@
      "usage: lock TARGET...\n"
      "\n"
      "  Use --force to steal the lock from another user or working copy.\n"),
-    { svn_cl__targets_opt, 'm', 'F', svn_cl__force_log_opt,
-      svn_cl__encoding_opt, svn_cl__force_opt, svn_cl__changelist_opt },
+    { opt_targets, 'm', 'F', opt_force_log, opt_encoding, opt_force, 
+      opt_changelist },
     {{'F', N_("read lock comment from file ARG")},
      {'m', N_("specify lock comment ARG")},
-     {svn_cl__force_log_opt, N_("force validity of lock comment source")}} },
+     {opt_force_log, N_("force validity of lock comment source")}} },
 
   { "log", svn_cl__log, {0}, N_
     ("Show the log messages for a set of revision(s) and/or file(s).\n"
@@ -523,11 +544,9 @@
      "    svn log foo.c\n"
      "    svn log http://www.example.com/repo/project/foo.c\n"
      "    svn log http://www.example.com/repo/project foo.c bar.c\n"),
-    {'r', 'q', 'v', 'g', 'c', svn_cl__targets_opt,
-     svn_cl__stop_on_copy_opt, svn_cl__incremental_opt,
-     svn_cl__xml_opt, 'l', svn_cl__changelist_opt,
-     svn_cl__with_all_revprops_opt, svn_cl__with_revprop_opt},
-    {{svn_cl__with_revprop_opt, N_("retrieve revision property ARG")},
+    {'r', 'q', 'v', 'g', 'c', opt_targets, opt_stop_on_copy, opt_incremental,
+     opt_xml, 'l', opt_changelist, opt_with_all_revprops, opt_with_revprop},
+    {{opt_with_revprop, N_("retrieve revision property ARG")},
      {'c', N_("the change made by ARG")}} },
 
   { "merge", svn_cl__merge, {0}, N_
@@ -566,15 +585,13 @@
      "  merge operation if the two sources are ancestrally related -- if the\n"
      "  first source is an ancestor of the second, or vice-versa.  This is\n"
      "  guaranteed to be the case when using the third form listed above.\n"),
-    {'r', 'c', 'N', svn_cl__depth_opt, 'q', svn_cl__force_opt,
-     svn_cl__dry_run_opt, svn_cl__merge_cmd_opt,
-     svn_cl__record_only_opt, 'x', svn_cl__ignore_ancestry_opt,
-     svn_cl__accept_opt} },
+    {'r', 'c', 'N', opt_depth, 'q', opt_force, opt_dry_run, opt_merge_cmd,
+     opt_record_only, 'x', opt_ignore_ancestry, opt_accept} },
 
   { "mergeinfo", svn_cl__mergeinfo, {0}, N_
     ("Query merge-related information.\n"
      "usage: mergeinfo [TARGET[@REV]...]\n"),
-    {'r', svn_cl__from_source_opt} },
+    {'r', opt_from_source} },
 
   { "mkdir", svn_cl__mkdir, {0}, N_
     ("Create a new directory under version control.\n"
@@ -591,7 +608,7 @@
      "\n"
      "  In both cases, all the intermediate directories must already exist,\n"
      "  unless the --parents option is given.\n"),
-    {'q', svn_cl__parents_opt, SVN_CL__LOG_MSG_OPTIONS} },
+    {'q', opt_parents, SVN_CL__LOG_MSG_OPTIONS} },
 
   { "move", svn_cl__move, {"mv", "rename", "ren"}, N_
     ("Move and/or rename something in working copy or repository.\n"
@@ -607,8 +624,7 @@
      "    WC  -> WC:   move and schedule for addition (with history)\n"
      "    URL -> URL:  complete server-side rename.\n"
      "  All the SRCs must be of the same type.\n"),
-    {'r', 'q', svn_cl__force_opt, svn_cl__parents_opt,
-     SVN_CL__LOG_MSG_OPTIONS} },
+    {'r', 'q', opt_force, opt_parents, SVN_CL__LOG_MSG_OPTIONS} },
 
   { "propdel", svn_cl__propdel, {"pdel", "pd"}, N_
     ("Remove a property from files, dirs, or revisions.\n"
@@ -618,8 +634,7 @@
      "  1. Removes versioned props in working copy.\n"
      "  2. Removes unversioned remote prop on repos revision.\n"
      "     TARGET only determines which repository to access.\n"),
-    {'q', 'R', svn_cl__depth_opt, 'r', svn_cl__revprop_opt,
-     svn_cl__changelist_opt} },
+    {'q', 'R', opt_depth, 'r', opt_revprop, opt_changelist} },
 
 #ifndef AS400
   { "propedit", svn_cl__propedit, {"pedit", "pe"}, N_
@@ -632,8 +647,7 @@
      "     TARGET only determines which repository to access.\n"
      "\n"
      "See 'svn help propset' for more on property setting.\n"),
-    {'r', svn_cl__revprop_opt, SVN_CL__LOG_MSG_OPTIONS,
-     svn_cl__force_opt} },
+    {'r', opt_revprop, SVN_CL__LOG_MSG_OPTIONS, opt_force} },
 #endif
 
   { "propget", svn_cl__propget, {"pget", "pg"}, N_
@@ -652,8 +666,7 @@
      "  is prefixed with the path with which it is associated.  Use\n"
      "  the --strict option to disable these beautifications (useful,\n"
      "  for example, when redirecting binary property values to a file).\n"),
-    {'R', svn_cl__depth_opt, 'r', svn_cl__revprop_opt, svn_cl__strict_opt,
-     svn_cl__xml_opt, svn_cl__changelist_opt } },
+    {'R', opt_depth, 'r', opt_revprop, opt_strict, opt_xml, opt_changelist } },
 
   { "proplist", svn_cl__proplist, {"plist", "pl"}, N_
     ("List all properties on files, dirs, or revisions.\n"
@@ -664,8 +677,7 @@
      "     revision the target is first looked up.\n"
      "  2. Lists unversioned remote props on repos revision.\n"
      "     TARGET only determines which repository to access.\n"),
-    {'v', 'R', svn_cl__depth_opt, 'r', 'q', svn_cl__revprop_opt,
-     svn_cl__xml_opt, svn_cl__changelist_opt } },
+    {'v', 'R', opt_depth, 'r', 'q', opt_revprop, opt_xml, opt_changelist } },
 
   { "propset", svn_cl__propset, {"pset", "ps"}, N_
     ("Set the value of a property on files, dirs, or revisions.\n"
@@ -726,9 +738,8 @@
      "  svn:needs-lock properties cannot be set on a directory.  A non-recursive\n"
      "  attempt will fail, and a recursive attempt will set the property\n"
      "  only on the file children of the directory.\n"),
-    {'F', svn_cl__encoding_opt, 'q', 'r', svn_cl__targets_opt, 'R',
-     svn_cl__depth_opt, svn_cl__revprop_opt, svn_cl__force_opt,
-     svn_cl__changelist_opt },
+    {'F', opt_encoding, 'q', 'r', opt_targets, 'R', opt_depth, opt_revprop, 
+     opt_force, opt_changelist },
     {{'F', N_("read property value from file ARG")}} },
 
   { "resolved", svn_cl__resolved, {0}, N_
@@ -738,8 +749,8 @@
      "  Note:  this subcommand does not semantically resolve conflicts or\n"
      "  remove conflict markers; it merely removes the conflict-related\n"
      "  artifact files and allows PATH to be committed again.\n"),
-    {svn_cl__targets_opt, 'R', svn_cl__depth_opt, 'q', svn_cl__accept_opt},
-    {{svn_cl__accept_opt, N_("specify automatic conflict resolution source\n"
+    {opt_targets, 'R', opt_depth, 'q', opt_accept},
+    {{opt_accept, N_("specify automatic conflict resolution source\n"
                              "                            "
                              " '" SVN_CL__ACCEPT_BASE "',"
                              " '" SVN_CL__ACCEPT_MINE "',"
@@ -751,8 +762,7 @@
      "\n"
      "  Note:  this subcommand does not require network access, and resolves\n"
      "  any conflicted states.  However, it does not restore removed directories.\n"),
-    {svn_cl__targets_opt, 'R', svn_cl__depth_opt, 'q',
-     svn_cl__changelist_opt} },
+    {opt_targets, 'R', opt_depth, 'q', opt_changelist} },
 
   { "status", svn_cl__status, {"stat", "st"}, N_
     ("Print the status of working copy files and directories.\n"
@@ -827,9 +837,8 @@
      "    A  +         965       687 joe          wc/qax.c\n"
      "                 965       687 joe          wc/zig.c\n"
      "    Status against revision:   981\n"),
-    { 'u', 'v', 'N', svn_cl__depth_opt, 'q', svn_cl__no_ignore_opt,
-      svn_cl__incremental_opt, svn_cl__xml_opt,
-      svn_cl__ignore_externals_opt, svn_cl__changelist_opt} },
+    { 'u', 'v', 'N', opt_depth, 'q', opt_no_ignore, opt_incremental, opt_xml,
+      opt_ignore_externals, opt_changelist} },
 
   { "switch", svn_cl__switch, {"sw"}, N_
     ("Update the working copy to a different URL.\n"
@@ -857,16 +866,15 @@
      "  between the obstruction and the repository are treated like a local\n"
      "  modification to the working copy.  All properties from the repository\n"
      "  are applied to the obstructing path.\n"),
-    { 'r', 'N', svn_cl__depth_opt, 'q', svn_cl__merge_cmd_opt,
-      svn_cl__relocate_opt, svn_cl__ignore_externals_opt,
-      svn_cl__force_opt, svn_cl__accept_opt} },
+    { 'r', 'N', opt_depth, 'q', opt_merge_cmd, opt_relocate, 
+      opt_ignore_externals, opt_force, opt_accept} },
 
   { "unlock", svn_cl__unlock, {0}, N_
     ("Unlock working copy paths or URLs.\n"
      "usage: unlock TARGET...\n"
      "\n"
      "  Use --force to break the lock.\n"),
-    { svn_cl__targets_opt, svn_cl__force_opt, svn_cl__changelist_opt } },
+    { opt_targets, opt_force, opt_changelist } },
 
   { "update", svn_cl__update, {"up"},  N_
     ("Bring changes from the repository into the working copy.\n"
@@ -901,10 +909,8 @@
      "  modification to the working copy.  All properties from the repository\n"
      "  are applied to the obstructing path.  Obstructing paths are reported\n"
      "  in the first column with code 'E'.\n"),
-    {'r', 'N', svn_cl__depth_opt, 'q', svn_cl__merge_cmd_opt,
-     svn_cl__force_opt, svn_cl__ignore_externals_opt,
-     svn_cl__changelist_opt, svn_cl__editor_cmd_opt,
-     svn_cl__accept_opt} },
+    {'r', 'N', opt_depth, 'q', opt_merge_cmd, opt_force, opt_ignore_externals,
+     opt_changelist, opt_editor_cmd, opt_accept} },
 
   { NULL, NULL, {0}, NULL, {0} }
 };
@@ -1199,7 +1205,7 @@
       case 'q':
         opt_state.quiet = TRUE;
         break;
-      case svn_cl__incremental_opt:
+      case opt_incremental:
         opt_state.incremental = TRUE;
         break;
       case 'F':
@@ -1211,7 +1217,7 @@
           return svn_cmdline_handle_exit_error(err, pool, "svn: ");
         dash_F_arg = opt_arg;
         break;
-      case svn_cl__targets_opt:
+      case opt_targets:
         {
           svn_stringbuf_t *buffer, *buffer_utf8;
 
@@ -1231,16 +1237,16 @@
                                                 TRUE, pool);
         }
         break;
-      case svn_cl__force_opt:
+      case opt_force:
         opt_state.force = TRUE;
         break;
-      case svn_cl__force_log_opt:
+      case opt_force_log:
         opt_state.force_log = TRUE;
         break;
-      case svn_cl__dry_run_opt:
+      case opt_dry_run:
         opt_state.dry_run = TRUE;
         break;
-      case svn_cl__revprop_opt:
+      case opt_revprop:
         opt_state.revprop = TRUE;
         break;
       case 'R':
@@ -1249,7 +1255,7 @@
       case 'N':
         descend = FALSE;
         break;
-      case svn_cl__depth_opt:
+      case opt_depth:
         err = svn_utf_cstring_to_utf8(&utf8_opt_arg, opt_arg, pool);
         if (err)
           return svn_cmdline_handle_exit_error
@@ -1268,55 +1274,55 @@
                                  utf8_opt_arg), pool, "svn: ");
           }
         break;
-      case svn_cl__version_opt:
+      case opt_version:
         opt_state.version = TRUE;
         break;
-      case svn_cl__auth_username_opt:
+      case opt_auth_username:
         err = svn_utf_cstring_to_utf8(&opt_state.auth_username,
                                       opt_arg, pool);
         if (err)
           return svn_cmdline_handle_exit_error(err, pool, "svn: ");
         break;
-      case svn_cl__auth_password_opt:
+      case opt_auth_password:
         err = svn_utf_cstring_to_utf8(&opt_state.auth_password,
                                       opt_arg, pool);
         if (err)
           return svn_cmdline_handle_exit_error(err, pool, "svn: ");
         break;
-      case svn_cl__encoding_opt:
+      case opt_encoding:
         opt_state.encoding = apr_pstrdup(pool, opt_arg);
         break;
-      case svn_cl__xml_opt:
+      case opt_xml:
         opt_state.xml = TRUE;
         break;
-      case svn_cl__stop_on_copy_opt:
+      case opt_stop_on_copy:
         opt_state.stop_on_copy = TRUE;
         break;
-      case svn_cl__strict_opt:
+      case opt_strict:
         opt_state.strict = TRUE;
         break;
-      case svn_cl__no_ignore_opt:
+      case opt_no_ignore:
         opt_state.no_ignore = TRUE;
         break;
-      case svn_cl__no_auth_cache_opt:
+      case opt_no_auth_cache:
         opt_state.no_auth_cache = TRUE;
         break;
-      case svn_cl__non_interactive_opt:
+      case opt_non_interactive:
         opt_state.non_interactive = TRUE;
         break;
-      case svn_cl__no_diff_deleted:
+      case opt_no_diff_deleted:
         opt_state.no_diff_deleted = TRUE;
         break;
-      case svn_cl__notice_ancestry_opt:
+      case opt_notice_ancestry:
         opt_state.notice_ancestry = TRUE;
         break;
-      case svn_cl__ignore_ancestry_opt:
+      case opt_ignore_ancestry:
         opt_state.ignore_ancestry = TRUE;
         break;
-      case svn_cl__ignore_externals_opt:
+      case opt_ignore_externals:
         opt_state.ignore_externals = TRUE;
         break;
-      case svn_cl__relocate_opt:
+      case opt_relocate:
         opt_state.relocate = TRUE;
         break;
       case 'x':
@@ -1324,19 +1330,19 @@
         if (err)
           return svn_cmdline_handle_exit_error(err, pool, "svn: ");
         break;
-      case svn_cl__diff_cmd_opt:
+      case opt_diff_cmd:
         opt_state.diff_cmd = apr_pstrdup(pool, opt_arg);
         break;
-      case svn_cl__merge_cmd_opt:
+      case opt_merge_cmd:
         opt_state.merge_cmd = apr_pstrdup(pool, opt_arg);
         break;
-      case svn_cl__record_only_opt:
+      case opt_record_only:
         opt_state.record_only = TRUE;
         break;
-      case svn_cl__editor_cmd_opt:
+      case opt_editor_cmd:
         opt_state.editor_cmd = apr_pstrdup(pool, opt_arg);
         break;
-      case svn_cl__old_cmd_opt:
+      case opt_old_cmd:
         if (opt_state.used_change_arg)
           {
             err = svn_error_create
@@ -1346,20 +1352,20 @@
           }
         opt_state.old_target = apr_pstrdup(pool, opt_arg);
         break;
-      case svn_cl__new_cmd_opt:
+      case opt_new_cmd:
         opt_state.new_target = apr_pstrdup(pool, opt_arg);
         break;
-      case svn_cl__config_dir_opt:
+      case opt_config_dir:
         err = svn_utf_cstring_to_utf8(&path_utf8, opt_arg, pool);
         opt_state.config_dir = svn_path_canonicalize(path_utf8, pool);
         break;
-      case svn_cl__autoprops_opt:
+      case opt_autoprops:
         opt_state.autoprops = TRUE;
         break;
-      case svn_cl__no_autoprops_opt:
+      case opt_no_autoprops:
         opt_state.no_autoprops = TRUE;
         break;
-      case svn_cl__native_eol_opt:
+      case opt_native_eol:
         if ( !strcmp("LF", opt_arg) || !strcmp("CR", opt_arg) ||
              !strcmp("CRLF", opt_arg))
           opt_state.native_eol = apr_pstrdup(pool, opt_arg);
@@ -1374,41 +1380,41 @@
             return svn_cmdline_handle_exit_error(err, pool, "svn: ");
           }
         break;
-      case svn_cl__no_unlock_opt:
+      case opt_no_unlock:
         opt_state.no_unlock = TRUE;
         break;
-      case svn_cl__summarize:
+      case opt_summarize:
         opt_state.summarize = TRUE;
         break;
-      case svn_cl__remove_opt:
+      case opt_remove:
         opt_state.remove = TRUE;
         break;
-      case svn_cl__changelist_opt:
+      case opt_changelist:
         opt_state.changelist = apr_pstrdup(pool, opt_arg);
         break;
-      case svn_cl__keep_changelist_opt:
+      case opt_keep_changelist:
         opt_state.keep_changelist = TRUE;
         break;
-      case svn_cl__keep_local_opt:
+      case opt_keep_local:
         opt_state.keep_local = TRUE;
         break;
-      case svn_cl__with_all_revprops_opt:
+      case opt_with_all_revprops:
         /* If --with-all-revprops is specified along with one or more
          * --with-revprops options, --with-all-revprops takes precedence. */
         opt_state.all_revprops = TRUE;
         break;
-      case svn_cl__with_revprop_opt:
+      case opt_with_revprop:
         err = parse_revprop(&opt_state.revprop_table, opt_arg, pool);
         if (err != SVN_NO_ERROR)
           return svn_cmdline_handle_exit_error(err, pool, "svn: ");
         break;
-      case svn_cl__parents_opt:
+      case opt_parents:
         opt_state.parents = TRUE;
         break;
       case 'g':
         opt_state.use_merge_history = TRUE;
         break;
-      case svn_cl__accept_opt:
+      case opt_accept:
         opt_state.accept_which = svn_cl__accept_from_word(opt_arg);
         if (opt_state.accept_which == svn_cl__accept_invalid)
           return svn_cmdline_handle_exit_error
@@ -1416,7 +1422,7 @@
                                _("'%s' is not a valid accept value"), opt_arg),
              pool, "svn: ");
         break;
-      case svn_cl__from_source_opt:
+      case opt_from_source:
         err = svn_utf_cstring_to_utf8(&path_utf8, opt_arg, pool);
         opt_state.from_source = svn_path_canonicalize(path_utf8, pool);
         break;
@@ -1459,9 +1465,9 @@
               /* Use the "help" subcommand to handle the "--version" option. */
               static const svn_opt_subcommand_desc2_t pseudo_cmd =
                 { "--version", svn_cl__help, {0}, "",
-                  {svn_cl__version_opt,    /* must accept its own option */
-                   'q',                    /* brief output */
-                   svn_cl__config_dir_opt  /* all commands accept this */
+                  {opt_version,    /* must accept its own option */
+                   'q',            /* brief output */
+                   opt_config_dir  /* all commands accept this */
                   } };
 
               subcommand = &pseudo_cmd;
diff --git a/subversion/svn/merge-cmd.c b/subversion/svn/merge-cmd.c
index e923b8a..b5c7d68 100644
--- a/subversion/svn/merge-cmd.c
+++ b/subversion/svn/merge-cmd.c
@@ -123,7 +123,13 @@
               ? svn_opt_revision_head : svn_opt_revision_working;
 
           if (targets->nelts == 2)
-            targetpath = APR_ARRAY_IDX(targets, 1, const char *);
+            {
+              targetpath = APR_ARRAY_IDX(targets, 1, const char *);
+              if (svn_path_is_url(targetpath))
+                return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
+                                        "Cannot specifify a revision range "
+                                        "with two URLs");
+            }
         }
     }
   else /* using @rev syntax */
diff --git a/subversion/svn/mergeinfo-cmd.c b/subversion/svn/mergeinfo-cmd.c
index 92e362e..2ee56c0 100644
--- a/subversion/svn/mergeinfo-cmd.c
+++ b/subversion/svn/mergeinfo-cmd.c
@@ -169,35 +169,37 @@
       svn_cmdline_printf(pool, _("Path: %s\n"),
                          svn_path_local_style(truepath, pool));
       if (mergeinfo == NULL)
-        {
-          svn_cmdline_printf(pool, "\n");
-          continue;
-        }
+        mergeinfo = apr_hash_make(pool);
 
       SVN_ERR(svn_client_root_url_from_path(&root_url, truepath, ctx, pool));
 
       if (opt_state->from_source)
         {
           apr_array_header_t *merged_ranges = 
-            apr_hash_get(mergeinfo, opt_state->from_source, APR_HASH_KEY_STRING);
+            apr_hash_get(mergeinfo, opt_state->from_source, 
+                         APR_HASH_KEY_STRING);
           if (! merged_ranges)
-            merged_ranges = apr_array_make(pool, 1, sizeof(svn_merge_range_t *));
-          SVN_ERR(show_mergeinfo_for_source(opt_state->from_source, merged_ranges, 
-                                            truepath, &peg_revision,
-                                            root_url, ctx, subpool));
+            merged_ranges = apr_array_make(pool, 1, 
+                                           sizeof(svn_merge_range_t *));
+          SVN_ERR(show_mergeinfo_for_source(opt_state->from_source, 
+                                            merged_ranges, truepath, 
+                                            &peg_revision, root_url, 
+                                            ctx, subpool));
         }
-      else
+      else if (apr_hash_count(mergeinfo) > 0)
         {
           apr_pool_t *iterpool = svn_pool_create(subpool);
-          for (hi = apr_hash_first(NULL, mergeinfo); hi; hi = apr_hash_next(hi))
+          for (hi = apr_hash_first(NULL, mergeinfo); 
+               hi; hi = apr_hash_next(hi))
             {
               const void *key;
               void *val;
               
               svn_pool_clear(iterpool);
               apr_hash_this(hi, &key, NULL, &val);
-              SVN_ERR(show_mergeinfo_for_source(key, val, truepath, &peg_revision,
-                                                root_url, ctx, iterpool));
+              SVN_ERR(show_mergeinfo_for_source(key, val, truepath, 
+                                                &peg_revision, root_url, 
+                                                ctx, iterpool));
             }
           svn_pool_destroy(iterpool);
         }
diff --git a/subversion/svnadmin/main.c b/subversion/svnadmin/main.c
index 4f2f131..994fdef 100644
--- a/subversion/svnadmin/main.c
+++ b/subversion/svnadmin/main.c
@@ -1191,7 +1191,12 @@
   /* Parse out any options. */
   SVN_ERR(svn_opt_parse_all_args(&args, os, pool));
 
-  /* All the rest of the arguments are lock names. */
+  /* Our usage requires at least one FS path. */
+  if (args->nelts == 0)
+    return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, 0, 
+                            _("No paths to unlock provided"));
+
+  /* All the rest of the arguments are paths from which to remove locks. */
   for (i = 0; i < args->nelts; i++)
     {
       const char *lock_path = APR_ARRAY_IDX(args, i, const char *);
diff --git a/subversion/tests/cmdline/README b/subversion/tests/cmdline/README
index 2074f29..95fd7bf 100644
--- a/subversion/tests/cmdline/README
+++ b/subversion/tests/cmdline/README
@@ -193,6 +193,8 @@
           /actions.py:      Main API for driving subversion client and
                             using trees to verify results. 
 
+          /verify.py:       Verifies output from Subversion.
+
           /entry.py:        Parse an `entries' file (### not used yet)
 
 
diff --git a/subversion/tests/cmdline/copy_tests.py b/subversion/tests/cmdline/copy_tests.py
index f11b851..3963d41 100755
--- a/subversion/tests/cmdline/copy_tests.py
+++ b/subversion/tests/cmdline/copy_tests.py
@@ -147,10 +147,15 @@
                                      'cp', pi_src, rho_path)
 
   # Verify both content and props have been copied
+  if wc_copy:
+    props = { SVN_PROP_MERGE_INFO : '',
+              'phony-prop' : '*'}
+  else:
+    props = { 'phony-prop' : '*'}
+    
   expected_disk.tweak('A/D/G/rho',
                       contents="This is the file 'pi'.\n",
-                      props={ 'phony-prop' : '*',
-                              SVN_PROP_MERGE_INFO : '' })
+                      props=props)
   actual_disk = svntest.tree.build_tree_from_wc(wc_dir, 1)
   svntest.tree.compare_trees(actual_disk, expected_disk.old_tree())
 
@@ -1014,8 +1019,8 @@
     })
   svntest.actions.run_and_verify_status(wc_dir, expected_output)
 
-  # Validate that the merge info of the copy destination has been initialized.
-  svntest.actions.run_and_verify_svn(None, ['\n'], [],
+  # Validate the merge info of the copy destination (we expect none)
+  svntest.actions.run_and_verify_svn(None, [], [],
                                      'propget', SVN_PROP_MERGE_INFO,
                                      os.path.join(D_dir, 'B'))
 
@@ -2712,9 +2717,8 @@
                                      'cp', '-m', '',
                                      upsilon_path, upsilon_copy_URL)
 
-  # Validate that the merge info of the copy destination matches the
-  # implied merge info from the copy source.
-  svntest.actions.run_and_verify_svn(None, ['\n'], [],
+  # Validate the merge info of the copy destination (we expect none).
+  svntest.actions.run_and_verify_svn(None, [], [],
                                      'propget',
                                      SVN_PROP_MERGE_INFO, upsilon_copy_URL)
 
@@ -3275,9 +3279,9 @@
   expected_disk = svntest.main.greek_state.copy()
   expected_disk.tweak('A/D/H/psi', contents=iota_text)
   expected_disk.add({
-    'iota'      : Item(contents=psi_text, props={ SVN_PROP_MERGE_INFO : '' }),
-    'A/D/H/psi' : Item(contents=iota_text, props={ SVN_PROP_MERGE_INFO : '' }),
-    'sigma'     : Item(contents=psi_text, props={ SVN_PROP_MERGE_INFO : '' }),
+    'iota'      : Item(contents=psi_text, props={SVN_PROP_MERGE_INFO : ''}),
+    'A/D/H/psi' : Item(contents=iota_text, props={SVN_PROP_MERGE_INFO : ''}),
+    'sigma'     : Item(contents=psi_text, props={}),
     })
 
   actual_disk = svntest.tree.build_tree_from_wc(wc_dir, 3)
@@ -3351,13 +3355,13 @@
   expected_disk.remove('A/D/G/rho')
   expected_disk.remove('A/D/G/tau')
   expected_disk.add({
-    'A/B/E'       : Item(props={ SVN_PROP_MERGE_INFO : '' }),
+    'A/B/E'       : Item(props={SVN_PROP_MERGE_INFO : ''}),
     'A/B/E/pi'    : Item(contents="This is the file 'pi'.\n"),
     'A/B/E/rho'   : Item(contents="This is the file 'rho'.\n"),
     'A/B/E/tau'   : Item(contents="This is the file 'tau'.\n"),
-    'A/D/G'       : Item(props={ SVN_PROP_MERGE_INFO : '' }),
+    'A/D/G'       : Item(props={SVN_PROP_MERGE_INFO : ''}),
     'A/D/G/beta'  : Item(contents="This is the file 'beta'.\n"),
-    'A/J'         : Item(props={ SVN_PROP_MERGE_INFO : '' }),
+    'A/J'         : Item(props={}),
     'A/J/alpha'   : Item(contents="This is the file 'alpha'.\n"),
     'A/J/beta'  : Item(contents="This is the file 'beta'.\n"),
     })
@@ -3404,8 +3408,8 @@
                                      iota_url + '@HEAD', '-r', '1',
                                      sigma_url, '-m', 'rev 3')
 
-  # Validate that copy destination has initialized mergeinfo.
-  svntest.actions.run_and_verify_svn(None, ['\n'], [],
+  # Validate the copy destination's mergeinfo (we expect none).
+  svntest.actions.run_and_verify_svn(None, [], [],
                                      'propget', SVN_PROP_MERGE_INFO, sigma_url)
 
   # Update to HEAD and verify disk contents
@@ -3691,9 +3695,6 @@
        "A    " + os.path.join(wc_dir, dest_name, "D", "H", "psi") + "\n",
        "Checked out revision " + str(rev - 1) + ".\n",
        "A         " + os.path.join(wc_dir, dest_name) + "\n"]
-    if rev == 3:
-      lines.append(" U   " + os.path.join(wc_dir, dest_name) + "\n")
-
     expected = svntest.verify.UnorderedOutput(lines)
     expected_status.add({
       dest_name + "/B"         : Item(status='  ', wc_rev=rev),
@@ -3716,7 +3717,7 @@
       dest_name + "/D/H/psi"   : Item(status='  ', wc_rev=rev),
       dest_name                : Item(status='  ', wc_rev=rev)})
     expected_disk.add({
-      dest_name : Item(props={SVN_PROP_MERGE_INFO : ''}),
+      dest_name                : Item(props={}),
       dest_name + '/B'         : Item(),
       dest_name + '/B/lambda'  : Item("This is the file 'lambda'.\n"),
       dest_name + '/B/E'       : Item(),
diff --git a/subversion/tests/cmdline/depth_tests.py b/subversion/tests/cmdline/depth_tests.py
index 59adfb7..5b29969 100755
--- a/subversion/tests/cmdline/depth_tests.py
+++ b/subversion/tests/cmdline/depth_tests.py
@@ -1372,6 +1372,75 @@
 
 #----------------------------------------------------------------------
 
+# Issue #3039.
+def depthy_update_above_dir_to_be_deleted(sbox):
+  "'update -N' above a WC path deleted in repos HEAD"
+  sbox.build()
+
+  sbox_for_depth = {
+    "files" : sbox,
+    "immediates" : sbox.clone_dependent(copy_wc=True),
+    "empty" : sbox.clone_dependent(copy_wc=True),
+    }
+
+  output, err = \
+    svntest.actions.run_and_verify_svn(None, None, [],
+                                       "delete", "-m", "Delete A.",
+                                       sbox.repo_url + "/A")
+
+  def empty_output(wc_dir):
+    return svntest.wc.State(wc_dir, { })
+
+  def output_with_A(wc_dir):
+    expected_output = empty_output(wc_dir)
+    expected_output.add({
+      "A" : Item(status="D "),
+      })
+    return expected_output
+
+  initial_disk = svntest.main.greek_state.copy()
+  disk_with_only_iota = svntest.wc.State("", {
+    "iota" : Item("This is the file 'iota'.\n"),
+    })
+
+  def status_with_dot(wc_dir):
+    expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+    expected_status.tweak("", wc_rev=2)
+    return expected_status
+
+  def status_with_iota(wc_dir):
+    expected_status = status_with_dot(wc_dir)
+    expected_status.tweak("iota", wc_rev=2)
+    return expected_status
+
+  def status_with_only_iota(wc_dir):
+    return svntest.wc.State(wc_dir, {
+      ""     : Item(status="  ", wc_rev=2),
+      "iota" : Item(status="  ", wc_rev=2),
+      })
+
+  expected_trees_for_depth = {
+    "files"      : (empty_output, initial_disk, status_with_iota),
+    "immediates" : (output_with_A, disk_with_only_iota, status_with_only_iota),
+    "empty"      : (empty_output, initial_disk, status_with_dot),
+    }
+    
+  for depth in sbox_for_depth.keys():
+    wc_dir = sbox_for_depth[depth].wc_dir
+    (expected_output_func, expected_disk, expected_status_func) = \
+      expected_trees_for_depth[depth]
+    #print depth
+    svntest.actions.run_and_verify_update(wc_dir,
+                                          expected_output_func(wc_dir),
+                                          expected_disk,
+                                          expected_status_func(wc_dir),
+                                          None, None, None, None, None,
+                                          False,
+                                          "--depth=%s" % depth, wc_dir)
+
+
+#----------------------------------------------------------------------
+
 # list all tests here, starting with None:
 test_list = [ None,
               depth_empty_checkout,
@@ -1398,6 +1467,7 @@
               add_tree_with_depth_files,
               upgrade_from_above,
               status_in_depthy_wc,
+              depthy_update_above_dir_to_be_deleted,
             ]
 
 if __name__ == "__main__":
diff --git a/subversion/tests/cmdline/merge_tests.py b/subversion/tests/cmdline/merge_tests.py
index e542a0c..dc810fb 100755
--- a/subversion/tests/cmdline/merge_tests.py
+++ b/subversion/tests/cmdline/merge_tests.py
@@ -774,6 +774,7 @@
   svntest.actions.run_and_verify_status(wc_dir, pristine_status)
 
   # Merge B 2:1 into B2 (B2's mergeinfo should get elided away)
+  expected_status.tweak('', status='  ')
   expected_disk.remove('')
   expected_disk.tweak('E', 'E/alpha', 'E/beta', props={})
   svntest.actions.run_and_verify_merge(B2_path, '2', '1', B_url,
@@ -1598,7 +1599,6 @@
   # And after the merge, the status should not report any differences.
 
   expected_output = wc.State(short_wc, {
-    "A" : Item(status=" G"),
     "A/theta" : Item(status="A "),
     })
 
@@ -1702,7 +1702,7 @@
     "\n",
     "Property changes on: " + branch_path + "\n",
     "___________________________________________________________________\n",
-    "Modified: " + SVN_PROP_MERGE_INFO + "\n",
+    "Added: " + SVN_PROP_MERGE_INFO + "\n",
     "   Merged /A/B/E:r2-3\n",
     "\n", ]
   svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff',
@@ -2362,7 +2362,8 @@
       target_dir = os.path.join(wc_dir, 'A', 'B', 'E', target[1])
       os.mkdir(target_dir)
       if target[2]:
-        target_path = os.path.join(wc_dir, 'A', 'B', 'E', '%s' % target[1], target[2])
+        target_path = os.path.join(wc_dir, 'A', 'B', 'E', '%s' % target[1],
+                                   target[2])
         svntest.main.file_append(target_path, "%s/%s" % (target[1], target[2]))
       svntest.actions.run_and_verify_svn(None, None, [], 'add', target_dir)
     elif target[0] == 'f':
@@ -2378,7 +2379,8 @@
       target_dir = os.path.join(wc_dir, 'A', 'B', 'E', target[1])
       svntest.actions.run_and_verify_svn(None, None, [], 'mkdir', target_dir)
       if target[2]:
-        target_path = os.path.join(wc_dir, 'A', 'B', 'E', '%s' % target[1], target[2])
+        target_path = os.path.join(wc_dir, 'A', 'B', 'E', '%s' % target[1],
+                                   target[2])
         svntest.main.file_append(target_path, "%s/%s" % (target[1], target[2]))
         svntest.actions.run_and_verify_svn(None, None, [], 'add', target_path)
 
@@ -2793,7 +2795,8 @@
                                        expected_skip,
                                        None, None, None, None, None,
                                        1,
-                                       0) # don't do a dry-run the output differs
+                                       0) # don't do a dry-run
+                                          # the output differs
 
   # Commit merge of foo onto C
   expected_output = svntest.wc.State(wc_dir, {
@@ -2903,7 +2906,8 @@
                                        expected_skip,
                                        None, None, None, None, None,
                                        1,
-                                       0) # don't do a dry-run the output differs
+                                       0) # don't do a dry-run
+                                          # the output differs
 
   # Commit merge of foo onto C
   expected_output = svntest.wc.State(wc_dir, {
@@ -4240,15 +4244,18 @@
   svntest.actions.run_and_verify_svn(None, None, [], 'update', wc_dir)
 
   # Merge changes from rev 5 of B (to alpha) into copy_of_B.
+  # A_COPY/copy_of_B/F/E and A_COPY/copy_of_B/F/E1 both exist in the merge
+  # source at r5, so their empty mergeinfo should be updted with r5, which
+  # then should elide to A_COPY/copy_of_B leaving no mergeinfo on either.
   expected_output = wc.State(short_copy_of_B_path, {
     'F/E/alpha'   : Item(status='U '),
     })
   expected_status = wc.State(short_copy_of_B_path, {
     ''           : Item(status=' M', wc_rev=5),
-    'F/E'        : Item(status='  ', wc_rev=5),
+    'F/E'        : Item(status=' M', wc_rev=5),
     'F/E/alpha'  : Item(status='M ', wc_rev=5),
     'F/E/beta'   : Item(status='  ', wc_rev=5),
-    'F/E1'       : Item(status='  ', wc_rev=5),
+    'F/E1'       : Item(status=' M', wc_rev=5),
     'F/E1/alpha' : Item(status='  ', wc_rev=5),
     'F/E1/beta'  : Item(status='  ', wc_rev=5),
     'lambda'     : Item(status='  ', wc_rev=5),
@@ -4256,10 +4263,10 @@
     })
   expected_disk = wc.State('', {
     ''           : Item(props={SVN_PROP_MERGE_INFO : '/A/B:5'}),
-    'F/E'        : Item(props={SVN_PROP_MERGE_INFO : ''}),
+    'F/E'        : Item(),
     'F/E/alpha'  : Item(new_content_for_alpha),
     'F/E/beta'   : Item("This is the file 'beta'.\n"),
-    'F/E1'       : Item(props={SVN_PROP_MERGE_INFO : ''}),
+    'F/E1'       : Item(),
     'F/E1/alpha' : Item("This is the file 'alpha'.\n"),
     'F/E1/beta'  : Item("This is the file 'beta'.\n"),
     'F'          : Item(),
@@ -4286,7 +4293,9 @@
   # Commit the result of the merge, creating revision 6.
   expected_output = svntest.wc.State(copy_of_B_path, {
     ''          : Item(verb='Sending'),
+    'F/E'       : Item(verb='Sending'),
     'F/E/alpha' : Item(verb='Sending'),
+    'F/E1'      : Item(verb='Sending'),
     })
   svntest.actions.run_and_verify_commit(short_copy_of_B_path, expected_output,
                                         None, None,
@@ -4306,30 +4315,18 @@
   # Attempt to re-merge changes to alpha from rev 4.  Use the merge
   # info inherited from the grandparent (copy-of-B) of our merge
   # target (/A/copy-of-B/F/E) to avoid a repeated merge.
-  expected_output = wc.State(copy_of_B_F_E_path, { })
   expected_status = wc.State(short_copy_of_B_F_E_path, {
     ''      : Item(status='  ', wc_rev=6),
     'alpha' : Item(status='  ', wc_rev=6),
     'beta'  : Item(status='  ', wc_rev=6),
     })
-  expected_disk = wc.State('', {
-    ''        : Item(props={SVN_PROP_MERGE_INFO : ''}),
-    'alpha'   : Item(new_content_for_alpha),
-    'beta'    : Item("This is the file 'beta'.\n"),
-    })
-  expected_skip = wc.State(short_copy_of_B_F_E_path, { })
   os.chdir(svntest.main.work_dir)
-  svntest.actions.run_and_verify_merge(short_copy_of_B_F_E_path, '4', '5',
-                                       sbox.repo_url + '/A/B/F/E',
-                                       expected_output,
-                                       expected_disk,
-                                       expected_status,
-                                       expected_skip,
-                                       None,
-                                       None,
-                                       None,
-                                       None,
-                                       None, 1)
+  svntest.actions.run_and_verify_svn(None, [], [], 'merge', '-r4:5',
+                                    sbox.repo_url + '/A/B/F/E',
+                                     short_copy_of_B_F_E_path)
+  svntest.actions.run_and_verify_status(short_copy_of_B_F_E_path,
+                                        expected_status)
+  os.chdir(saved_cwd)
 
 def avoid_repeated_merge_on_subtree_with_merge_info(sbox):
   "use subtree's mergeinfo to avoid repeated merge"
@@ -4436,7 +4433,10 @@
   # understand.
   svntest.actions.run_and_verify_svn(None, None, [], 'update', wc_dir)
 
-  # Merge changes from rev 4:8 of A/B into A/copy_of_B.
+  # Merge changes from rev 4:8 of A/B into A/copy_of_B.  A/copy_of_B/F/E1
+  # has explicit mergeinfo and exists at r4 in the merge source, so it
+  # should be treated as a subtree with intersecting mergeinfo and its
+  # mergeinfo updated.
   expected_output = wc.State(short_copy_of_B_path, {
     'F/E/alpha' : Item(status='U ')
     })
@@ -4447,7 +4447,7 @@
     'F/E'        : Item(status=' M', wc_rev=8),
     'F/E/alpha'  : Item(status='M ', wc_rev=8),
     'F/E/beta'   : Item(status='  ', wc_rev=8),
-    'F/E1'       : Item(status='  ', wc_rev=8),
+    'F/E1'       : Item(status=' M', wc_rev=8),
     'F/E1/alpha' : Item(status='  ', wc_rev=8),
     'F/E1/beta'  : Item(status='  ', wc_rev=8),
     'lambda'     : Item(status='  ', wc_rev=8),
@@ -4459,7 +4459,8 @@
     'F/E/alpha'  : Item(new_content_for_alpha),
     'F/E/beta'   : Item("This is the file 'beta'.\n"),
     'F'          : Item(),
-    'F/E1'       : Item(props={SVN_PROP_MERGE_INFO : '/A/B/F/E:5'}),
+    'F/E1'       : Item(props={SVN_PROP_MERGE_INFO :
+                               '/A/B/F/E:5\n/A/B/F/E1:5-8\n'}),
     'F/E1/alpha' : Item(new_content_for_alpha1),
     'F/E1/beta'  : Item("This is the file 'beta'.\n"),
     'lambda'     : Item("This is the file 'lambda'.\n")
@@ -4594,7 +4595,8 @@
   copy_of_A_D_wc_rev = cur_rev
   svntest.actions.run_and_verify_svn(None,
                                      ['\n',
-                                      'Committed revision ' + str(cur_rev+1) + '.\n'],
+                                      'Committed revision ' + str(cur_rev+1) +
+                                      '.\n'],
                                      [],
                                      'mkdir', sbox.repo_url + '/A/D/umlaut',
                                      '-m', "log msg")
@@ -4715,7 +4717,7 @@
       dest_name + "/D/H/psi"   : Item(status='  ', wc_rev=rev),
       dest_name                : Item(status='  ', wc_rev=rev)})
     expected_disk.add({
-      dest_name : Item(props={SVN_PROP_MERGE_INFO : ''}),
+      dest_name                : Item(),
       dest_name + '/B'         : Item(),
       dest_name + '/B/lambda'  : Item("This is the file 'lambda'.\n"),
       dest_name + '/B/E'       : Item(),
@@ -5467,6 +5469,7 @@
   # Some paths we'll care about
   D_COPY_path = os.path.join(wc_dir, "A_COPY", "D")
   G_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "G")
+  rho_COPY_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "G", "rho_copy")
 
   # URL to URL copy A_COPY/D/G/rho to A_COPY/D/G/rho_copy
   svntest.actions.run_and_verify_svn(None, None, [], 'copy',
@@ -5478,8 +5481,7 @@
   expected_output = wc.State(wc_dir,
                              {'A_COPY/D/G/rho_copy' : Item(status='A ')})
   expected_disk.add({
-    'A_COPY/D/G/rho_copy' : Item("This is the file 'rho'.\n",
-                                 props={SVN_PROP_MERGE_INFO : ''})
+    'A_COPY/D/G/rho_copy' : Item("This is the file 'rho'.\n", props={})
     })
   expected_status.tweak(wc_rev=7)
   expected_status.add({'A_COPY/D/G/rho_copy' : Item(status='  ', wc_rev=7)})
@@ -5490,9 +5492,21 @@
                                         None, None, None,
                                         None, None, 1)
 
-  # Merge r4 into A_COPY/D/G.
+  # Merge r4 into A_COPY/D/G/rho_copy.
+  #
   # Search for the comment entitled "The Merge Kluge" elsewhere in
   # this file, to understand why we shorten and chdir() below.
+  os.chdir(svntest.main.work_dir)
+  short_rho_COPY_COPY_path = shorten_path_kludge(rho_COPY_COPY_path)
+  svntest.actions.run_and_verify_svn(None,
+                                     expected_merge_output([[4]],
+                                       'U    ' + short_rho_COPY_COPY_path +
+                                       '\n'),
+                                     [], 'merge', '-c4',
+                                     sbox.repo_url + '/A/D/G/rho',
+                                     short_rho_COPY_COPY_path)
+
+  # Merge r3:5 into A_COPY/D/G.
   short_G_COPY_path = shorten_path_kludge(G_COPY_path)
   expected_output = wc.State(short_G_COPY_path, {
     'rho' : Item(status='U ')
@@ -5501,21 +5515,19 @@
     ''         : Item(status=' M', wc_rev=7),
     'pi'       : Item(status='  ', wc_rev=7),
     'rho'      : Item(status='M ', wc_rev=7),
-    'rho_copy' : Item(status='  ', wc_rev=7),
+    'rho_copy' : Item(status='MM', wc_rev=7),
     'tau'      : Item(status='  ', wc_rev=7),
     })
   expected_disk = wc.State('', {
-    ''         : Item(props={SVN_PROP_MERGE_INFO : '/A/D/G:4'}),
+    ''         : Item(props={SVN_PROP_MERGE_INFO : '/A/D/G:4-5'}),
     'pi'       : Item("This is the file 'pi'.\n"),
     'rho'      : Item("New content"),
-    'rho_copy' : Item("This is the file 'rho'.\n",
-                      props={SVN_PROP_MERGE_INFO : ''}),
+    'rho_copy' : Item("New content",
+                      props={SVN_PROP_MERGE_INFO : '/A/D/G/rho:4'}),
     'tau'      : Item("This is the file 'tau'.\n"),
     })
   expected_skip = wc.State(short_G_COPY_path, { })
-
-  os.chdir(svntest.main.work_dir)
-  svntest.actions.run_and_verify_merge(short_G_COPY_path, '3', '4',
+  svntest.actions.run_and_verify_merge(short_G_COPY_path, '3', '5',
                                        sbox.repo_url + \
                                        '/A/D/G',
                                        expected_output,
@@ -5578,7 +5590,7 @@
   # Switch A_COPY/D/G to A/D/G.
   wc_disk.add({
     "A"  : Item(),
-    "A/D/G_COPY"     : Item(props={SVN_PROP_MERGE_INFO : ''}),
+    "A/D/G_COPY"     : Item(),
     "A/D/G_COPY/pi"  : Item("This is the file 'pi'.\n"),
     "A/D/G_COPY/rho" : Item("New *and* improved rho content"),
     "A/D/G_COPY/tau" : Item("This is the file 'tau'.\n"),
@@ -6015,8 +6027,7 @@
   wc_disk.tweak("A_COPY/D/H/omega",
                 contents="New content",
                 props={SVN_PROP_MERGE_INFO : '/A/D/H/omega:5-8'})
-  wc_disk.tweak("A_COPY_2",
-                props={SVN_PROP_MERGE_INFO : ''})
+  wc_disk.tweak("A_COPY_2", props={})
   svntest.actions.run_and_verify_switch(sbox.wc_dir, A_COPY_psi_path,
                                         sbox.repo_url + "/A_COPY/D/H/psi",
                                         expected_output, wc_disk, wc_status,
@@ -6161,166 +6172,111 @@
 
 # Test practical application of issue #2769 fix, empty rev range elision,
 # and elision to the repos.
-#
-# Set as XFail pending resolution of issue #2877 - see note
-# below (search for '2877')
-def empty_rev_range_mergeinfo(sbox):
-  "mergeinfo can have empty rev ranges"
+def empty_mergeinfo(sbox):
+  "mergeinfo can explicitly be empty"
 
-  # This test covers three areas:
+  # A bit o' history: The fix for issue #2769 originally permitted mergeinfo
+  # with empty range lists and as a result we permitted partial elision and
+  # had a whole slew of tests here for that.  But the fix of issue #3029 now
+  # prevents svn ps or svn merge from creating mergeinfo with paths mapped to
+  # empty ranges, only empty mergeinfo is allowed.  As a result this test now
+  # covers the following areas:
   #
-  # 1) The fix for issue #2769 which permits mergeinfo with empty range
-  #    lists.  This allows mergeinfo on a path to override mergeinfo the
-  #    path would otherwise inherit from an ancestor.  e.g. Merging -rX:Y
-  #    from URL/SOURCE to PATH then merging -rY:X from URL/SOURCE to PATH's
-  #    child PATH_C should result in mergeinfo for SOURCE with an empty
-  #    rangelist on PATH_C (or simply empty mergeinfo if PATH_C has no other
-  #    paths mapped to non-empty ranges).
+  #   A) Merging a set of revisions into a path, then reverse merging the
+  #      same set out of a subtree of path results in empty mergeinfo
+  #      (i.e. "") on the subtree.
   #
-  # 2) Elision of mergeinfo where some or all paths in either the child or
-  #    parent's mergeinfo map to empty revision ranges.  This takes many
-  #    forms -- Where C is the path to be elided, MC is it's mergeinfo, P is
-  #    C's nearest ancestor with mergeinfo, and MP is P's mergeinfo:
+  #   B) Empty mergeinfo elides to empty mergeinfo.
   #
-  #      a) In terms of elision, empty revision ranges are considered
-  #         equivalent to each other just like any other revision range.
-  #
-  #      b) If MC consists only of paths mapped to empty revision ranges and
-  #         none of these paths exist in MP, then MC fully elides.
-  #
-  #      c) If MC is equivalent to MP except for paths existing only in MC
-  #         which map to empty revision ranges, then MC fully elides.
-  #
-  #      d) If MC is equivalent to MP except for paths existing only in MP
-  #         which map to empty revision ranges, then MC fully elides.
-  #
-  #      e) Similar to d: MC contains some paths mapped to empty revision
-  #         ranges and these paths don't exist in MP, but the remaining info
-  #         in MC is *NOT* equivalent to MP, then MC partially elides, that is
-  #         only the paths mapped to empty ranges for paths unique to MC elide.
-  #
-  #      f) If MC consists *only* of paths mapped to empty revision ranges, and
-  #         has no ancestor with mergeinfo, MC still "elides".
-  #
-  # 3) A path with mergeinfo which has no working copy ancestor with
-  #    mergeinfo may still elide to an ancestor with equivalent mergeinfo
-  #    in the repository.
-
+  #   C) If a merge sets empty mergeinfo on its target and that target has
+  #      no ancestor in either the WC or the repository with explict
+  #      mergeinfo, then the target's mergeinfo is removed (a.k.a. elides
+  #      to nothing).
   sbox.build()
   wc_dir = sbox.wc_dir
-  wc_disk, wc_status = setup_branch(sbox, True)
+  wc_disk, wc_status = setup_branch(sbox)
 
   # Some paths we'll care about
-  A_path = os.path.join(wc_dir, "A")
   A_COPY_path = os.path.join(wc_dir, "A_COPY")
-  A_D_path = os.path.join(wc_dir, "A", "D")
-  A_D_H_path = os.path.join(wc_dir, "A", "D", "H")
-  A_COPY_beta_path = os.path.join(wc_dir, "A_COPY", "B", "E", "beta")
-  rho_path = os.path.join(wc_dir, "A", "D", "G", "rho")
-  psi_path = os.path.join(wc_dir, "A", "D", "H", "psi")
-  gamma_path = os.path.join(wc_dir, "A", "D", "gamma")
+  H_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H")
+  psi_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "H", "psi")
+  rho_COPY_path = os.path.join(wc_dir, "A_COPY", "D", "G", "rho")
 
-  # Make some changes in the branch to merge back to A:
-
-  # r3 - modify and commit A_COPY/D/H/psi
-  svntest.main.file_write(os.path.join(wc_dir, "A_COPY", "D", "H", "psi"),
-                          "New content")
-  expected_output = wc.State(wc_dir,
-                             {'A_COPY/D/H/psi' : Item(verb='Sending')})
-  wc_status.tweak('A_COPY/D/H/psi', wc_rev=3)
-  svntest.actions.run_and_verify_commit(wc_dir, expected_output,
-                                        wc_status, None, None, None,
-                                        None, None, wc_dir)
-  wc_disk.tweak('A_COPY/D/H/psi', contents="New content")
-
-  # r4 - modify and commit A_COPY/D/G/rho
-  svntest.main.file_write(os.path.join(wc_dir, "A_COPY", "D", "G", "rho"),
-                          "New content")
-  expected_output = wc.State(wc_dir,
-                             {'A_COPY/D/G/rho' : Item(verb='Sending')})
-  wc_status.tweak('A_COPY/D/G/rho', wc_rev=4)
-  svntest.actions.run_and_verify_commit(wc_dir, expected_output,
-                                        wc_status, None, None, None,
-                                        None, None, wc_dir)
-  wc_disk.tweak('A_COPY/D/G/rho', contents="New content")
-
-  # r5 - modify (add a prop) and commit A_COPY/B/E/beta
-  #svntest.main.file_write(os.path.join(wc_dir, "A_COPY", "B", "E", "beta"),
-  #                        "New content")
-  svntest.actions.run_and_verify_svn(None,
-                                     ["property 'prop:name' set on '" +
-                                      A_COPY_beta_path + "'\n"], [], 'ps',
-                                     'prop:name', 'propval',
-                                     A_COPY_beta_path)
-  expected_output = wc.State(wc_dir,
-                             {'A_COPY/B/E/beta' : Item(verb='Sending')})
-  wc_status.tweak('A_COPY/B/E/beta', wc_rev=5)
-  svntest.actions.run_and_verify_commit(wc_dir, expected_output,
-                                        wc_status, None, None, None,
-                                        None, None, wc_dir)
-  wc_disk.tweak('A_COPY/B/E/beta', props={'prop:name' : 'propval'})
+  # Test area A -- Merge r2:4 into A_COPY then reverse merge 4:2 to
+  # A_COPY/D/G.  A_COPY/D/G should end up with empty mergeinfo to
+  # override that of A_COPY.
+  #
+  # Search for the comment entitled "The Merge Kluge" elsewhere in
+  # this file, to understand why we shorten and chdir() below.
+  short_A_COPY_path = shorten_path_kludge(A_COPY_path)
+  expected_output = wc.State(short_A_COPY_path, {
+    'D/H/psi'   : Item(status='U '),
+    'D/G/rho'   : Item(status='U '),
+    })
+  expected_status = wc.State(short_A_COPY_path, {
+    ''          : Item(status=' M', wc_rev=2),
+    'B'         : Item(status='  ', wc_rev=2),
+    'mu'        : Item(status='  ', wc_rev=2),
+    'B/E'       : Item(status='  ', wc_rev=2),
+    'B/E/alpha' : Item(status='  ', wc_rev=2),
+    'B/E/beta'  : Item(status='  ', wc_rev=2),
+    'B/lambda'  : Item(status='  ', wc_rev=2),
+    'B/F'       : Item(status='  ', wc_rev=2),
+    'C'         : Item(status='  ', wc_rev=2),
+    'D'         : Item(status='  ', wc_rev=2),
+    'D/G'       : Item(status='  ', wc_rev=2),
+    'D/G/pi'    : Item(status='  ', wc_rev=2),
+    'D/G/rho'   : Item(status='M ', wc_rev=2),
+    'D/G/tau'   : Item(status='  ', wc_rev=2),
+    'D/gamma'   : Item(status='  ', wc_rev=2),
+    'D/H'       : Item(status='  ', wc_rev=2),
+    'D/H/chi'   : Item(status='  ', wc_rev=2),
+    'D/H/psi'   : Item(status='M ', wc_rev=2),
+    'D/H/omega' : Item(status='  ', wc_rev=2),
+    })
+  expected_disk = wc.State('', {
+    ''          : Item(props={SVN_PROP_MERGE_INFO : '/A:3-4'}),
+    'B'         : Item(),
+    'mu'        : Item("This is the file 'mu'.\n"),
+    'B/E'       : Item(),
+    'B/E/alpha' : Item("This is the file 'alpha'.\n"),
+    'B/E/beta'  : Item("This is the file 'beta'.\n"),
+    'B/lambda'  : Item("This is the file 'lambda'.\n"),
+    'B/F'       : Item(),
+    'C'         : Item(),
+    'D'         : Item(),
+    'D/G'       : Item(),
+    'D/G/pi'    : Item("This is the file 'pi'.\n"),
+    'D/G/rho'   : Item("New content"),
+    'D/G/tau'   : Item("This is the file 'tau'.\n"),
+    'D/gamma'   : Item("This is the file 'gamma'.\n"),
+    'D/H'       : Item(),
+    'D/H/chi'   : Item("This is the file 'chi'.\n"),
+    'D/H/psi'   : Item("New content"),
+    'D/H/omega' : Item("This is the file 'omega'.\n"),
+    })
+  expected_skip = wc.State(short_A_COPY_path, { })
   saved_cwd = os.getcwd()
-
-  # Merge r2:4 into A/D
-  # Defined as an internal method since we'll be doing this twice.
-  short_D_path = shorten_path_kludge(A_D_path)
-  def merge_r24_into_A_D():
-    # Search for the comment entitled "The Merge Kluge" elsewhere in
-    # this file, to understand why we shorten and chdir() below.
-    expected_output = wc.State(short_D_path, {
-      'H/psi' : Item(status='U '),
-      'G/rho' : Item(status='U '),
-      })
-    expected_status = wc.State(short_D_path, {
-      ''        : Item(status=' M', wc_rev=1),
-      'G'       : Item(status='  ', wc_rev=1),
-      'G/pi'    : Item(status='  ', wc_rev=1),
-      'G/rho'   : Item(status='M ', wc_rev=1),
-      'G/tau'   : Item(status='  ', wc_rev=1),
-      'H'       : Item(status='  ', wc_rev=1),
-      'H/chi'   : Item(status='  ', wc_rev=1),
-      'H/psi'   : Item(status='M ', wc_rev=1),
-      'H/omega' : Item(status='  ', wc_rev=1),
-      'gamma'   : Item(status='  ', wc_rev=1),
-      })
-    expected_disk = wc.State('', {
-      ''        : Item(props={SVN_PROP_MERGE_INFO : '/A_COPY/D:3-4'}),
-      'G'       : Item(),
-      'G/pi'    : Item("This is the file 'pi'.\n"),
-      'G/rho'   : Item("New content"),
-      'G/tau'   : Item("This is the file 'tau'.\n"),
-      'H'       : Item(),
-      'H/chi'   : Item("This is the file 'chi'.\n"),
-      'H/psi'   : Item("New content"),
-      'H/omega' : Item("This is the file 'omega'.\n"),
-      'gamma'   : Item("This is the file 'gamma'.\n")
-      })
-    expected_skip = wc.State(short_D_path, { })
-
-    os.chdir(svntest.main.work_dir)
-    svntest.actions.run_and_verify_merge(short_D_path, '2', '4',
-                                         sbox.repo_url + '/A_COPY/D',
-                                         expected_output,
-                                         expected_disk,
-                                         expected_status,
-                                         expected_skip,
-                                         None, None, None, None,
-                                         None, 1)
-    os.chdir(saved_cwd)
-
-  merge_r24_into_A_D()
-
-  # Merge r4:2 into A/D/H -- Test Area 1, 2a (see comment at top of test).
-  # A/D/H should get empty mergeinfo.
-  short_H_path = shorten_path_kludge(A_D_H_path)
-  expected_output = wc.State(short_H_path, {
+  os.chdir(svntest.main.work_dir)
+  svntest.actions.run_and_verify_merge(short_A_COPY_path, '2', '4',
+                                       sbox.repo_url + \
+                                       '/A',
+                                       expected_output,
+                                       expected_disk,
+                                       expected_status,
+                                       expected_skip,
+                                       None, None, None, None,
+                                       None, 1)
+  # Now do the reverse merge into the subtree.
+  short_H_COPY_path = shorten_path_kludge(H_COPY_path)
+  expected_output = wc.State(short_H_COPY_path, {
     'psi' : Item(status='G '),
     })
-  expected_status = wc.State(short_H_path, {
-    ''      : Item(status=' M', wc_rev=1),
-    'chi'   : Item(status='  ', wc_rev=1),
-    'psi'   : Item(status='  ', wc_rev=1),
-    'omega' : Item(status='  ', wc_rev=1),
+  expected_status = wc.State(short_H_COPY_path, {
+    ''      : Item(status=' M', wc_rev=2),
+    'chi'   : Item(status='  ', wc_rev=2),
+    'psi'   : Item(status='  ', wc_rev=2),
+    'omega' : Item(status='  ', wc_rev=2),
     })
   expected_disk = wc.State('', {
     ''      : Item(props={SVN_PROP_MERGE_INFO : ''}),
@@ -6328,323 +6284,36 @@
     'psi'   : Item("This is the file 'psi'.\n"),
     'omega' : Item("This is the file 'omega'.\n"),
     })
-  expected_skip = wc.State(short_H_path, { })
-
-  os.chdir(svntest.main.work_dir)
-  svntest.actions.run_and_verify_merge(short_H_path, '4', '2',
-                                       sbox.repo_url + '/A_COPY/D/H',
+  expected_skip = wc.State(short_H_COPY_path, { })
+  svntest.actions.run_and_verify_merge(short_H_COPY_path, '4', '2',
+                                       sbox.repo_url + \
+                                       '/A/D/H',
                                        expected_output,
                                        expected_disk,
                                        expected_status,
                                        expected_skip,
                                        None, None, None, None,
                                        None, 1)
-  os.chdir(saved_cwd)
 
-  # Reverse merge r4:2 from A_COPY into A -- Test Area 1, 2a, 2f.
-  # This should effectively revert all local mods.  Pre-eilsion A, A/D, and
-  # A/D/H all have empty rev range mergeinfo.  A/D/H elides to A/D, which in
-  # turn elides to A.  And since A wisn't overriding any ancestor path's merge
-  # info, it too "elides".
-  short_A_path = shorten_path_kludge(A_path)
-
-  os.chdir(svntest.main.work_dir)
-  # Since this merge returns us to the same state returned by
-  # setup_branch() there is no need for run_and_verify_merge().
-  # run_and_verify_svn('merge') and ran_and_verify_status() covers
-  # everything.
-  #
-  # This is broken pending resolution of issue #2877 - The empty mergeinfo
-  # on 'A/D/H' doesn't get considered as a subtree with intersecting
-  # mergeinfo, even though it should.
-  svntest.actions.run_and_verify_svn(None,
-                                     expected_merge_output([[4]],
-                                       ['G    ' +
-                                        os.path.join(short_A_path, "D", "G",
-                                                     "rho") + '\n',
-                                        svntest.main.merge_notify_line(4, 3)]),
+  # Test areas B and C -- Reverse merge r3 into A_COPY, this would result in
+  # empty mergeinfo on A_COPY and A_COPY/D/H, but the empty mergeinfo on the
+  # latter elides to the former.  And then the empty mergeinfo on A_COPY,
+  # which has no parent with explicit mergeinfo to override (in either the WC
+  # or the repos) itself elides.  This leaves the WC in the same unmodified
+  # state as after the call to setup_branch().
+  short_rho_COPY_path = shorten_path_kludge(rho_COPY_path)
+  expected_output = expected_merge_output(
+    [[4,3]], 'G    ' + short_rho_COPY_path + '\n')
+  svntest.actions.run_and_verify_svn(None, expected_output,
                                      [], 'merge', '-r4:2',
-                                     sbox.repo_url + '/A_COPY',
-                                     short_A_path)
+                                     sbox.repo_url + '/A',
+                                     short_A_COPY_path)
   os.chdir(saved_cwd)
-
-  # Use wc_status from setup_branch()
   svntest.actions.run_and_verify_status(wc_dir, wc_status)
-
-  # Check that mergeinfo elides if the only difference between a child and
-  # parent's mergeinfo are paths that exist only in the child and are mapped
-  # to empty revision ranges.
-  #
-  # Manually set some mergeinfo on A/D.
-  svntest.actions.run_and_verify_svn(None,
-                                     ["property '" + SVN_PROP_MERGE_INFO +
-                                      "' set on '" + A_D_path + "'\n"], [],
-                                     'ps', SVN_PROP_MERGE_INFO,
-                                     '/A_COPY/B:4', A_D_path)
-
-  # Merge r2:3 into A/D/H
-  #
-  # A/D/H inherits the r4 mergeinfo set above on A/D and also gets merge
-  # info for r3.
-  expected_output = wc.State(short_H_path, {
-    'psi' : Item(status='U '),
-    })
-  expected_status.tweak('psi', status='M ')
-  expected_disk.tweak('', props={SVN_PROP_MERGE_INFO :
-                          '/A_COPY/B/H:4\n/A_COPY/D/H:3\n'})
-  expected_disk.tweak('psi', contents="New content")
-
-  os.chdir(svntest.main.work_dir)
-  svntest.actions.run_and_verify_merge(short_H_path, '2', '3',
-                                       sbox.repo_url + '/A_COPY/D/H',
-                                       expected_output,
-                                       expected_disk,
-                                       expected_status,
-                                       expected_skip,
-                                       None, None, None, None,
-                                       None, 1)
-  os.chdir(saved_cwd)
-
-  # Reverse the previous merge -- Test Area 2c.
-  #
-  # Effectively this leaves A/D/H with empty revision range mergeinfo from
-  # A_COPY/D/H and the inherited mergeinfo from A_COPY/B/H.  Since the only
-  # difference between the mergeinfo on A/D/H and A/D is the empty range
-  # mergeinfo for A_COPY/D/H, A/D/H's mergeinfo should elide to A/D.
-  os.chdir(svntest.main.work_dir)
-  svntest.actions.run_and_verify_svn(None,
-                                     expected_merge_output([[-3]], 'G    ' +
-                                       os.path.join(short_H_path, "psi") +
-                                       '\n'),
-                                     [], 'merge', '-r3:2',
-                                     sbox.repo_url + '/A_COPY/D/H',
-                                     short_H_path)
-  os.chdir(saved_cwd)
-
-  # Use wc_status from setup_branch(), the manually set mergeinfo on A/D
-  # and the is the only mod we expect to see.
-  wc_status.tweak('A/D', status=' M')
-  svntest.actions.run_and_verify_status(wc_dir, wc_status)
-  expected = svntest.verify.UnorderedOutput(
-    ["Properties on '" + A_D_path + "':\n",
-     "  " + SVN_PROP_MERGE_INFO + " : /A_COPY/B:4\n",
-     "Properties on '" + A_COPY_path + "':\n",
-     "  " + SVN_PROP_MERGE_INFO + " : \n",
-     "Properties on '" + A_COPY_beta_path + "':\n",
-     "  prop:name : propval\n"])
-  svntest.actions.run_and_verify_svn(None, expected, [], 'pl', '-vR', wc_dir)
-
-  # Revert all local changes
-  svntest.actions.run_and_verify_svn(None, None, [],
-                                     'revert', '--recursive', wc_dir)
-  wc_status.tweak('A/D', status='  ')
-  svntest.actions.run_and_verify_status(wc_dir, wc_status)
-
-  # Merge r2:4 into A/D/H again and commit it this time.
-  merge_r24_into_A_D()
-  wc_status.tweak('A/D', 'A/D/H/psi', 'A/D/G/rho', wc_rev=6)
-  wc_disk.tweak('A', props={SVN_PROP_MERGE_INFO : '/A_COPY/D:3-4'})
-  expected_output = wc.State(wc_dir, {
-    'A/D'       : Item(verb='Sending'),
-    'A/D/G/rho' : Item(verb='Sending'),
-    'A/D/H/psi' : Item(verb='Sending')})
-  svntest.actions.run_and_verify_commit(wc_dir,
-                                        expected_output,
-                                        wc_status,
-                                        None,
-                                        None, None, None, None,
-                                        wc_dir)
-
-  # Set some fictional mergeinfo on A
-  svntest.actions.run_and_verify_svn(None,
-                                     ["property '" + SVN_PROP_MERGE_INFO +
-                                      "' set on '" + A_path + "'\n"],
-                                     [], 'ps', SVN_PROP_MERGE_INFO, '/Z:3',
-                                     A_path)
-
-  # Merge r4:2 into A/D -- Test Area 2b.
-  # This leaves A/D with mergeinfo mapped to empty revision ranges only and
-  # it's nearest ancestor A with mergeinfo for a disjoint set of paths.  So
-  # the mergeinfo should elide.
-  os.chdir(svntest.main.work_dir)
-  expected = svntest.verify.UnorderedRegexOutput(
-    expected_merge_output([[4]],
-      ["U    " + os.path.join(short_D_path, "G", "rho") + "\n",
-       "U    " + os.path.join(short_D_path, "H", "psi") + "\n"]),
-    match_all=False)
-  svntest.actions.run_and_verify_svn(None, expected, [], 'merge',
-                                     '-r4:2', sbox.repo_url + '/A_COPY/D',
-                                     short_D_path)
-  os.chdir(saved_cwd)
-
-  svntest.actions.run_and_verify_svn(None, [], [], 'pl', '-vR', A_D_path)
-
-  # Revert the last merge.
-  expected = svntest.verify.UnorderedOutput(
-    ["Reverted '" + A_D_path + "'\n",
-     "Reverted '" + rho_path + "'\n",
-     "Reverted '" + psi_path + "'\n",
-     ])
-  svntest.actions.run_and_verify_svn(None, expected, [], 'revert', '-R',
-                                     A_D_path)
-
-  # Set some fictional mergeinfo on A/D/gamma
-  propval = "/A_COPY:3\n/Z:"
-  propval_file = os.path.abspath(os.path.join(sbox.repo_dir, 'prop-val'))
-  svntest.main.file_write(propval_file, propval)
-  svntest.actions.run_and_verify_svn(None,
-                                     ["property '" + SVN_PROP_MERGE_INFO +
-                                      "' set on '" + A_path + "'\n"],
-                                     [], 'ps', SVN_PROP_MERGE_INFO,
-                                     '-F', propval_file, A_path)
-
-  # Merge -r5:4 from A_COPY/D into A/D -- Test Area 2d.
-  # This leaves mergeinfo on A/D that differs from the mergeinfo on A
-  # only by a path (Z) in the latter mapped to an empty revision range.
-  # So full elision should occur.
-  short_D_path = shorten_path_kludge(A_D_path)
-  os.chdir(svntest.main.work_dir)
-  svntest.actions.run_and_verify_svn(None,
-                                     expected_merge_output([[-4]],
-                                       'U    ' +
-                                       os.path.join(short_D_path, "G", "rho") +
-                                       '\n'),
-                                     [], 'merge', '-c-4',
-                                     sbox.repo_url + '/A_COPY/D',
-                                     short_D_path)
-  os.chdir(saved_cwd)
-  svntest.actions.run_and_verify_svn(None,[], [], 'pl', '-vR', A_D_path)
-
-  # Revert local changes.
-  expected = svntest.verify.UnorderedOutput(
-    ["Reverted '" + A_D_path + "'\n",
-     "Reverted '" + rho_path + "'\n",
-     "Reverted '" + A_path + "'\n",
-     ])
-  svntest.actions.run_and_verify_svn(None, expected, [], 'revert', '-R',
-                                     wc_dir)
-
-  # Create a second disconnected WC.
-  other_wc = sbox.add_wc_path('H')
-  svntest.actions.duplicate_dir(A_D_H_path, other_wc)
-  expected_output = wc.State(other_wc, {})
-  expected_status = wc.State(other_wc, {
-    ''      : Item(status='  ', wc_rev=6),
-    'chi'   : Item(status='  ', wc_rev=6),
-    'psi'   : Item(status='  ', wc_rev=6),
-    'omega' : Item(status='  ', wc_rev=6),
-    })
-  expected_disk = wc.State('', {
-    ''      : Item(),
-    'chi'   : Item("This is the file 'chi'.\n"),
-    'psi'   : Item("New content"),
-    'omega' : Item("This is the file 'omega'.\n"),
-    })
-  svntest.actions.run_and_verify_svn(None, ['At revision 6.\n'], [],
-                                     'update', other_wc)
-
-  # Merge r5 from /A_COPY/B/E/beta into the second WC's omega.
-  other_omega_path = os.path.join(other_wc, "omega")
-  short_other_omega_path = shorten_path_kludge(other_omega_path)
-  def merge_r5_into_Other_A_D_H_omega():
-    # omega gets the mergeinfo from the merge itself, and the inherited
-    # mergeinfo from A/D in the repos.
-    os.chdir(svntest.main.work_dir)
-    svntest.actions.run_and_verify_svn(None,
-                                       expected_merge_output([[5]],
-                                         ' U   ' + short_other_omega_path +
-                                         '\n'), [], 'merge', '-c5',
-                                       sbox.repo_url + '/A_COPY/B/E/beta',
-                                       short_other_omega_path)
-    os.chdir(saved_cwd)
-
-    # Check omega's status and props.
-    expected_status = wc.State(other_wc, {
-      ''      : Item(status='  ', wc_rev=6),
-      'chi'   : Item(status='  ', wc_rev=6),
-      'psi'   : Item(status='  ', wc_rev=6),
-      'omega' : Item(status=' M', wc_rev=6),
-      })
-    svntest.actions.run_and_verify_status(other_wc, expected_status)
-
-    # Check properties with multiline values in eol sensitive manner.
-    svntest.actions.check_prop(SVN_PROP_MERGE_INFO, other_omega_path,
-                               ['/A_COPY/B/E/beta:5' + os.linesep,
-                                '/A_COPY/D/H/omega:3-4'])
-    svntest.actions.check_prop('prop:name', other_omega_path, ['propval'])
-
-  merge_r5_into_Other_A_D_H_omega()
-
-  # Reverse the previous merge -- Test Area 2c, 3.
-  # This would leave omega with empty rev range info for path
-  # 'A_COPY/B/E/beta' and otherwise elidable (to the repos) mergeinfo for
-  # path 'A_COPY/D/H/omega', so all the mergeinfo elides.
-  os.chdir(svntest.main.work_dir)
-  svntest.actions.run_and_verify_svn(None,
-                                     expected_merge_output([[-5]],
-                                       ' G   ' + short_other_omega_path +
-                                       '\n'), [], 'merge', '-c-5',
-                                     sbox.repo_url + '/A_COPY/B/E/beta',
-                                     short_other_omega_path)
-  os.chdir(saved_cwd)
-
-  # Check omega's status (no need to check props since file is back to its
-  # pristine state and status checks this).
-  expected_status.tweak('omega', status='  ')
-  svntest.actions.run_and_verify_status(other_wc, expected_status)
-
-  # Once again, merge r5 from /A_COPY/B/E/beta into the second WC's omega.
-  merge_r5_into_Other_A_D_H_omega()
-
-  # Merge r4:3 from A_COPY/D/H/omega into the second WC's omega.
-  # Use --record-only to setup the mergeinfo we want since this is a
-  # no-op merge.
-  os.chdir(svntest.main.work_dir)
-  svntest.actions.run_and_verify_svn(None, [], [],
-                                     'merge', '-c-4',  '--record-only',
-                                     sbox.repo_url + '/A_COPY/D/H/omega',
-                                     short_other_omega_path)
-  os.chdir(saved_cwd)
-
-  # Check omega's status and props.
-  expected_status = wc.State(other_wc, {
-    ''      : Item(status='  ', wc_rev=6),
-    'chi'   : Item(status='  ', wc_rev=6),
-    'psi'   : Item(status='  ', wc_rev=6),
-    'omega' : Item(status=' M', wc_rev=6),
-    })
-  svntest.actions.run_and_verify_status(other_wc, expected_status)
-
-  # Check properties with multiline values in eol sensitive manner.
-  svntest.actions.check_prop(SVN_PROP_MERGE_INFO, other_omega_path,
-                             ['/A_COPY/B/E/beta:5' + os.linesep,
-                              '/A_COPY/D/H/omega:3'])
-  svntest.actions.check_prop('prop:name', other_omega_path, ['propval'])
-
-  # Reverse the previous merge of r5 -- Test Area 2e.
-  # This would leave omega with empty rev range info for path
-  # 'A_COPY/B/E/beta' and unelidable mergeinfo for path 'A_COPY/D/H/omega',
-  # so we expect partial elision only of the mergeinfo for 'A_COPY/B/E/beta'
-  # since that path doesn't exist in A/D/H/omeaga's nearest ancestor.
-  os.chdir(svntest.main.work_dir)
-  svntest.actions.run_and_verify_svn(None,
-                                     expected_merge_output([[-5]],
-                                      ' G   ' + short_other_omega_path +
-                                      '\n'), [], 'merge', '-c-5',
-                                     sbox.repo_url + '/A_COPY/B/E/beta',
-                                     short_other_omega_path)
-  os.chdir(saved_cwd)
-
-  # Check omega's status and props.
-  expected_status.tweak('omega', status=' M')
-  svntest.actions.run_and_verify_status(other_wc, expected_status)
-  svntest.actions.run_and_verify_svn(None,
-                                     ["Properties on '" + other_omega_path +
-                                      "':\n",
-                                      '  ' + SVN_PROP_MERGE_INFO + ' : ' +
-                                      '/A_COPY/D/H/omega:3\n'], [],
-                                     'pl', '-vR', other_omega_path)
-
+  # Check that A_COPY's mergeinfo is gone.
+  svntest.actions.run_and_verify_svn(None, [], [], 'pg', 'svn:mergeinfo',
+                                     A_COPY_path)
+  
 def prop_add_to_child_with_mergeinfo(sbox):
   "merge adding prop to child of merge target works"
 
@@ -7912,7 +7581,6 @@
     'mu' : Item(status='A '),
     'C'  : Item(status='A '),
     'D'  : Item(status='A '),
-    ''   : Item(status=' U'),
     })
   expected_disk = wc.State('', {
     'B'  : Item(),
@@ -7976,7 +7644,6 @@
   files_dir = sbox.add_wc_path('files')
   expected_output = wc.State(files_dir, {
     'mu' : Item(status='A '),
-    ''   : Item(status=' U'),
     })
   expected_disk = wc.State('', {
     'mu' : Item("This is the file 'mu'.\n"),
@@ -8022,9 +7689,7 @@
 
   # Do an --empty checkout of A_COPY
   empty_dir = sbox.add_wc_path('empty')
-  expected_output = wc.State(empty_dir, {
-    ''   : Item(status=' U'),
-    })
+  expected_output = wc.State(empty_dir, {})
   expected_disk = wc.State('', {})
   svntest.actions.run_and_verify_checkout(sbox.repo_url + "/A_COPY",
                                           empty_dir,
@@ -8155,7 +7820,6 @@
   # because /A_MOVED has renames in its history between the boundaries
   # of the requested merge range.
   expected_output = wc.State(short_A_COPY, {
-    ''   : Item(status=' G'),
     'mu' : Item(status='G '), # mu gets touched twice
     })
   expected_status = wc.State(short_A_COPY, {
@@ -8389,7 +8053,7 @@
     'mu' : Item(status='G '), # merged reversion of text changes
     })
 
-  expected_status.tweak('', status=' M') # elision removes svn:mergeinfo
+  expected_status.tweak('', status='  ')
   expected_status.tweak('mu', status='  ')
   expected_disk.tweak('', props={})
   expected_disk.remove('')
@@ -8439,7 +8103,7 @@
     ''   : Item(status=' G'),
     'mu' : Item(status='G '),
     })
-  expected_status.tweak('', status=' M') # elision removes svn:mergeinfo
+  expected_status.tweak('', status='  ')
   expected_status.tweak('mu', status='M ')
   expected_disk.remove('')
   expected_disk.tweak('mu', contents=tweaked_17th_line_2)
@@ -8510,7 +8174,7 @@
   # boundaries of the requested merge range.
   expected_output = expected_merge_output([[2,3],[4,5]],
                                           ['U    %s\n' % (mu_COPY_path),
-                                           'GG   %s\n' % (mu_COPY_path)])
+                                           'G    %s\n' % (mu_COPY_path)])
   svntest.actions.run_and_verify_svn(None, expected_output,
                                      [], 'merge', '-r', '1:5',
                                      mu_MOVED_url,
@@ -8873,8 +8537,8 @@
                                      sbox.repo_url + '/A',
                                      short_A_COPY_path)
   os.chdir(saved_cwd)
-  expected_status = wc.State(A_COPY_path,  # A_COPY's mergeinfo elides away
-                             {''          : Item(status=' M', wc_rev=6),
+  expected_status = wc.State(A_COPY_path,
+                             {''          : Item(status='  ', wc_rev=6),
                               'B'         : Item(status='  ', wc_rev=6),
                               'B/lambda'  : Item(status='  ', wc_rev=6),
                               'B/E'       : Item(status='  ', wc_rev=6),
@@ -9386,7 +9050,8 @@
   expected_output = wc.State(short_A_COPY_B, {
     'lambda' : Item(status='U '),
     })
-  expected_disk.tweak('lambda', contents="This is the file 'lambda' modified.\n")
+  expected_disk.tweak('lambda',
+                      contents="This is the file 'lambda' modified.\n")
   expected_status.tweak('lambda', status='M ')
   svntest.actions.run_and_verify_merge(short_A_COPY_B, 1, 3,
                                        A_B_url,
@@ -9491,12 +9156,8 @@
                                        None, None, None, None, None, 1, 1)
   os.chdir(saved_cwd)
 
-# Test for issue #2877: 'do subtree merge only if subtree has
-# a explicit mergeinfo set and has a merge source as that of
-# current merge source'
-#
-# Marked as XFail until latest concerns with reopened
-# issue #2877 are addressed.
+# Test for part of issue #2877: 'do subtree merge only if subtree has
+# explicit mergeinfo set and exists in the merge source'
 def merge_source_normalization_and_subtree_merges(sbox):
   "normalized mergeinfo is recorded on subtrees"
 
@@ -9563,7 +9224,8 @@
   #
   # A_MOVED/D/G doesn't exist at r3:4, it's still A/D/G,
   # so the merge source normalization logic should set
-  # mergeinfo of '/A/D/G:4' on A_COPY/D/G, *not* 'A_MOVED/D/G:4'.
+  # mergeinfo of '/A/D/G:4' on A_COPY/D/G, *not* 'A_MOVED/D/G:4',
+  # see issue #2953.
   short_G_COPY_path = shorten_path_kludge(G_COPY_path)
   expected_output = wc.State(short_G_COPY_path, {
     'rho' : Item(status='U ')
@@ -9596,7 +9258,8 @@
   # Merge -c8 URL/A_MOVED/D A_COPY/D.
   #
   # The merge target A_COPY/D and the subtree at A_COPY/D/G
-  # should both have their mergeinfo updated with r8.
+  # should both have their mergeinfo updated with r8
+  # from A_MOVED_D, see reopened issue #2877.
   short_D_COPY_path = shorten_path_kludge(D_COPY_path)
   expected_output = wc.State(short_D_COPY_path, {
     'G/tau' : Item(status='U '),
@@ -9615,7 +9278,8 @@
     })
   expected_disk = wc.State('', {
     ''        : Item(props={SVN_PROP_MERGE_INFO : '/A_MOVED/D:8'}),
-    'G'       : Item(props={SVN_PROP_MERGE_INFO : '/A/D/G:4\n/A_MOVED/D/G:8\n'}),
+    'G'       : Item(props={SVN_PROP_MERGE_INFO :
+                            '/A/D/G:4\n/A_MOVED/D/G:8\n'}),
     'G/pi'    : Item("This is the file 'pi'.\n"),
     'G/rho'   : Item("New content"),
     'G/tau'   : Item("New content"),
@@ -9698,8 +9362,8 @@
               SkipUnless(merge_to_path_with_switched_children,
                          server_has_mergeinfo),
               merge_with_implicit_target_file,
-              XFail(SkipUnless(empty_rev_range_mergeinfo,
-                               server_has_mergeinfo)),
+              SkipUnless(empty_mergeinfo,
+                         server_has_mergeinfo),
               prop_add_to_child_with_mergeinfo,
               diff_repos_does_not_update_mergeinfo,
               XFail(avoid_reflected_revs),
@@ -9723,7 +9387,7 @@
               self_reverse_merge,
               ignore_ancestry_and_mergeinfo,
               merge_from_renamed_branch_fails_while_avoiding_repeat_merge,
-              XFail(merge_source_normalization_and_subtree_merges),
+              merge_source_normalization_and_subtree_merges,
              ]
 
 if __name__ == '__main__':
diff --git a/subversion/tests/cmdline/mergeinfo_tests.py b/subversion/tests/cmdline/mergeinfo_tests.py
index ef8569d..85be008 100755
--- a/subversion/tests/cmdline/mergeinfo_tests.py
+++ b/subversion/tests/cmdline/mergeinfo_tests.py
@@ -81,7 +81,9 @@
   
   # Make a copy, and dummy up some mergeinfo.
   mergeinfo = '/A/B:1\n/A/D/G:1\n'
-  svntest.main.run_svn(None, "pset", SVN_PROP_MERGE_INFO, mergeinfo, H_path)
+  propval_path = os.path.join(wc_dir, 'propval.tmp')
+  svntest.actions.set_prop(None, SVN_PROP_MERGE_INFO, mergeinfo, H_path,
+                           propval_path)
   svntest.main.run_svn(None, "cp", H_path, H2_path)
   svntest.main.run_svn(None, "ci", "-m", "r2", wc_dir)
 
diff --git a/subversion/tests/cmdline/revert_tests.py b/subversion/tests/cmdline/revert_tests.py
index 6bb7815..09bb03e 100755
--- a/subversion/tests/cmdline/revert_tests.py
+++ b/subversion/tests/cmdline/revert_tests.py
@@ -104,8 +104,11 @@
                                      'cp', pi_src, rho_path)
 
   # Verify both content and props have been copied
-  props = { 'phony-prop' : '*',
-            'svn:mergeinfo' : '' }
+  if wc_copy:
+    props = { 'phony-prop' : '*',
+              'svn:mergeinfo' : '' }
+  else:
+    props = { 'phony-prop' : '*' }
 
   expected_disk.tweak('A/D/G/rho',
                       contents="This is the file 'pi'.\n",
diff --git a/subversion/tests/cmdline/svnsync_tests.py b/subversion/tests/cmdline/svnsync_tests.py
index 6b22f7e..2b27efc 100755
--- a/subversion/tests/cmdline/svnsync_tests.py
+++ b/subversion/tests/cmdline/svnsync_tests.py
@@ -637,13 +637,17 @@
   "test copying revs with no svn:author revprops"
   run_test(sbox, "no-author.dump")
 
+def copy_revprops(sbox):
+  "test copying revprops other than svn:*"
+  run_test(sbox, "revprops.dump")
+
 def only_trunk(sbox):
   "test syncing subdirectories"
   run_test(sbox, "svnsync-trunk-only.dump", "/trunk", 
            "svnsync-trunk-only.expected.dump")
 
 def only_trunk_A_with_changes(sbox):
-  "test syncing subdirectories"
+  "test syncing subdirectories with changes on root"
   run_test(sbox, "svnsync-trunk-A-changes.dump", "/trunk/A", 
            "svnsync-trunk-A-changes.expected.dump")
 
@@ -674,6 +678,7 @@
                    svntest.main.is_ra_type_file),
               url_encoding,
               no_author,
+              copy_revprops,
               only_trunk,
               only_trunk_A_with_changes,
              ]
diff --git a/subversion/tests/cmdline/svnsync_tests_data/revprops.dump b/subversion/tests/cmdline/svnsync_tests_data/revprops.dump
new file mode 100644
index 0000000..eac8d2d
--- /dev/null
+++ b/subversion/tests/cmdline/svnsync_tests_data/revprops.dump
@@ -0,0 +1,324 @@
+SVN-fs-dump-format-version: 2
+
+UUID: 728f5e1e-a57c-4dd4-8b4f-ca752f5178f3
+
+Revision-number: 0
+Prop-content-length: 75
+Content-length: 75
+
+K 3
+foo
+V 6
+r0-bar
+K 8
+svn:date
+V 27
+2007-12-07T20:52:50.286894Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 132
+Content-length: 132
+
+K 7
+svn:log
+V 0
+
+K 10
+svn:author
+V 3
+lgo
+K 13
+svn:mergeinfo
+V 10
+/trunk:1:2
+K 8
+svn:date
+V 27
+2007-12-07T20:53:40.322712Z
+PROPS-END
+
+Node-path: test.txt
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 25
+Text-content-md5: 9b43d872d923f848f999ff12f64adb67
+Content-length: 35
+
+PROPS-END
+This if file 'test.txt'.
+
+
+Node-path: trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 2
+Prop-content-length: 124
+Content-length: 124
+
+K 7
+svn:log
+V 26
+Import greek tree on trunk
+K 10
+svn:author
+V 3
+lgo
+K 8
+svn:date
+V 27
+2007-12-07T20:56:45.939703Z
+PROPS-END
+
+Node-path: trunk/A
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/A/B
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/A/B/E
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/A/B/E/alpha
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 32
+Text-content-md5: 8ac35a19435b31b928de300b32e930cd
+Content-length: 42
+
+PROPS-END
+This is the file 'A/B/E/alpha'.
+
+
+Node-path: trunk/A/B/E/beta
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 31
+Text-content-md5: de856b65f58804c29698ac73c77afca0
+Content-length: 41
+
+PROPS-END
+This is the file 'A/B/E/beta'.
+
+
+Node-path: trunk/A/B/F
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/A/B/lambda
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 31
+Text-content-md5: 74465fc532ca0c4a59782434fef78950
+Content-length: 41
+
+PROPS-END
+This is the file 'A/B/lambda'.
+
+
+Node-path: trunk/A/C
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/A/D
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/A/D/G
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/A/D/G/pi
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 29
+Text-content-md5: 9f6400f63c4dcd2e4f140b3eef1a323a
+Content-length: 39
+
+PROPS-END
+This is the file 'A/D/G/pi'.
+
+
+Node-path: trunk/A/D/G/rho
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 30
+Text-content-md5: 14d1e17286af96fd468e68aea4b9148a
+Content-length: 40
+
+PROPS-END
+This is the file 'A/D/G/rho'.
+
+
+Node-path: trunk/A/D/G/tau
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 30
+Text-content-md5: 2c41dafbd4d5735e1065b49b009ef0fd
+Content-length: 40
+
+PROPS-END
+This is the file 'A/D/G/tau'.
+
+
+Node-path: trunk/A/D/H
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/A/D/H/chi
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 30
+Text-content-md5: 1d434602d24db956f1c481397340798f
+Content-length: 40
+
+PROPS-END
+This is the file 'A/D/H/chi'.
+
+
+Node-path: trunk/A/D/H/omega
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 32
+Text-content-md5: 60561894aaf380df0d211aba60149262
+Content-length: 42
+
+PROPS-END
+This is the file 'A/D/H/omega'.
+
+
+Node-path: trunk/A/D/H/psi
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 30
+Text-content-md5: f70dc430061ce3e0ddd98783ff0b451a
+Content-length: 40
+
+PROPS-END
+This is the file 'A/D/H/psi'.
+
+
+Node-path: trunk/A/D/gamma
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 30
+Text-content-md5: f626c0bd25c0aed96c78917a653ed5c1
+Content-length: 40
+
+PROPS-END
+This is the file 'A/D/gamma'.
+
+
+Node-path: trunk/A/mu
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 25
+Text-content-md5: cbf47443741fa5692f3fe90a9e6532a6
+Content-length: 35
+
+PROPS-END
+This is the file 'A/mu'.
+
+
+Node-path: trunk/iota
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 25
+Text-content-md5: 2d18c5e57e84c5b8a5e9a6e13fa394dc
+Content-length: 35
+
+PROPS-END
+This is the file 'iota'.
+
+
+Revision-number: 3
+Prop-content-length: 127
+Content-length: 127
+
+K 7
+svn:log
+V 29
+* trunk/A/D/H/psi: extra line
+K 10
+svn:author
+V 3
+lgo
+K 8
+svn:date
+V 27
+2007-12-07T21:12:26.232653Z
+PROPS-END
+
+Node-path: trunk/A/D/H/psi
+Node-kind: file
+Node-action: change
+Text-content-length: 48
+Text-content-md5: 25969dfd7f76f630537591ab115d3188
+Content-length: 48
+
+This is the file 'A/D/H/psi'.
+Added extra line.
+
+
diff --git a/subversion/tests/cmdline/svntest/entry.py b/subversion/tests/cmdline/svntest/entry.py
index af67d08..daf3633 100644
--- a/subversion/tests/cmdline/svntest/entry.py
+++ b/subversion/tests/cmdline/svntest/entry.py
@@ -27,6 +27,10 @@
 
 import xml.parsers.expat  # you may need to install this package
 
+### The entries file parser in tools/client-side/change-svn-wc-format.py
+### handles the WC format for Subversion 1.4 and 1.5, which is no
+### longer in XML.
+
 class svn_entry:
   "An object that represents an entry from an 'entries' file."
 
diff --git a/subversion/tests/cmdline/svntest/main.py b/subversion/tests/cmdline/svntest/main.py
index d69aa0c..d76096b 100644
--- a/subversion/tests/cmdline/svntest/main.py
+++ b/subversion/tests/cmdline/svntest/main.py
@@ -856,6 +856,7 @@
     self.repo_dir = os.path.join(general_repo_dir, self.name)
     self.repo_url = test_area_url + '/' + self.repo_dir
 
+    ### TODO: Move this into to the build() method
     # For dav tests we need a single authz file which must be present,
     # so we recreate it each time a sandbox is created with some default
     # contents.
@@ -876,16 +877,23 @@
       self.repo_url = self.repo_url.replace('\\', '/')
     self.test_paths = [self.wc_dir, self.repo_dir]
 
-  def clone_dependent(self):
+  def clone_dependent(self, copy_wc=False):
     """A convenience method for creating a near-duplicate of this
     sandbox, useful when working with multiple repositories in the
-    same unit test.  Any necessary cleanup operations are triggered
-    by cleanup of the original sandbox."""
+    same unit test.  If COPY_WC is true, make an exact copy of this
+    sandbox's working copy at the new sandbox's working copy
+    directory.  Any necessary cleanup operations are triggered by
+    cleanup of the original sandbox."""
+
     if not self.dependents:
       self.dependents = []
-    self.dependents.append(copy.deepcopy(self))
-    self.dependents[-1]._set_name("%s-%d" % (self.name, len(self.dependents)))
-    return self.dependents[-1]
+    clone = copy.deepcopy(self)
+    self.dependents.append(clone)
+    clone._set_name("%s-%d" % (self.name, len(self.dependents)))
+    if copy_wc:
+      self.add_test_path(clone.wc_dir)
+      shutil.copytree(self.wc_dir, clone.wc_dir, symlinks=True)
+    return clone
 
   def build(self, name = None, create_wc = True):
     if name != None:
@@ -893,7 +901,7 @@
     if actions.make_repo_and_wc(self, create_wc):
       raise Failure("Could not build repository and sandbox '%s'" % self.name)
 
-  def add_test_path(self, path, remove=1):
+  def add_test_path(self, path, remove=True):
     self.test_paths.append(path)
     if remove:
       safe_rmtree(path)
diff --git a/subversion/tests/cmdline/switch_tests.py b/subversion/tests/cmdline/switch_tests.py
index 2347b2e..3d00583 100755
--- a/subversion/tests/cmdline/switch_tests.py
+++ b/subversion/tests/cmdline/switch_tests.py
@@ -617,7 +617,6 @@
                                      'rm', '-m', 'delete subdir', A2_B_F_url)
 
   expected_output = svntest.wc.State(wc_dir, {
-    'A'     : Item(status=' U'),
     'A/B/F' : Item(status='D '),
     })
   expected_disk = svntest.main.greek_state.copy()
@@ -981,8 +980,8 @@
 def refresh_read_only_attribute(sbox):
   "refresh the WC file system read-only attribute "
 
-  # This test will fail when run as root. Since that's normal behavior, just skip
-  # the test.
+  # This test will fail when run as root. Since that's normal
+  # behavior, just skip the test.
   if os.name == 'posix':
     if os.geteuid() == 0:
       raise svntest.Skip
@@ -1023,7 +1022,6 @@
   # Switch to the branch with the WC state from before the propset of
   # svn:needs-lock.
   expected_output = svntest.wc.State(wc_dir, {
-    'A'    : Item(status=' U'),
     'A/mu' : Item(status=' U'),
     })
   expected_disk = svntest.main.greek_state.copy()
diff --git a/subversion/tests/cmdline/update_tests.py b/subversion/tests/cmdline/update_tests.py
index 6a41696..a051194 100755
--- a/subversion/tests/cmdline/update_tests.py
+++ b/subversion/tests/cmdline/update_tests.py
@@ -2931,7 +2931,7 @@
   expected_status.tweak(wc_rev=5)
   expected_disk = svntest.main.greek_state.copy()
   expected_disk.add({
-    'A/B_COPY'         : Item(props={SVN_PROP_MERGE_INFO : ''}),
+    'A/B_COPY'         : Item(),
     'A/B_COPY/lambda'  : Item("This is the file 'lambda'.\n"),
     'A/B_COPY/E'       : Item(),
     'A/B_COPY/E/alpha' : Item("This is the file 'alpha'.\n"),
diff --git a/tools/client-side/change-svn-wc-format.py b/tools/client-side/change-svn-wc-format.py
index 939fe91..0871a67 100755
--- a/tools/client-side/change-svn-wc-format.py
+++ b/tools/client-side/change-svn-wc-format.py
@@ -31,6 +31,10 @@
   True = 1
   False = 0
 
+### The entries file parser in subversion/tests/cmdline/svntest/entry.py
+### handles the XML-based WC entries file format used by Subversion
+### 1.3 and lower.  It could be rolled into this script.
+
 LATEST_FORMATS = { "1.4" : 8,
                    "1.5" : 9 }
 
diff --git a/www/links.html b/www/links.html
index 091eab6..0403b5d 100644
--- a/www/links.html
+++ b/www/links.html
@@ -771,6 +771,12 @@
                 >http://freshmeat.net/projects/scmbug/</a>
       </p></li>
 
+      <li><p><b>BugTracker.NET</b> - a free, open source, web-based issue
+        tracker for .NET.<br/>
+        <a href="http://ifdefined.com/bugtrackernet.html"
+                >http://ifdefined.com/bugtrackernet.html</a>
+      </p></li>
+
       <li><p><b>Collaboa</b> - Repository browser and issue tracker,
         similar to Trac.<br/>
         <a href="http://collaboa.org/"
diff --git a/www/release-process.html b/www/release-process.html
index 75cb9e4..ad6423b 100644
--- a/www/release-process.html
+++ b/www/release-process.html
@@ -37,7 +37,7 @@
   <li><a href="#release-manager-role">Being the Release Manager</a></li>
   <li><a href="#release-branches">Creating and maintaining release branches</a></li>
   <li><a href="#porting-changes">Porting changes to release branches</a></li>
-  <li><a href="#the-changes-file">Managing the CHANGES file</a>
+  <li><a href="#the-changes-file">Managing the <tt>CHANGES</tt> file</a>
   <ol>
     <li><a href="#writing-initial-changes">Writing the initial content for a branch</a></li>
     <li><a href="#adding-changes">Adding content for patch release</a></li>
@@ -164,7 +164,7 @@
 
 
 <div class="h2" id="the-changes-file" title="the-changes-file">
-<h2>Managing the CHANGES file</h2>
+<h2>Managing the <tt>CHANGES file</tt></h2>
 
 <p>The <tt>CHANGES</tt> file is the project changelog file.  Before a
 release, it must be brought up to date to list all changes since the
@@ -183,7 +183,7 @@
 <p>Remember that <tt>CHANGES</tt> should <em>always</em> be edited on
 trunk and then merged over to the release branch(es) when necessary.
 It is very important that all changes of all releases be documented in
-the CHANGES file on trunk, both for future reference and so that
+the <tt>CHANGES</tt> file on trunk, both for future reference and so that
 future release branches contain the sum of all previous change
 logs.</p>
 
@@ -212,15 +212,21 @@
 The trick is to know what level of detail to write at: you don't want
 to mention every tiny little commit, but you don't want to be too
 general either.  Set your filter-level by reading through a few pages
-of the CHANGES file before starting on the new section, just to keep
-things consistent.</p>
+of the <tt>CHANGES</tt> file before starting on the new section, just to
+keep things consistent.</p>
 
 </div> <!-- writing-initial-changes -->
 
 <div class="h3" id="adding-changes">
 <h3>Adding content for patch release</h3>
 
-<p>TODO</p>
+<p>As part of <a href="/hacking.html#release-stabilization">release
+stabilization</a>, <tt>CHANGES</tt> should be updated as bug fixes are
+ported to the release branch.  Generally, if you merge a revision or group
+of revisions (i.e., an item in <tt>STATUS</tt>) to the release branch, you
+should also add an item to <tt>CHANGES</tt> on trunk, following the same
+guidelines outlined above.  This list will then be merged to the release
+branch when a patch release is made.</p>
 
 </div> <!-- adding-changes -->
 
@@ -303,9 +309,9 @@
 <h2>Rolling a release</h2>
 
 <p>Before rolling, first make sure that the latest version of the
-CHANGES file from trunk is merged into the release branch, and that
-the date at the top of CHANGES matches the planned release date of the
-tarball.</p>
+<tt>CHANGES</tt> file from trunk is merged into the release branch, and that
+the date at the top of <tt>CHANGES</tt> matches the planned release date of
+the tarball.</p>
 
 <p><b>Build the tarballs</b>: From within your Unix dependency
 directory, run:</p>