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 > 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 > 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 > 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>