You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2012/03/05 21:34:28 UTC

svn commit: r1297221 [5/7] - in /subversion/branches/ev2-export: ./ build/ac-macros/ build/generator/ build/win32/ notes/ subversion/bindings/javahl/native/ subversion/bindings/javahl/tests/org/apache/subversion/javahl/ subversion/bindings/swig/include...

Modified: subversion/branches/ev2-export/subversion/po/zh_CN.po
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/po/zh_CN.po?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/po/zh_CN.po [UTF-8] (original)
+++ subversion/branches/ev2-export/subversion/po/zh_CN.po [UTF-8] Mon Mar  5 20:34:22 2012
@@ -55,8 +55,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: subversion 1.7\n"
 "Report-Msgid-Bugs-To: dev@subversion.apache.org\n"
-"POT-Creation-Date: 2011-12-22 17:11+0800\n"
-"PO-Revision-Date: 2011-12-22 13:31+0800\n"
+"POT-Creation-Date: 2012-02-27 09:24+0000\n"
+"PO-Revision-Date: 2012-02-27 09:24+0000\n"
 "Last-Translator: Subversion Developers <de...@subversion.apache.org>\n"
 "Language-Team: Simplified Chinese <de...@subversion.apache.org>\n"
 "Language: \n"
@@ -1144,12 +1144,8 @@ msgid "'%s' is scheduled for addition, b
 msgstr "丢失了预定增加的“%s”"
 
 #, c-format
-msgid "'%s' is scheduled for addition within unversioned parent"
-msgstr "在未纳入版本控制的父目录,“%s” 被加入增加调度"
-
-#, c-format
-msgid "'%s' is not under version control and is not part of the commit, yet its child '%s' is part of the commit"
-msgstr "“%s” 尚未纳入版本控制,也不是提交的一部分,但是它的子路径 “%s” 是提交的一部分"
+msgid "'%s' is not known to exist in the repository and is not part of the commit, yet its child '%s' is part of the commit"
+msgstr "“%s” 不在版本库中,也不是提交的一部分,但是它的子路径 “%s” 是提交的一部分"
 
 #, c-format
 msgid "Cannot commit both '%s' and '%s' as they refer to the same URL"
@@ -1363,7 +1359,7 @@ msgid "URL '%s' at revision %ld is not a
 msgstr "URL “%s” 在版本 %ld 中不是文件或目录"
 
 #, c-format
-msgid "Unsupported external: url of file external '%s' is not in repository '%s'"
+msgid "Unsupported external: URL of file external '%s' is not in repository '%s'"
 msgstr "不支持的外部对象:文件外部对象“%s”的 URL 不在版本库“%s”中"
 
 #, c-format
@@ -2447,12 +2443,6 @@ msgstr "修订版的 svndiff 数据非�
 msgid "Reading one svndiff window read beyond the end of the representation"
 msgstr "读svndiff窗口时超出了结尾"
 
-msgid "svndiff data requested non-existent source"
-msgstr "svndiff 数据请求不存在的来源"
-
-msgid "svndiff requested position beyond end of stream"
-msgstr "svndiff 请求的位置超出了流的结尾"
-
 msgid "svndiff window length is corrupt"
 msgstr "svndiff 的窗体长度已损坏"
 
@@ -3268,6 +3258,10 @@ msgid "GET request failed: %d %s"
 msgstr "GET 请求失败: %d %s"
 
 #, c-format
+msgid "Unknown tag '%s' while at state %d"
+msgstr "未知标签“%s”,上下文状态 %d"
+
+#, c-format
 msgid "Error retrieving REPORT (%d)"
 msgstr "获取报告出错(%d)"
 
@@ -3473,12 +3467,17 @@ msgstr "不支持 ra_svn RA 加载器版
 msgid "Unexpected server response to authentication"
 msgstr "服务器意外响应认证请求"
 
-msgid "Could not initialize the SASL library"
-msgstr "不能初始化 SASL 库"
+#, c-format
+msgid "SASL authentication error: %s%s"
+msgstr "SASL 认证错误: %s%s"
+
+#, c-format
+msgid "Could not initialized the SASL library: %s%s"
+msgstr "不能初始化 SASL 库: %s%s"
 
 #, c-format
-msgid "SASL authentication error: %s"
-msgstr "SASL 认证失败: %s"
+msgid "Could not create SASL context: %s%s"
+msgstr "不能创建 SASL 上下文: %s%s"
 
 #, c-format
 msgid "Authentication error from server: %s"
@@ -4593,13 +4592,13 @@ msgstr ""
 "\n"
 
 msgid ""
-"Copyright (C) 2011 The Apache Software Foundation.\n"
+"Copyright (C) 2012 The Apache Software Foundation.\n"
 "This software consists of contributions made by many people; see the NOTICE\n"
 "file for more information.\n"
 "Subversion is open source software, see http://subversion.apache.org/\n"
 "\n"
 msgstr ""
-"版权所有 (C) 2011 Apache 软件基金会。\n"
+"版权所有 (C) 2012 Apache 软件基金会。\n"
 "此软件包含了许多人的贡献,请查看文件 NOTICE 以获得更多信息。\n"
 "Subversion 是开放源代码软件,请参阅 http://subversion.apache.org/ 站点。\n"
 "\n"
@@ -5600,6 +5599,10 @@ msgid "Corrupt data for '%s'"
 msgstr "'%s' 的数据损坏"
 
 #, c-format
+msgid "The node '%s' comes from unexpected repository '%s', expected '%s'; if this node is a file external using the correct URL in the external definition can fix the problem, see issue #4087"
+msgstr "节点“%s”来自不期望的版本库“%s”,期望的版本库是“%s”;如果此节点是文件外部引用,那么在外部定义中使用正确的 URL 可以修正这个问题,请参见问题 #4087 以获得详细信息"
+
+#, c-format
 msgid "The node '%s' is not in working copy '%s'"
 msgstr "节点“%s”不在工作副本“%s”中"
 
@@ -6465,6 +6468,9 @@ msgstr "尝试操作但没有修改"
 msgid "do not print differences for deleted files"
 msgstr "不要输出删除文件造成的差异"
 
+msgid "ignore properties during the operation"
+msgstr "操作时忽略属性"
+
 msgid "notice ancestry when calculating differences"
 msgstr "比较差异时提示原始信息"
 
@@ -6632,6 +6638,14 @@ msgid "use git's extended diff format"
 msgstr "使用 git 的扩展差异格式"
 
 msgid ""
+"generate diff suitable for generic third-party\n"
+"                             patch tools; currently the same as\n"
+"                             --show-copies-as-adds --ignore-properties\n"
+msgstr ""
+"生成适用于第三方工具的差异格式;当前等价于\n"
+"                             --show-copies-as-adds --ignore-properties\n"
+
+msgid ""
 "Allow merge into mixed-revision working copy.\n"
 "                             Use of this option is not recommended!\n"
 "                             Please run 'svn update' instead."
@@ -7411,7 +7425,6 @@ msgid ""
 "  repositories.\n"
 msgstr ""
 
-#, fuzzy
 msgid ""
 "Display merge-related information.\n"
 "usage: mergeinfo SOURCE[@REV] [TARGET[@REV]]\n"
@@ -7426,9 +7439,11 @@ msgstr ""
 "显示合并的相关信息。\n"
 "用法: mergeinfo SOURCE[@REV] [TARGET[@REV]]\n"
 "\n"
-"  显示 SOURCE 与 TARGET(默认为 “.”) 之间的合并(或潜在合并)信息。如果没有\n"
-"  提供选项 --show-revs,那么就显示已经从 SOURCE 合并到 TARGET 的版本。否\n"
-"  则就显示选项 --show-revs 指定的信息。\n"
+"  显示 SOURCE 与 TARGET(默认为“.”) 之间的合并(或潜在合并)信息。显示选项\n"
+"  --show-revs 指定的信息类型。如果没有传入 --show-revs,那么就使用其默认值\n"
+"  --show-revs='merged'。\n"
+"\n"
+"  深度可以是“empty”或“infinity”;默认值是“empty”\n"
 
 msgid ""
 "Create a new directory under version control.\n"
@@ -7618,7 +7633,6 @@ msgstr ""
 "  1、显示目标的属性。REV 指定从哪个版本开始查找目标。\n"
 "  2、列出版本库中版本的属性。TARGET 只用来判断访问哪个版本库。\n"
 
-#, fuzzy
 msgid ""
 "Set the value of a property on files, dirs, or revisions.\n"
 "usage: 1. propset PROPNAME PROPVAL PATH...\n"
@@ -7713,18 +7727,15 @@ msgstr ""
 "    svn:mime-type    - 文件的媒体类型。用以决定是否该合并该文件,\n"
 "      以及 Apache 如何处理它。媒体类型以“text/”开头(或是没有指\n"
 "      定媒体类型)的文件会被视为纯文本文件,否则就是二进制数据。\n"
-"    svn:externals    - 以换行符隔开的模块说明列表,每项都由一个\n"
-"      相对路径、可选的版本标志、一个 URL 组成。这三个元素的顺序实现\n"
-"      不同的行为。Subversion 1.4 和早期的版本仅支持下列格式,并且 URL\n"
-"      中不能有 peg 版本:\n"
-"        foo             http://example.com/repos/zig\n"
-"        foo/bar -r 1234 http://example.com/repos/zag\n"
-"      Subversion 1.5 和更高的版本支持以上格式,以及下列格式,URL 中可以有\n"
-"      peg 版本:\n"
-"                http://example.com/repos/zig@42 foo\n"
-"        -r 1234 http://example.com/repos/zig foo/bar\n"
-"      Subversion 1.5 和更高的版本在上述格式中支持相对 URL,在用 URL 开始用\n"
-"      下述字符串之一来指示:\n"
+"    svn:externals  - 以换行符隔开的模块说明列表,每项都由一个 URL 和\n"
+"      相对目录路径组成,与命令“svn checkout”的句法类似:\n"
+"        http://example.com/repos/zig foo/bar\n"
+"      可以指定版本以钉住已知的版本:\n"
+"        -r25 http://example.com/repos/zig foo/bar\n"
+"      为了清楚的表明路径上的一个元素已经被删除(甚至可能被删除了多次),\n"
+"      可以在 URL 后追加一个 peg 版本:\n"
+"        -r25 http://example.com/repos/zig@42 foo/bar\n"
+"      下列开始字符串指示相对 URL:\n"
 "        ../  相对于外部引用的父目录\n"
 "        ^/   相对于版本库的根\n"
 "        //   相对于方案\n"
@@ -7732,6 +7743,11 @@ msgstr ""
 "      相对路径“relative_path relative_path”这种不明确的格式来自\n"
 "      “relative_url relative_path”和 peg 版本支持。\n"
 "      以字符 '#' 开始的外部定义行被认为是注释,并且忽略。\n"
+"      Subversion 1.4 和早期的仅支持下列格式,peg 版本只能使用 -r 指定,\n"
+"      并且 URL 不能使用相对格式:\n"
+"        foo             http://example.com/repos/zig\n"
+"        foo/bar -r 1234 http://example.com/repos/zag\n"
+"      不赞同使用这些格式。它们只应该用于希望支持 1.4 客户端的情况。\n"
 "    svn:needs-lock - 此属性表明文件在修改前应该加锁。\n"
 "      如果没有加锁,则此文件在工作副本中应被设为只读。使用\n"
 "      “svn propdel svn:needs-lock PATH...” 清除。\n"
@@ -7743,7 +7759,6 @@ msgstr ""
 msgid "read property value from file ARG"
 msgstr "从文件 ARG 读取属性值"
 
-#, fuzzy
 msgid ""
 "Relocate the working copy to point to a different repository root URL.\n"
 "usage: 1. relocate FROM-PREFIX TO-PREFIX [PATH...]\n"
@@ -7759,7 +7774,7 @@ msgid ""
 "     complete old and new URLs if you wish.)  Use 'svn info' to determine\n"
 "     the current working copy URL.\n"
 "\n"
-"  2. TO-URL is the (complete) new repository URL to use for for PATH.\n"
+"  2. TO-URL is the (complete) new repository URL to use for PATH.\n"
 "\n"
 "  Examples:\n"
 "    svn relocate http:// svn:// project1 project2\n"
@@ -7773,8 +7788,8 @@ msgstr ""
 "  改写工作副本 URL 元数据,以反映仅版本库根 URL 的改变。这用于仅版本库根\n"
 "  URL 改变(例如方案或主机名称),但是工作副本内容仍旧与版本库对应的情况。\n"
 "\n"
-"  1. FROM-PREFIX 和 TO-PREFIX 分别对应工作副本的旧 URL 与新 URL 的子串\n"
-"     (如果你喜欢,可以执行完整的 URL)。请使用 'svn info' 来确定当前工作\n"
+"  1. FROM-PREFIX 和 TO-PREFIX 分别对应工作副本的旧 URL 与新 URL 开始子串\n"
+"     (如果你喜欢,可以指定完整的 URL)。请使用 'svn info' 来确定当前工作\n"
 "     副本的 URL。\n"
 "\n"
 "  2. TO-URL 是用于 PATH 的(完整的)新版本库 URL。\n"
@@ -7832,7 +7847,6 @@ msgstr ""
 "\n"
 "  注意: 本子命令不会访问网络,它解除任何冲突的状态。\n"
 
-#, fuzzy
 msgid ""
 "Print the status of working copy files and directories.\n"
 "usage: status [PATH...]\n"
@@ -7980,10 +7994,14 @@ msgstr ""
 "      “ ” 工作副本是最新版的\n"
 "\n"
 "  剩余的栏位皆为变动宽度,并以空白隔开: \n"
-"    工作版本号(使用 -u 或 -v 时)\n"
+"    工作版本号(使用 -u 或 -v 时;被复制时显示“-”)\n"
 "    最后提交的版本与最后提交的作者(使用 -v 时)\n"
 "    工作副本路径总是最后一栏,所以它可以包含空白字符。\n"
 "\n"
+"  问号标记 (“?”) 出现在工作版本,最后提交的版本,或最后提交的作者位置时,\n"
+"  它指示信息未知,或者给出此项目的状态是不恰当的 (例如项目是复制操作的结果)。\n"
+"  问号标记用来作为一个视觉占位符,易于解析\n"
+"\n"
 "  范例输出: \n"
 "    svn status wc\n"
 "     M     wc/bar.c\n"
@@ -7992,15 +8010,15 @@ msgstr ""
 "    svn status -u wc\n"
 "     M           965    wc/bar.c\n"
 "           *     965    wc/foo.c\n"
-"    A  +         965    wc/qax.c\n"
-"    Status against revision:   981\n"
+"    A  +           -    wc/qax.c\n"
+"    版本 981 的状态\n"
 "\n"
 "    svn status --show-updates --verbose wc\n"
 "     M           965       938 kfogel       wc/bar.c\n"
 "           *     965       922 sussman      wc/foo.c\n"
-"    A  +         965       687 joe          wc/qax.c\n"
+"    A  +           -       687 joe          wc/qax.c\n"
 "                 965       687 joe          wc/zig.c\n"
-"    Status against revision:   981\n"
+"    版本 981 的状态\n"
 "\n"
 "    svn status\n"
 "     M      wc/bar.c\n"
@@ -8011,7 +8029,6 @@ msgstr ""
 msgid "don't print unversioned items"
 msgstr "不打印未版本控制的条目"
 
-#, fuzzy
 msgid ""
 "Update the working copy to a different URL within the same repository.\n"
 "usage: 1. switch URL[@PEGREV] [PATH]\n"
@@ -8063,12 +8080,15 @@ msgstr ""
 "\n"
 "     如果使用了 “--force” 选项,在工作副本中未版本控制的障碍路径,不会自动\n"
 "     导致失败。如果障碍路径与版本库中的对应路径类型相同(文件或目录),它将成\n"
-"     为受版本控制的路径,但是内容不改变。它意味着障碍路径的子孙,如果也是障\n"
-"     碍路径,那么也会受版本控制。对于障碍路径中的文件,如果与版本库内的不同,\n"
+"     为受版本控制的路径,但是内容不改变。它意味着障碍路径的子孙,也可能是障\n"
+"     碍路径,同样会受版本控制。对于障碍路径中的文件,如果与版本库内的不同,\n"
 "     将视为工作副本发生本地修改。版本库中的所有属性都应用于障碍路径。\n"
 "\n"
 "     使用 “--set-depth” 选项设置此操作目标的工作副本之新深度。\n"
 "\n"
+"     如果新 URL 与工作副本路径没有版本继承关系,Subversion 将会拒绝操作。选项\n"
+"     '--ignore-ancestry' 可以禁止此检查。\n"
+"\n"
 "  2、选项 “--relocate” 已经淘汰。它的句法等价于\n"
 "     “svn relocate FROM-PREFIX TO-PREFIX [PATH]”。\n"
 "\n"
@@ -8091,7 +8111,6 @@ msgstr ""
 "\n"
 "    使用 --force 终止锁定。\n"
 
-#, fuzzy
 msgid ""
 "Bring changes from the repository into the working copy.\n"
 "usage: update [PATH...]\n"
@@ -8153,17 +8172,25 @@ msgstr ""
 "    C  合并冲突\n"
 "    G  合并成功\n"
 "    E  已存在\n"
+"    R  已替换\n"
 "\n"
-"  第一列字符表示文件内容更新,第二列表示文件属性更新。第三列中的字符“B”\n"
-"  表示此文件上的锁被终止或窃取。\n"
+"  第一列字符报告项目本身。\n"
+"  第二列表示报告项目属性。\n"
+"  第三列中的字符“B”表示此文件上的锁被终止或窃取。\n"
+"  第四列中的字符“C”表示树冲突,同时“C”出现在第一列或第二列,分别表示\n"
+"  内容冲突或属性冲突。\n"
 "\n"
 "  如果使用了 “--force” 选项,在工作副本中未版本控制的障碍路径,不会自动\n"
 "  导致签出失败。 如果障碍路径与版本库中的对应路径类型相同(文件或目录),它\n"
-"  将成为受版本控制的路径,但是内容不改变。它意味着障碍路径的子孙,如果也\n"
-"  是障碍路径,那么也将受版本控制。对于障碍路径中的文件,如果与版本库内的\n"
+"  将成为受版本控制的路径,但是内容不改变。它意味着障碍路径的子孙,也可能\n"
+"  是障碍路径,同样会受版本控制。对于障碍路径中的文件,如果与版本库内的\n"
 "  不同,将视为工作副本发生本地修改。版本库中的所有属性都应用于障碍路径。\n"
 "  用第一列字符 “E” 来报告障碍路径。\n"
 "\n"
+"  如果工作副本中并没有指定的更新目标,但是有其父目录,那么就在指定路径上\n"
+"  将目标检出到其父目录中。如果使用了选项 --parents,就会创建目标的所有不\n"
+"  存在的父目录 (使用选项 --depth=empty)。\n"
+"\n"
 "  使用“--set-depth”选项设置此操作目标的工作副本之新深度。\n"
 
 msgid ""
@@ -8538,7 +8565,7 @@ msgstr ""
 
 #, c-format
 msgid "Status against revision: %6ld\n"
-msgstr "版本的 %6ld 状态\n"
+msgstr "版本 %6ld 的状态\n"
 
 #, c-format
 msgid "Sending copy of       %s\n"
@@ -9160,6 +9187,14 @@ msgstr ""
 "进度报告会送至标准输出。\n"
 
 msgid ""
+"usage: svnadmin lock REPOS_PATH PATH USERNAME COMMENT-FILE [TOKEN]\n"
+"\n"
+"Lock PATH by USERNAME setting comments from COMMENT-FILE.\n"
+"If provided, use TOKEN as lock token.  Use --bypass-hooks to avoid\n"
+"triggering the pre-lock and post-lock hook scripts.\n"
+msgstr ""
+
+msgid ""
 "usage: svnadmin lslocks REPOS_PATH [PATH-IN-REPOS]\n"
 "\n"
 "Print descriptions of all locks on or under PATH-IN-REPOS (which,\n"
@@ -9275,6 +9310,14 @@ msgstr ""
 "新 UUID;否则就为版本库生成一个新的 UUID。\n"
 
 msgid ""
+"usage: svnadmin unlock REPOS_PATH LOCKED_PATH USERNAME TOKEN\n"
+"\n"
+"Unlocked LOCKED_PATH (as USERNAME) after verifying that the token\n"
+"associated with the lock matches TOKEN.  Use --bypass-hooks to avoid\n"
+"triggering the pre-unlock and post-unlock hook scripts.\n"
+msgstr ""
+
+msgid ""
 "usage: svnadmin upgrade REPOS_PATH\n"
 "\n"
 "Upgrade the repository located at REPOS_PATH to the latest supported\n"
@@ -9458,6 +9501,10 @@ msgstr "路径 “%s” 没有被锁定�
 msgid "Removed lock on '%s'.\n"
 msgstr "删除 “%s” 上的锁。\n"
 
+#, c-format
+msgid "'%s' unlocked by user '%s'.\n"
+msgstr "“%s”被用户“%s”解锁。\n"
+
 msgid "Upgrade of this repository's underlying versioned filesystem is not supported; consider dumping and loading the data elsewhere"
 msgstr "文件系统不支持升级此版本库;请考虑使用导出后加载数据的升级方案"
 
@@ -10110,6 +10157,9 @@ msgstr ""
 "子命令“%s”不接受选项“%s”\n"
 "输入“svnrdump help %s”得到用法。\n"
 
+msgid "Could not initialize the SASL library"
+msgstr "不能初始化 SASL 库"
+
 #, c-format
 msgid "Can't get hostname"
 msgstr "无法获取主机名称"

Modified: subversion/branches/ev2-export/subversion/svn/cat-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svn/cat-cmd.c?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svn/cat-cmd.c (original)
+++ subversion/branches/ev2-export/subversion/svn/cat-cmd.c Mon Mar  5 20:34:22 2012
@@ -98,7 +98,7 @@ svn_cl__cat(apr_getopt_t *os,
 
           if (status == SVN_ERR_ENTRY_NOT_FOUND ||
               status == SVN_ERR_FS_NOT_FOUND)
-            err = svn_error_quick_wrap(err, 
+            err = svn_error_quick_wrap(err,
                                        _("Could not cat all targets because "
                                          "some targets don't exist"));
           else if (status == SVN_ERR_UNVERSIONED_RESOURCE)
@@ -113,6 +113,6 @@ svn_cl__cat(apr_getopt_t *os,
 
       return svn_error_trace(err);
     }
-  
+
   return SVN_NO_ERROR;
 }

Modified: subversion/branches/ev2-export/subversion/svn/list-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svn/list-cmd.c?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svn/list-cmd.c (original)
+++ subversion/branches/ev2-export/subversion/svn/list-cmd.c Mon Mar  5 20:34:22 2012
@@ -56,6 +56,13 @@ print_dirent(void *baton,
 {
   struct print_baton *pb = baton;
   const char *entryname;
+  static const char *time_format_long = NULL;
+  static const char *time_format_short = NULL;
+
+  if (time_format_long == NULL)
+    time_format_long = _("%b %d %H:%M");
+  if (time_format_short == NULL)
+    time_format_short = _("%b %d  %Y");
 
   if (pb->ctx->cancel_func)
     SVN_ERR(pb->ctx->cancel_func(pb->ctx->cancel_baton));
@@ -90,12 +97,12 @@ print_dirent(void *baton,
           && apr_time_sec(dirent->time - now) < (365 * 86400 / 2))
         {
           apr_err = apr_strftime(timestr, &size, sizeof(timestr),
-                                 _("%b %d %H:%M"), &exp_time);
+                                 time_format_long, &exp_time);
         }
       else
         {
           apr_err = apr_strftime(timestr, &size, sizeof(timestr),
-                                 _("%b %d  %Y"), &exp_time);
+                                 time_format_short, &exp_time);
         }
 
       /* if that failed, just zero out the string and print nothing */

Modified: subversion/branches/ev2-export/subversion/svn/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svn/main.c?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svn/main.c (original)
+++ subversion/branches/ev2-export/subversion/svn/main.c Mon Mar  5 20:34:22 2012
@@ -2276,7 +2276,7 @@ main(int argc, const char *argv[])
 
   /* Disallow simultaneous use of both -m and -F, when they are
      both used to pass a commit message or lock comment.  ('propset'
-     takes the property value, not a commit message, from -F.) 
+     takes the property value, not a commit message, from -F.)
    */
   if (opt_state.filedata && opt_state.message
       && subcommand->cmd_func != svn_cl__propset)

Modified: subversion/branches/ev2-export/subversion/svn/proplist-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svn/proplist-cmd.c?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svn/proplist-cmd.c (original)
+++ subversion/branches/ev2-export/subversion/svn/proplist-cmd.c Mon Mar  5 20:34:22 2012
@@ -223,12 +223,12 @@ svn_cl__proplist(apr_getopt_t *os,
       if (errors->nelts > 0)
         {
           svn_error_t *err;
-          
+
           err = svn_error_create(SVN_ERR_ILLEGAL_TARGET, NULL, NULL);
           for (i = 0; i < errors->nelts; i++)
             {
               apr_status_t status = APR_ARRAY_IDX(errors, i, apr_status_t);
-              
+
               if (status == SVN_ERR_ENTRY_NOT_FOUND)
                 err = svn_error_quick_wrap(err,
                                            _("Could not display properties "

Modified: subversion/branches/ev2-export/subversion/svn/status.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svn/status.c?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svn/status.c (original)
+++ subversion/branches/ev2-export/subversion/svn/status.c Mon Mar  5 20:34:22 2012
@@ -130,10 +130,10 @@ generate_status_desc(enum svn_wc_status_
    RELATIVE_TO_PATH and TARGET_PATH must be based on the same parent path,
    i.e. they can either both be absolute or they can both be relative to the
    same parent directory. Both paths are expected to be canonical.
-   
+
    If above conditions are met, a relative path that leads to TARGET_ABSPATH
    from RELATIVE_TO_PATH is returned, but there is no error checking involved.
-   
+
    The returned path is allocated from RESULT_POOL, all other allocations are
    made in SCRATCH_POOL. */
 static const char *
@@ -148,7 +148,7 @@ make_relpath(const char *relative_to_pat
   /* An example:
    *  relative_to_path = /a/b/c
    *  target_path      = /a/x/y/z
-   *  result           = ../../x/y/z 
+   *  result           = ../../x/y/z
    *
    * Another example (Windows specific):
    *  relative_to_path = F:/wc

Modified: subversion/branches/ev2-export/subversion/svnadmin/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svnadmin/main.c?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svnadmin/main.c (original)
+++ subversion/branches/ev2-export/subversion/svnadmin/main.c Mon Mar  5 20:34:22 2012
@@ -363,7 +363,7 @@ static const svn_opt_subcommand_desc2_t 
    {'q', 'r', svnadmin__ignore_uuid, svnadmin__force_uuid,
     svnadmin__use_pre_commit_hook, svnadmin__use_post_commit_hook,
     svnadmin__parent_dir, svnadmin__bypass_prop_validation, 'M'} },
-  
+
   {"lock", subcommand_lock, {0}, N_
    ("usage: svnadmin lock REPOS_PATH PATH USERNAME COMMENT-FILE [TOKEN]\n\n"
     "Lock PATH by USERNAME setting comments from COMMENT-FILE.\n"
@@ -1027,7 +1027,7 @@ subcommand_load(apr_getopt_t *os, void *
     {
       lower = upper;
     }
-  
+
   /* Ensure correct range ordering. */
   if (lower > upper)
     {
@@ -1483,7 +1483,7 @@ subcommand_lock(apr_getopt_t *os, void *
     lock_token = APR_ARRAY_IDX(args, 3, const char *);
 
   SVN_ERR(target_arg_to_dirent(&comment_file_name, comment_file_name, pool));
-  
+
   SVN_ERR(open_repos(&repos, opt_state->repository_path, pool));
   fs = svn_repos_fs(repos);
 
@@ -1496,10 +1496,10 @@ subcommand_lock(apr_getopt_t *os, void *
   SVN_ERR(svn_stringbuf_from_file2(&file_contents, comment_file_name, pool));
 
   SVN_ERR(svn_utf_cstring_to_utf8(&lock_path_utf8, lock_path, pool));
-  
+
   if (opt_state->bypass_hooks)
     SVN_ERR(svn_fs_lock(&lock, fs, lock_path_utf8,
-                        lock_token,          
+                        lock_token,
                         file_contents->data, /* comment */
                         0,                   /* is_dav_comment */
                         0,                   /* no expiration time. */
@@ -1507,7 +1507,7 @@ subcommand_lock(apr_getopt_t *os, void *
                         FALSE, pool));
   else
     SVN_ERR(svn_repos_fs_lock(&lock, repos, lock_path_utf8,
-                              lock_token,          
+                              lock_token,
                               file_contents->data, /* comment */
                               0,                   /* is_dav_comment */
                               0,                   /* no expiration time. */

Modified: subversion/branches/ev2-export/subversion/svndumpfilter/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svndumpfilter/main.c?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svndumpfilter/main.c (original)
+++ subversion/branches/ev2-export/subversion/svndumpfilter/main.c Mon Mar  5 20:34:22 2012
@@ -110,7 +110,10 @@ write_prop_to_stringbuf(svn_stringbuf_t 
 }
 
 
-/* Prefix matching function to compare node-path with set of prefixes. */
+/* Compare the node-path PATH with the (const char *) prefixes in PFXLIST.
+ * Return TRUE if any prefix is a prefix of PATH (matching whole path
+ * components); FALSE otherwise.
+ * PATH starts with a '/', as do the (const char *) paths in PREFIXES. */
 static svn_boolean_t
 ary_prefix_match(const apr_array_header_t *pfxlist, const char *path)
 {
@@ -125,7 +128,7 @@ ary_prefix_match(const apr_array_header_
       if (path_len < pfx_len)
         continue;
       if (strncmp(path, pfx, pfx_len) == 0
-          && (path[pfx_len] == '\0' || path[pfx_len] == '/'))
+          && (pfx_len == 1 || path[pfx_len] == '\0' || path[pfx_len] == '/'))
         return TRUE;
     }
 
@@ -134,7 +137,8 @@ ary_prefix_match(const apr_array_header_
 
 
 /* Check whether we need to skip this PATH based on its presence in
-   the PREFIXES list, and the DO_EXCLUDE option. */
+   the PREFIXES list, and the DO_EXCLUDE option.
+   PATH starts with a '/', as do the (const char *) paths in PREFIXES. */
 static APR_INLINE svn_boolean_t
 skip_path(const char *path, const apr_array_header_t *prefixes,
           svn_boolean_t do_exclude, svn_boolean_t glob)

Modified: subversion/branches/ev2-export/subversion/svnlook/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svnlook/main.c?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svnlook/main.c (original)
+++ subversion/branches/ev2-export/subversion/svnlook/main.c Mon Mar  5 20:34:22 2012
@@ -875,7 +875,7 @@ display_prop_diffs(const apr_array_heade
 
         /* The last character in a property is often not a newline.
            An eol character is appended to prevent the diff API to add a
-           ' \ No newline at end of file' line. We add 
+           ' \ No newline at end of file' line. We add
            ' \ No newline at end of property' manually if needed. */
         tmp = orig_value ? orig_value : svn_string_create_empty(pool);
         orig = maybe_append_eol(tmp, NULL, pool);

Modified: subversion/branches/ev2-export/subversion/svnrdump/dump_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svnrdump/dump_editor.c?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svnrdump/dump_editor.c (original)
+++ subversion/branches/ev2-export/subversion/svnrdump/dump_editor.c Mon Mar  5 20:34:22 2012
@@ -181,7 +181,7 @@ get_props_content(svn_stringbuf_t **head
   svn_stream_t *content_stream;
   apr_hash_t *normal_props;
   const char *buf;
-  
+
   *content = svn_stringbuf_create_empty(result_pool);
   *header = svn_stringbuf_create_empty(result_pool);
 
@@ -932,7 +932,7 @@ fetch_base_func(const char **filename,
     }
   else if (err)
     return svn_error_trace(err);
-  
+
   SVN_ERR(svn_stream_close(fstream));
 
   return SVN_NO_ERROR;

Modified: subversion/branches/ev2-export/subversion/svnserve/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svnserve/main.c?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svnserve/main.c (original)
+++ subversion/branches/ev2-export/subversion/svnserve/main.c Mon Mar  5 20:34:22 2012
@@ -147,6 +147,7 @@ void winservice_notify_stop(void)
 #define SVNSERVE_OPT_LOG_FILE        264
 #define SVNSERVE_OPT_CACHE_TXDELTAS  265
 #define SVNSERVE_OPT_CACHE_FULLTEXTS 266
+#define SVNSERVE_OPT_SINGLE_CONN     267
 
 static const apr_getopt_option_t svnserve__options[] =
   {
@@ -231,6 +232,10 @@ static const apr_getopt_option_t svnserv
      N_("run in foreground (useful for debugging)\n"
         "                             "
         "[mode: daemon]")},
+    {"single-thread",    SVNSERVE_OPT_SINGLE_CONN, 0,
+     N_("handle one connection at a time in the parent process\n"
+        "                             "
+        "(useful for debugging)")},
     {"log-file",         SVNSERVE_OPT_LOG_FILE, 1,
      N_("svnserve log file")},
     {"pid-file",         SVNSERVE_OPT_PID_FILE, 1,
@@ -428,10 +433,13 @@ int main(int argc, const char *argv[])
   const char *host = NULL;
   int family = APR_INET;
   apr_int32_t sockaddr_info_flags = 0;
+#if APR_HAVE_IPV6
   svn_boolean_t prefer_v6 = FALSE;
+#endif
   svn_boolean_t quiet = FALSE;
   svn_boolean_t is_version = FALSE;
   int mode_opt_count = 0;
+  int handling_opt_count = 0;
   const char *config_filename = NULL;
   const char *pid_filename = NULL;
   const char *log_filename = NULL;
@@ -486,7 +494,10 @@ int main(int argc, const char *argv[])
       switch (opt)
         {
         case '6':
+#if APR_HAVE_IPV6
           prefer_v6 = TRUE;
+#endif
+          /* ### Maybe error here if we don't have IPV6 support? */
           break;
 
         case 'h':
@@ -513,6 +524,11 @@ int main(int argc, const char *argv[])
           foreground = TRUE;
           break;
 
+        case SVNSERVE_OPT_SINGLE_CONN:
+          handling_mode = connection_mode_single;
+          handling_opt_count++;
+          break;
+
         case 'i':
           if (run_mode != run_mode_inetd)
             {
@@ -585,6 +601,7 @@ int main(int argc, const char *argv[])
 
         case 'T':
           handling_mode = connection_mode_thread;
+          handling_opt_count++;
           break;
 
         case 'c':
@@ -665,6 +682,14 @@ int main(int argc, const char *argv[])
       usage(argv[0], pool);
     }
 
+  if (handling_opt_count > 1)
+    {
+      svn_error_clear(svn_cmdline_fputs(
+                      _("You may only specify one of -T or --single-thread\n"),
+                      stderr, pool));
+      usage(argv[0], pool);
+    }
+
   /* If a configuration file is specified, load it and any referenced
    * password and authorization files. */
   if (config_filename)

Modified: subversion/branches/ev2-export/subversion/svnserve/serve.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svnserve/serve.c?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svnserve/serve.c (original)
+++ subversion/branches/ev2-export/subversion/svnserve/serve.c Mon Mar  5 20:34:22 2012
@@ -1470,7 +1470,7 @@ static svn_error_t *get_dir(svn_ra_svn_c
                             apr_array_header_t *params, void *baton)
 {
   server_baton_t *b = baton;
-  const char *path, *full_path, *file_path, *cauthor, *cdate;
+  const char *path, *full_path, *file_path, *cdate;
   svn_revnum_t rev;
   apr_hash_t *entries, *props = NULL, *file_props;
   apr_hash_index_t *hi;
@@ -1540,9 +1540,15 @@ static svn_error_t *get_dir(svn_ra_svn_c
   if (want_props)
     SVN_CMD_ERR(get_props(&props, root, full_path, pool));
 
-  /* Fetch the directory entries if requested. */
+  /* Begin response ... */
+  SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "w(r(!", "success", rev));
+  SVN_ERR(svn_ra_svn_write_proplist(conn, pool, props));
+  SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!)(!"));
+
+  /* Fetch the directory entries if requested and send them immediately. */
   if (want_contents)
     {
+      const char *zero_date = svn_time_to_cstring(0, pool);
       SVN_CMD_ERR(svn_fs_dir_entries(&entries, root, full_path, pool));
 
       /* Transform the hash table's FS entries into dirents.  This probably
@@ -1552,91 +1558,62 @@ static svn_error_t *get_dir(svn_ra_svn_c
         {
           const char *name = svn__apr_hash_index_key(hi);
           svn_fs_dirent_t *fsent = svn__apr_hash_index_val(hi);
-          svn_dirent_t *entry;
+
+          svn_dirent_t entry;
+          memset(&entry, 0, sizeof(entry));
 
           svn_pool_clear(subpool);
 
           file_path = svn_fspath__join(full_path, name, subpool);
-
           if (! lookup_access(subpool, b, conn, svn_authz_read,
                               file_path, FALSE))
-            {
-              apr_hash_set(entries, name, APR_HASH_KEY_STRING, NULL);
-              continue;
-            }
-
-          entry = apr_pcalloc(pool, sizeof(*entry));
+            continue;
 
           if (dirent_fields & SVN_DIRENT_KIND)
-            {
-              /* kind */
-              entry->kind = fsent->kind;
-            }
+              entry.kind = fsent->kind;
 
           if (dirent_fields & SVN_DIRENT_SIZE)
-            {
-              /* size */
-              if (entry->kind == svn_node_dir)
-                entry->size = 0;
-              else
-                SVN_CMD_ERR(svn_fs_file_length(&entry->size, root, file_path,
+              if (entry.kind != svn_node_dir)
+                SVN_CMD_ERR(svn_fs_file_length(&entry.size, root, file_path,
                                                subpool));
-            }
 
           if (dirent_fields & SVN_DIRENT_HAS_PROPS)
             {
               /* has_props */
               SVN_CMD_ERR(svn_fs_node_proplist(&file_props, root, file_path,
                                                subpool));
-              entry->has_props = (apr_hash_count(file_props) > 0);
+              entry.has_props = (apr_hash_count(file_props) > 0);
             }
 
+          cdate = NULL;
           if ((dirent_fields & SVN_DIRENT_LAST_AUTHOR)
               || (dirent_fields & SVN_DIRENT_TIME)
               || (dirent_fields & SVN_DIRENT_CREATED_REV))
             {
               /* created_rev, last_author, time */
-              SVN_CMD_ERR(svn_repos_get_committed_info(&entry->created_rev,
+              SVN_CMD_ERR(svn_repos_get_committed_info(&entry.created_rev,
                                                        &cdate,
-                                                       &cauthor, root,
+                                                       &entry.last_author, 
+                                                       root,
                                                        file_path,
                                                        subpool));
-              entry->last_author = apr_pstrdup(pool, cauthor);
-              if (cdate)
-                SVN_CMD_ERR(svn_time_from_cstring(&entry->time, cdate,
-                                                  subpool));
-              else
-                entry->time = (time_t) -1;
             }
 
-          /* Store the entry. */
-          apr_hash_set(entries, name, APR_HASH_KEY_STRING, entry);
-        }
-      svn_pool_destroy(subpool);
-    }
+          if (cdate == NULL)
+            cdate = zero_date;
 
-  /* Write out response. */
-  SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "w(r(!", "success", rev));
-  SVN_ERR(svn_ra_svn_write_proplist(conn, pool, props));
-  SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!)(!"));
-  if (want_contents)
-    {
-      for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
-        {
-          const char *name = svn__apr_hash_index_key(hi);
-          svn_dirent_t *entry = svn__apr_hash_index_val(hi);
-
-          cdate = (entry->time == (time_t) -1) ? NULL
-            : svn_time_to_cstring(entry->time, pool);
+          /* Send the entry. */
           SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "cwnbr(?c)(?c)", name,
-                                         svn_node_kind_to_word(entry->kind),
-                                         (apr_uint64_t) entry->size,
-                                         entry->has_props, entry->created_rev,
-                                         cdate, entry->last_author));
+                                         svn_node_kind_to_word(entry.kind),
+                                         (apr_uint64_t) entry.size,
+                                         entry.has_props, entry.created_rev,
+                                         cdate, entry.last_author));
         }
+      svn_pool_destroy(subpool);
     }
-  SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!))"));
-  return SVN_NO_ERROR;
+
+  /* Finish response. */
+  return svn_ra_svn_write_tuple(conn, pool, "!))");
 }
 
 static svn_error_t *update(svn_ra_svn_conn_t *conn, apr_pool_t *pool,
@@ -1981,7 +1958,7 @@ static svn_error_t *log_cmd(svn_ra_svn_c
   server_baton_t *b = baton;
   svn_revnum_t start_rev, end_rev;
   const char *full_path;
-  svn_boolean_t changed_paths, strict_node, include_merged_revisions;
+  svn_boolean_t send_changed_paths, strict_node, include_merged_revisions;
   apr_array_header_t *paths, *full_paths, *revprop_items, *revprops;
   char *revprop_word;
   svn_ra_svn_item_t *elt;
@@ -1990,7 +1967,7 @@ static svn_error_t *log_cmd(svn_ra_svn_c
   log_baton_t lb;
 
   SVN_ERR(svn_ra_svn_parse_tuple(params, pool, "l(?r)(?r)bb?n?Bwl", &paths,
-                                 &start_rev, &end_rev, &changed_paths,
+                                 &start_rev, &end_rev, &send_changed_paths,
                                  &strict_node, &limit,
                                  &include_merged_revs_param,
                                  &revprop_word, &revprop_items));
@@ -2047,7 +2024,7 @@ static svn_error_t *log_cmd(svn_ra_svn_c
 
   SVN_ERR(log_command(b, conn, pool, "%s",
                       svn_log__log(full_paths, start_rev, end_rev,
-                                   limit, changed_paths, strict_node,
+                                   limit, send_changed_paths, strict_node,
                                    include_merged_revisions, revprops,
                                    pool)));
 
@@ -2056,7 +2033,7 @@ static svn_error_t *log_cmd(svn_ra_svn_c
   lb.conn = conn;
   lb.stack_depth = 0;
   err = svn_repos_get_logs4(b->repos, full_paths, start_rev, end_rev,
-                            (int) limit, changed_paths, strict_node,
+                            (int) limit, send_changed_paths, strict_node,
                             include_merged_revisions, revprops,
                             authz_check_access_cb_func(b), b, log_receiver,
                             &lb, pool);
@@ -3094,6 +3071,140 @@ fs_warning_func(void *baton, svn_error_t
   svn_pool_clear(b->pool);
 }
 
+
+static svn_error_t *
+fetch_props_func(apr_hash_t **props,
+                 void *baton,
+                 const char *path,
+                 svn_revnum_t base_revision,
+                 apr_pool_t *result_pool,
+                 apr_pool_t *scratch_pool)
+{
+  server_baton_t *sb = baton;
+  svn_fs_root_t *fs_root;
+  svn_error_t *err;
+
+  if (!SVN_IS_VALID_REVNUM(base_revision))
+    SVN_ERR(svn_fs_youngest_rev(&base_revision, sb->fs, scratch_pool));
+
+  if (svn_path_is_url(path))
+    {
+      /* This is a copyfrom URL. */
+      path = svn_uri_skip_ancestor(sb->repos_url, path, scratch_pool);
+      path = svn_fspath__canonicalize(path, scratch_pool);
+    }
+  else
+    {
+      /* This is a base-relative path. */
+      if (path[0] != '/')
+        /* Get an absolute path for use in the FS. */
+        path = svn_fspath__join(sb->fs_path->data, path, scratch_pool);
+    }
+
+  SVN_ERR(svn_fs_revision_root(&fs_root, sb->fs, base_revision, scratch_pool));
+
+  err = svn_fs_node_proplist(props, fs_root, path, result_pool);
+  if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
+    {
+      svn_error_clear(err);
+      *props = apr_hash_make(result_pool);
+      return SVN_NO_ERROR;
+    }
+  else if (err)
+    return svn_error_trace(err);
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+fetch_kind_func(svn_kind_t *kind,
+                void *baton,
+                const char *path,
+                svn_revnum_t base_revision,
+                apr_pool_t *scratch_pool)
+{
+  server_baton_t *sb = baton;
+  svn_node_kind_t node_kind;
+  svn_fs_root_t *fs_root;
+
+  if (!SVN_IS_VALID_REVNUM(base_revision))
+    SVN_ERR(svn_fs_youngest_rev(&base_revision, sb->fs, scratch_pool));
+
+  if (svn_path_is_url(path))
+    {
+      /* This is a copyfrom URL. */
+      path = svn_uri_skip_ancestor(sb->repos_url, path, scratch_pool);
+      path = svn_fspath__canonicalize(path, scratch_pool);
+    }
+  else
+    {
+      /* This is a base-relative path. */
+      if (path[0] != '/')
+        /* Get an absolute path for use in the FS. */
+        path = svn_fspath__join(sb->fs_path->data, path, scratch_pool);
+    }
+
+  SVN_ERR(svn_fs_revision_root(&fs_root, sb->fs, base_revision, scratch_pool));
+
+  SVN_ERR(svn_fs_check_path(&node_kind, fs_root, path, scratch_pool));
+  *kind = svn__kind_from_node_kind(node_kind, FALSE);
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+fetch_base_func(const char **filename,
+                void *baton,
+                const char *path,
+                svn_revnum_t base_revision,
+                apr_pool_t *result_pool,
+                apr_pool_t *scratch_pool)
+{
+  server_baton_t *sb = baton;
+  svn_stream_t *contents;
+  svn_stream_t *file_stream;
+  const char *tmp_filename;
+  svn_fs_root_t *fs_root;
+  svn_error_t *err;
+
+  if (!SVN_IS_VALID_REVNUM(base_revision))
+    SVN_ERR(svn_fs_youngest_rev(&base_revision, sb->fs, scratch_pool));
+
+  if (svn_path_is_url(path))
+    {
+      /* This is a copyfrom URL. */
+      path = svn_uri_skip_ancestor(sb->repos_url, path, scratch_pool);
+      path = svn_fspath__canonicalize(path, scratch_pool);
+    }
+  else
+    {
+      /* This is a base-relative path. */
+      if (path[0] != '/')
+        /* Get an absolute path for use in the FS. */
+        path = svn_fspath__join(sb->fs_path->data, path, scratch_pool);
+    }
+
+  SVN_ERR(svn_fs_revision_root(&fs_root, sb->fs, base_revision, scratch_pool));
+
+  err = svn_fs_file_contents(&contents, fs_root, path, scratch_pool);
+  if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
+    {
+      svn_error_clear(err);
+      *filename = NULL;
+      return SVN_NO_ERROR;
+    }
+  else if (err)
+    return svn_error_trace(err);
+  SVN_ERR(svn_stream_open_unique(&file_stream, &tmp_filename, NULL,
+                                 svn_io_file_del_on_pool_cleanup,
+                                 scratch_pool, scratch_pool));
+  SVN_ERR(svn_stream_copy3(contents, file_stream, NULL, NULL, scratch_pool));
+
+  *filename = apr_pstrdup(result_pool, tmp_filename);
+
+  return SVN_NO_ERROR;
+}
+
 svn_error_t *serve(svn_ra_svn_conn_t *conn, serve_params_t *params,
                    apr_pool_t *pool)
 {
@@ -3257,5 +3368,18 @@ svn_error_t *serve(svn_ra_svn_conn_t *co
     SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!))"));
   }
 
+  /* Set up editor shims. */
+  {
+    svn_delta_shim_callbacks_t *callbacks =
+                                svn_delta_shim_callbacks_default(pool);
+
+    callbacks->fetch_base_func = fetch_base_func;
+    callbacks->fetch_props_func = fetch_props_func;
+    callbacks->fetch_kind_func = fetch_kind_func;
+    callbacks->fetch_baton = &b;
+
+    SVN_ERR(svn_ra_svn__set_shim_callbacks(conn, callbacks));
+  }
+
   return svn_ra_svn_handle_commands2(conn, pool, main_commands, &b, FALSE);
 }

Modified: subversion/branches/ev2-export/subversion/svnversion/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/svnversion/main.c?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/svnversion/main.c (original)
+++ subversion/branches/ev2-export/subversion/svnversion/main.c Mon Mar  5 20:34:22 2012
@@ -225,7 +225,7 @@ main(int argc, const char *argv[])
     }
 
   SVN_INT_ERR(svn_utf_cstring_to_utf8(&wc_path,
-                                      (os->ind < argc) ? os->argv[os->ind] 
+                                      (os->ind < argc) ? os->argv[os->ind]
                                                        : ".",
                                       pool));
 

Modified: subversion/branches/ev2-export/subversion/tests/README
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/README?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/README (original)
+++ subversion/branches/ev2-export/subversion/tests/README Mon Mar  5 20:34:22 2012
@@ -130,6 +130,47 @@ This same rule applies to Subversion dev
 bug, write a test for it. **
 
 
+When to file a related issue
+----------------------------
+
+By definition, if you write a new test which is set to XFail, then it
+assumed that the test is for a known bug.  In these cases it is
+recommended that you associate an issue in the issue tracker with the
+XFailing test.  This ensures that the issue tracker is the authoritative
+list of known bugs -- see http://subversion.tigris.org/issue-tracker.html.
+You may need to create a new issue if one doesn't already exist.
+
+For C tests simply add a comment noting any associated issue:
+
+    /* This is for issue #3234. */
+    static svn_error_t *
+    test_copy_crash(const svn_test_opts_t *opts,
+                    apr_pool_t *pool)
+    {
+      apr_array_header_t *sources;
+      svn_opt_revision_t rev;
+      .
+      .
+
+For Python tests use the @Issue() decorator (a summary comment of the
+issue never hurts either):
+
+    #---------------------------------------------------------------------
+    # Test for issue #3657 'dav update report handler in skelta mode can
+    # cause spurious conflicts'.
+    @Issue(3657)
+    @XFail()
+    def dav_skelta_mode_causes_spurious_conflicts(sbox):
+      "dav skelta mode can cause spurious conflicts"
+      .
+      .
+
+Of course it isn't *always* necessary to create an associated issue.
+If a the fix for an new XFailing test is imminent, you are probably
+better off simply fixing the bug and moving on.  Use common sense, but
+when in doubt associate a new issue.
+
+
 What not to test
 ----------------
 

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/README
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/README?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/README (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/README Mon Mar  5 20:34:22 2012
@@ -333,7 +333,8 @@ svntest/tree.py.  It will explain the ge
 
 Finally, try copying-and-pasting a simple test and then edit from
 there.  Don't forget to add your test to the 'test_list' variable at
-the bottom of the file.
+the bottom of the file. To avoid renumbering of existing tests, you
+should add new tests to the end of the list.
 
 
 Testing Compatability With Previous Release

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/authz_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/authz_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/authz_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/authz_tests.py Mon Mar  5 20:34:22 2012
@@ -1383,7 +1383,7 @@ def upgrade_absent(sbox):
   # Relocate to allow finding the repository
   svntest.actions.run_and_verify_svn(None, None, [], 'relocate',
                                      'svn://127.0.0.1/authz_tests-2',
-                                     sbox.repo_url, sbox.wc_dir)  
+                                     sbox.repo_url, sbox.wc_dir)
 
   expected_output = svntest.wc.State(sbox.wc_dir, {
   })

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/basic_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/basic_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/basic_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/basic_tests.py Mon Mar  5 20:34:22 2012
@@ -991,7 +991,7 @@ def verify_file_deleted(message, path):
   if message is not None:
     print(message)
   ###TODO We should raise a less generic error here. which?
-  raise Failure
+  raise svntest.Failure
 
 def verify_dir_deleted(path):
   if not os.path.isdir(path):
@@ -2898,17 +2898,17 @@ def rm_missing_with_case_clashing_ondisk
 
   iota_path = os.path.join(wc_dir, 'iota')
   IOTA_path = os.path.join(wc_dir, 'IOTA')
-  
+
   # Out-of-svn move, to make iota missing, while IOTA appears as unversioned.
   os.rename(iota_path, IOTA_path)
-  
+
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
   expected_status.add({
     'iota'              : Item(status='! ', wc_rev='1'),
     'IOTA'              : Item(status='? '),
     })
   svntest.actions.run_and_verify_unquiet_status(wc_dir, expected_status)
-    
+
   # 'svn rm' iota, should leave IOTA alone.
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'rm', iota_path)
@@ -2922,6 +2922,29 @@ def rm_missing_with_case_clashing_ondisk
   svntest.actions.run_and_verify_unquiet_status(wc_dir, expected_status)
 
 
+def delete_conflicts_one_of_many(sbox):
+  """delete multiple targets one conflict"""
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  svntest.main.file_append(sbox.ospath('A/D/G/rho'), 'new rho')
+  sbox.simple_commit()
+  svntest.main.file_append(sbox.ospath('A/D/G/rho'), 'conflict rho')
+  svntest.actions.run_and_verify_svn(None, None, [],
+                                     'update', '-r1', '--accept', 'postpone',
+                                     wc_dir)
+
+  if not os.path.exists(sbox.ospath('A/D/G/rho.mine')):
+    raise svntest.Failure("conflict file rho.mine missing")
+
+  svntest.actions.run_and_verify_svn(None, None, [],
+                                     'rm', '--force',
+                                     sbox.ospath('A/D/G/rho'),
+                                     sbox.ospath('A/D/G/tau'))
+
+  verify_file_deleted("failed to remove conflict file",
+                      sbox.ospath('A/D/G/rho.mine'))
 
 ########################################################################
 # Run the tests
@@ -2988,6 +3011,7 @@ test_list = [ None,
               add_multiple_targets,
               quiet_commits,
               rm_missing_with_case_clashing_ondisk_item,
+              delete_conflicts_one_of_many,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/commit_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/commit_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/commit_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/commit_tests.py Mon Mar  5 20:34:22 2012
@@ -1140,7 +1140,7 @@ def commit_in_dir_scheduled_for_addition
   mu_path = os.path.join(wc_dir, 'Z', 'mu')
 
   svntest.main.run_svn(None, 'move', A_path, Z_path)
-  
+
   # Make sure mu is a committable
   svntest.main.file_write(mu_path, "xxxx")
 
@@ -1183,7 +1183,7 @@ def commit_in_dir_scheduled_for_addition
                                         "svn: E200009: '" +
                                         re.escape(Z_abspath) +
                                         "' is not known to exist in the.*",
-                                        R_path)                                        
+                                        R_path)
 
 #----------------------------------------------------------------------
 
@@ -2846,7 +2846,7 @@ def commit_incomplete(sbox):
                                         expected_status,
                                         None,
                                         wc_dir)
-  
+
 #----------------------------------------------------------------------
 # Reported here:
 #   Message-ID: <4E...@gmail.com>

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/copy_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/copy_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/copy_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/copy_tests.py Mon Mar  5 20:34:22 2012
@@ -5559,10 +5559,17 @@ def wc_wc_copy_incomplete(sbox):
   sbox.build()
   wc_dir = sbox.wc_dir
 
+  # We don't know what order the copy will do children of A/B so
+  # remove files so that only subdirs remain then all children can be
+  # marked incomplete.
+  sbox.simple_rm('A/B/lambda')
+  sbox.simple_commit()
+  sbox.simple_update()
+
   # We don't know whether copy will do E or F first, so make both
   # incomplete
-  svntest.actions.set_incomplete(sbox.ospath('A/B/E'), 1)
-  svntest.actions.set_incomplete(sbox.ospath('A/B/F'), 1)
+  svntest.actions.set_incomplete(sbox.ospath('A/B/E'), 2)
+  svntest.actions.set_incomplete(sbox.ospath('A/B/F'), 2)
 
   # Copy fails with no changes to wc
   svntest.actions.run_and_verify_svn(None, None,
@@ -5570,7 +5577,8 @@ def wc_wc_copy_incomplete(sbox):
                                      'copy',
                                      sbox.ospath('A/B/E'),
                                      sbox.ospath('A/B/E2'))
-  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 2)
+  expected_status.remove('A/B/lambda')
   expected_status.tweak('A/B/E', 'A/B/F', status='! ')
   svntest.actions.run_and_verify_status(wc_dir, expected_status)
 
@@ -5585,7 +5593,6 @@ def wc_wc_copy_incomplete(sbox):
       'A/B2'        : Item(status='A ', copied='+', wc_rev='-'),
       'A/B2/E'      : Item(status='! ', wc_rev='-'),
       'A/B2/F'      : Item(status='! ', wc_rev='-'),
-      'A/B2/lambda' : Item(status='  ', copied='+', wc_rev='-'),
       })
   ### Can't get this to work as copied status of E and F in 1.6
   ### entries tree doesn't match 1.7 status tree
@@ -5595,10 +5602,10 @@ def wc_wc_copy_incomplete(sbox):
   expected_output = svntest.wc.State(wc_dir, {
       'A/B2': Item(verb='Adding'),
       })
-  expected_status.tweak('A/B2', 'A/B2/lambda',
-                        status='  ', copied=None, wc_rev=2)
+  expected_status.tweak('A/B2',
+                        status='  ', copied=None, wc_rev=3)
   expected_status.tweak('A/B2/E', 'A/B2/F',
-                        status='! ', copied=None, wc_rev=2)
+                        status='! ', copied=None, wc_rev=3)
   ### E and F are status '!' but the test code ignores them?
   expected_status.remove('A/B2/E', 'A/B2/F')
   svntest.actions.run_and_verify_commit(wc_dir,
@@ -5606,8 +5613,8 @@ def wc_wc_copy_incomplete(sbox):
                                         expected_status,
                                         None, wc_dir)
   expected_status.add({
-      'A/B2/E'       : Item(status='! ', wc_rev=2),
-      'A/B2/F'       : Item(status='! ', wc_rev=2),
+      'A/B2/E'       : Item(status='! ', wc_rev=3),
+      'A/B2/F'       : Item(status='! ', wc_rev=3),
       })
 
   # Update makes things complete
@@ -5617,10 +5624,10 @@ def wc_wc_copy_incomplete(sbox):
       'A/B2/E/beta'  : Item(status='A '),
       'A/B2/F'       : Item(status='A '),
       })
-  expected_status.tweak(wc_rev=2, status='  ')
+  expected_status.tweak(wc_rev=3, status='  ')
   expected_status.add({
-      'A/B2/E/alpha' : Item(status='  ', wc_rev=2),
-      'A/B2/E/beta'  : Item(status='  ', wc_rev=2),
+      'A/B2/E/alpha' : Item(status='  ', wc_rev=3),
+      'A/B2/E/beta'  : Item(status='  ', wc_rev=3),
       })
   svntest.actions.run_and_verify_update(wc_dir,
                                         expected_output,

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/davautocheck.sh
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/davautocheck.sh?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/davautocheck.sh (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/davautocheck.sh Mon Mar  5 20:34:22 2012
@@ -292,9 +292,22 @@ $LOAD_MOD_AUTHZ_USER
 $LOAD_MOD_AUTHZ_HOST
 LoadModule          authz_svn_module "$MOD_AUTHZ_SVN"
 
+__EOF__
+
+if "$HTTPD" -v | grep '/2\.[012]' >/dev/null; then
+  cat >> "$HTTPD_CFG" <<__EOF__
 LockFile            lock
 User                $(id -un)
 Group               $(id -gn)
+__EOF__
+else
+  cat >> "$HTTPD_CFG" <<__EOF__
+# TODO: maybe uncomment this for prefork,worker MPMs only?
+# Mutex file:lock mpm-accept
+__EOF__
+fi
+
+cat >> "$HTTPD_CFG" <<__EOF__
 Listen              $HTTPD_PORT
 ServerName          localhost
 PidFile             "$HTTPD_PID"

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/depth_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/depth_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/depth_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/depth_tests.py Mon Mar  5 20:34:22 2012
@@ -2842,6 +2842,49 @@ def update_below_depth_empty(sbox):
   svntest.actions.run_and_verify_update(sbox.wc_dir, expected_output, None,
                                         None, None)
 
+# Test for issue #4136.
+@XFail()
+@Issue(4136)
+def commit_then_immediates_update(sbox):
+  "deep commit followed by update --depth immediates"
+  sbox.build()
+
+  repo_url = sbox.repo_url
+  wc_dir = sbox.wc_dir
+  mu_path = sbox.ospath('A/mu')
+
+  # Modify A/mu and commit the changes.
+  svntest.main.file_write(mu_path, "modified mu\n")
+  expected_output = svntest.wc.State(wc_dir, {
+    'A/mu'        : Item(verb='Sending'),
+    })
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.tweak('A/mu', wc_rev=2, status='  ')
+  svntest.actions.run_and_verify_commit(wc_dir,
+                                        expected_output,
+                                        expected_status,
+                                        None,
+                                        wc_dir)
+
+  # Now, update --depth immediates in the root of the working copy.
+  expected_output = svntest.wc.State(wc_dir, { })
+  expected_disk = svntest.main.greek_state.copy()
+  expected_disk.tweak('A/mu', contents="modified mu\n")
+  expected_status = svntest.wc.State(wc_dir, { '' : svntest.wc.StateItem() })
+  expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+  expected_status.tweak('',     wc_rev=2, status='  ')
+  expected_status.tweak('A',    wc_rev=2, status='  ')
+  expected_status.tweak('A/mu', wc_rev=2, status='  ')
+  expected_status.tweak('iota', wc_rev=2, status='  ')
+  svntest.actions.run_and_verify_update(wc_dir,
+                                        expected_output,
+                                        expected_disk,
+                                        expected_status,
+                                        None, None, None, None, None, False,
+                                        "--depth=immediates", wc_dir)
+  
+
+
 #----------------------------------------------------------------------
 # list all tests here, starting with None:
 test_list = [ None,
@@ -2889,6 +2932,7 @@ test_list = [ None,
               update_depth_empty_root_of_infinite_children,
               sparse_update_with_dash_dash_parents,
               update_below_depth_empty,
+              commit_then_immediates_update,
               ]
 
 if __name__ == "__main__":

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/diff_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/diff_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/diff_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/diff_tests.py Mon Mar  5 20:34:22 2012
@@ -161,7 +161,7 @@ def make_diff_prop_val(plus_minus, pval)
   if len(pval) > 0 and pval[-1] != '\n':
     return [plus_minus + pval + "\n","\\ No newline at end of property\n"]
   return [plus_minus + pval]
-  
+
 def make_diff_prop_deleted(pname, pval):
   """Return a property diff for deletion of property PNAME, old value PVAL.
      PVAL is a single string with no embedded newlines.  Return the result
@@ -1169,8 +1169,10 @@ def diff_base_to_repos(sbox):
     if not re_infoline.match(line):
       list2.append(line)
 
-  if list1 != list2:
-    raise svntest.Failure
+  # Two files in diff may be in any order.
+  list1 = svntest.verify.UnorderedOutput(list1)
+
+  svntest.verify.compare_and_display_lines('', '', list1, list2)
 
 
 #----------------------------------------------------------------------
@@ -3588,6 +3590,9 @@ def diff_git_empty_files(sbox):
   ] + make_git_diff_header(iota_path, "iota", "revision 2", "working copy",
                            delete=True, text_changes=False)
 
+  # Two files in diff may be in any order.
+  expected_output = svntest.verify.UnorderedOutput(expected_output)
+
   svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff',
                                      '--git', wc_dir)
 
@@ -3628,6 +3633,9 @@ def diff_git_with_props(sbox):
                     make_diff_prop_header("iota") + \
                     make_diff_prop_added("svn:keywords", "Id")
 
+  # Files in diff may be in any order.
+  expected_output = svntest.verify.UnorderedOutput(expected_output)
+
   svntest.actions.run_and_verify_svn(None, expected_output, [], 'diff',
                                      '--git', wc_dir)
 

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/externals_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/externals_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/externals_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/externals_tests.py Mon Mar  5 20:34:22 2012
@@ -1916,14 +1916,25 @@ def file_externals_different_url(sbox):
     'rr-e-1'            : Item(status='A '),
   })
 
+  expected_status = actions.get_virginal_state(wc_dir, 1)
+  expected_status.tweak('', status=' M')
+  expected_status.add({
+    'r2-e-1'            : Item(status='  ', wc_rev='1', switched='X'),
+    'r1-e-1'            : Item(status='  ', wc_rev='1', switched='X'),
+    'r1-e-2'            : Item(status='  ', wc_rev='1', switched='X'),
+    'rr-e-1'            : Item(status='  ', wc_rev='1', switched='X'),
+    'r2-e-2'            : Item(status='  ', wc_rev='1', switched='X'),
+  })
+
   svntest.actions.run_and_verify_update(wc_dir,
-                                        expected_output, None, None, None)
+                                        expected_output, None,
+                                        expected_status, None)
 
   # Verify that all file external URLs are descendants of r1_url
   for e in ['r1-e-1', 'r1-e-2', 'r2-e-1', 'r2-e-2', 'rr-e-1']:
     actions.run_and_verify_info([{'Repository Root' : r1_url}],
                                 os.path.join(sbox.wc_dir, e))
-    
+
 
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'relocate', r1_url, r2_url, wc_dir)
@@ -1934,7 +1945,8 @@ def file_externals_different_url(sbox):
   })
 
   svntest.actions.run_and_verify_update(wc_dir,
-                                        expected_output, None, None, None)
+                                        expected_output, None,
+                                        expected_status, None)
 
   # Verify that all file external URLs are descendants of r2_url
   for e in ['r1-e-1', 'r1-e-2', 'r2-e-1', 'r2-e-2', 'rr-e-1']:
@@ -2554,10 +2566,10 @@ def include_immediate_dir_externals(sbox
   #     svn ps svn:externals "^/A/B/E X/XE" wc_dir
   #     svn ci
   #     svn up
-  # 
+  #
   #     svn ps some change X/XE
   #     echo mod >> X/XE/alpha
-  # 
+  #
   #     svn st X/XE
   #     # Expect only the propset on X/XE to be committed.
   #     # Should be like 'svn commit --include-externals --depth=empty X/XE'.
@@ -2785,6 +2797,73 @@ def dir_external_with_dash_r_only(sbox):
   expected_info = { 'Revision': '1' }
   actions.run_and_verify_info([expected_info], E_ext)
 
+# Test for issue #4123 'URL-to-WC copy of externals fails on Windows'
+@Issue(4123)
+def url_to_wc_copy_of_externals(sbox):
+  "url-to-wc copy of externals"
+
+  sbox.build()
+
+  wc_dir = sbox.wc_dir
+  repo_url = sbox.repo_url
+
+  # Create an external A/C/external pointing to ^/A/D/G.
+  svntest.actions.run_and_verify_svn(None, None, [], 'ps',
+                                     'svn:externals', '^/A/D/G external',
+                                     os.path.join(wc_dir, 'A', 'C'))
+  svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
+                                     'create an external', wc_dir)
+  svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
+
+  # Copy ^/A/C to External-WC-to-URL-Copy.
+  #
+  # Previously this failed with:
+  #   >svn copy ^^/A/C External-WC-to-URL-Copy
+  #    U   External-WC-to-URL-Copy
+  #
+  #   Fetching external item into 'External-WC-to-URL-Copy\external':
+  #   A    External-WC-to-URL-Copy\external\pi
+  #   A    External-WC-to-URL-Copy\external\rho
+  #   A    External-WC-to-URL-Copy\external\tau
+  #   Checked out external at revision 2.
+  #
+  #   Checked out revision 2.
+  #   ..\..\..\subversion\libsvn_client\copy.c:2249: (apr_err=720005)
+  #   ..\..\..\subversion\libsvn_client\copy.c:1857: (apr_err=720005)
+  #   ..\..\..\subversion\libsvn_client\copy.c:1857: (apr_err=720005)
+  #   ..\..\..\subversion\libsvn_client\copy.c:1737: (apr_err=720005)
+  #   ..\..\..\subversion\libsvn_client\copy.c:1737: (apr_err=720005)
+  #   ..\..\..\subversion\libsvn_client\copy.c:1537: (apr_err=720005)
+  #   ..\..\..\subversion\libsvn_subr\io.c:3416: (apr_err=720005)
+  #   svn: E720005: Can't move 'C:\SVN\src-trunk-3\Debug\subversion\tests\
+  #   cmdline\svn-test-work\working_copies\externals_tests-41\.svn\tmp\
+  #   svn-F9E2C0EC' to 'C:\SVN\src-trunk-3\Debug\subversion\tests\cmdline\
+  #   svn-test-work\working_copies\externals_tests-41\External-WC-to-URL-Copy':
+  #   Access is denied.
+  external_root_path = os.path.join(wc_dir, "External-WC-to-URL-Copy")
+  external_ex_path = os.path.join(wc_dir, "External-WC-to-URL-Copy",
+                                  "external")
+  external_pi_path = os.path.join(wc_dir, "External-WC-to-URL-Copy",
+                                  "external", "pi")
+  external_rho_path = os.path.join(wc_dir, "External-WC-to-URL-Copy",
+                                   "external", "rho")
+  external_tau_path = os.path.join(wc_dir, "External-WC-to-URL-Copy",
+                                   "external", "tau")
+  expected_stdout = verify.UnorderedOutput([
+    "\n",
+    " U   " + external_root_path + "\n",
+    "Fetching external item into '" + external_ex_path + "':\n",
+    "A    " + external_pi_path + "\n",
+    "A    " + external_rho_path + "\n",
+    "A    " + external_tau_path + "\n",
+    "Checked out external at revision 2.\n",
+    "Checked out revision 2.\n",
+    "A         " + external_root_path + "\n"
+  ])
+  exit_code, stdout, stderr = svntest.actions.run_and_verify_svn2(
+    "OUTPUT", expected_stdout, [], 0, 'copy', repo_url + '/A/C',
+    os.path.join(wc_dir, 'External-WC-to-URL-Copy'))
+
 ########################################################################
 # Run the tests
 
@@ -2831,6 +2910,7 @@ test_list = [ None,
               shadowing,
               remap_file_external_with_prop_del,
               dir_external_with_dash_r_only,
+              url_to_wc_copy_of_externals,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/info_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/info_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/info_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/info_tests.py Mon Mar  5 20:34:22 2012
@@ -469,7 +469,7 @@ def info_show_exclude(sbox):
 
   sbox.simple_rm('iota')
   sbox.simple_commit()
-  
+
   expected_error = 'svn: E200009: Could not display info for all targets.*'
 
   # Expect error on iota (status = not-present)

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/lock_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/lock_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/lock_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/lock_tests.py Mon Mar  5 20:34:22 2012
@@ -1172,6 +1172,8 @@ def repos_lock_with_info(sbox):
 
 
 #----------------------------------------------------------------------
+@Issue(4126)
+@Skip(svntest.main.is_ra_type_dav_serf) # Issue 4126 unpredictable result
 def unlock_already_unlocked_files(sbox):
   "(un)lock set of files, one already (un)locked"
 

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/log_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/log_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/log_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/log_tests.py Mon Mar  5 20:34:22 2012
@@ -2198,6 +2198,25 @@ def log_diff(sbox):
   compare_diff_output(r9diff, log_chain[1]['diff_lines'])
   compare_diff_output(r8diff, log_chain[2]['diff_lines'])
 
+def log_xml_old(sbox):
+  "log --xml shows kind for old style repository"
+
+  sbox.build(minor_version=5)
+
+  sbox.simple_copy('A/B', 'A/B2')
+  sbox.simple_rm('A/B/lambda', 'A/B/E', 'A/B2/lambda', 'A/B2/E')
+  sbox.simple_commit()
+
+  os.chdir(sbox.wc_dir)
+  paths=[{'/A/B/E'       : [{'kind':'dir',  'action':'D'}],
+          '/A/B/lambda'  : [{'kind':'file', 'action':'D'}],
+          '/A/B2'        : [{'kind':'dir',  'action':'A'}],
+          '/A/B2/E'      : [{'kind':'dir',  'action':'D'}],
+          '/A/B2/lambda' : [{'kind':'file', 'action':'D'}]}]
+  svntest.actions.run_and_verify_log_xml(args=['-r', '2', '-v'],
+                                         expected_paths=paths)
+
+
 
 ########################################################################
 # Run the tests
@@ -2240,6 +2259,7 @@ test_list = [ None,
               log_on_nonexistent_path_and_valid_rev,
               merge_sensitive_log_copied_path_inherited_mergeinfo,
               log_diff,
+              log_xml_old,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/merge_authz_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/merge_authz_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/merge_authz_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/merge_authz_tests.py Mon Mar  5 20:34:22 2012
@@ -443,7 +443,7 @@ def mergeinfo_and_skipped_paths(sbox):
   # and skipped). 'A_COPY_2/D/H/zeta' must therefore get its own explicit
   # mergeinfo from this merge.
   svntest.actions.run_and_verify_svn(None, None, [], 'revert', '--recursive',
-                                     wc_restricted)  
+                                     wc_restricted)
   expected_output = wc.State(A_COPY_2_H_path, {
     'omega' : Item(status='U '),
     'zeta'  : Item(status='A '),

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/merge_reintegrate_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/merge_reintegrate_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/merge_reintegrate_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/merge_reintegrate_tests.py Mon Mar  5 20:34:22 2012
@@ -2430,7 +2430,7 @@ def reintegrate_replaced_source(sbox):
   A_path         = os.path.join(sbox.wc_dir, "A")
   A_COPY_path    = os.path.join(sbox.wc_dir, "A_COPY")
   beta_COPY_path = os.path.join(sbox.wc_dir, "A_COPY", "B", "E", "beta")
-  mu_COPY_path   = os.path.join(sbox.wc_dir, "A_COPY", "mu")  
+  mu_COPY_path   = os.path.join(sbox.wc_dir, "A_COPY", "mu")
 
   # Using cherrypick merges, simulate a series of sync merges from A to
   # A_COPY with a replace of A_COPY along the way.
@@ -2470,7 +2470,7 @@ def reintegrate_replaced_source(sbox):
                        wc_dir)
 
   # r12 - Do a final sync merge of A to A_COPY in preparation for
-  # reintegration.  
+  # reintegration.
   svntest.main.run_svn(None, 'up', wc_dir)
   svntest.main.run_svn(None, 'merge', sbox.repo_url + '/A', A_COPY_path)
   svntest.main.run_svn(None, 'ci', '-m', 'Sycn A_COPY with A', wc_dir)
@@ -2541,10 +2541,9 @@ def reintegrate_replaced_source(sbox):
                                        expected_skip,
                                        [], None, None, None, None, True, True,
                                        '--reintegrate', A_path)
-  
+
 #----------------------------------------------------------------------
 @SkipUnless(svntest.main.is_posix_os)
-@XFail()
 @Issue(4052)
 def reintegrate_symlink_deletion(sbox):
   "reintegrate symlink deletion"

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/merge_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/merge_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/merge_tests.py Mon Mar  5 20:34:22 2012
@@ -14124,11 +14124,13 @@ def merge_range_prior_to_rename_source_e
                                      'move', sbox.repo_url + '/A/D/H/nu',
                                      sbox.repo_url + '/A/D/H/nu_moved',
                                      '-m', 'Move nu to nu_moved')
-  svntest.actions.run_and_verify_svn(None,
-                                     ["Updating '%s':\n" % (wc_dir),
-                                      "D    " + nu_path + "\n",
-                                      "A    " + nu_moved_path + "\n",
-                                      "Updated to revision 12.\n"],
+  expected_output = svntest.verify.UnorderedOutput(
+    ["Updating '%s':\n" % (wc_dir),
+     "D    " + nu_path + "\n",
+     "A    " + nu_moved_path + "\n",
+     "Updated to revision 12.\n"],
+    )
+  svntest.actions.run_and_verify_svn(None, expected_output,
                                      [], 'up', wc_dir)
 
   # Now merge -r7:12 from A to A_COPY.
@@ -17018,7 +17020,7 @@ def merged_deletion_causes_tree_conflict
                                      '-m', 'Copy ^/A to ^/branch')
   svntest.actions.run_and_verify_svn(None, None, [], 'up', wc_dir)
 
-  # r4 - Delete A/D/H/psi 
+  # r4 - Delete A/D/H/psi
   svntest.actions.run_and_verify_svn(None, None, [], 'delete', psi_path)
   svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
                                      'Delete a a path with native eol-style',
@@ -17213,7 +17215,7 @@ def unnecessary_noninheritable_mergeinfo
 
   B_branch_path = os.path.join(sbox.wc_dir, 'branch', 'B')
 
-  # Setup a simple branch to which 
+  # Setup a simple branch to which
   expected_output, expected_mergeinfo_output, expected_elision_output, \
     expected_status, expected_disk, expected_skip = \
     noninheritable_mergeinfo_test_set_up(sbox)
@@ -17258,7 +17260,7 @@ def unnecessary_noninheritable_mergeinfo
   B_branch_path = os.path.join(sbox.wc_dir, 'branch', 'B')
   E_path        = os.path.join(sbox.wc_dir, 'A', 'B', 'E')
 
-  # Setup a simple branch to which 
+  # Setup a simple branch to which
   expected_output, expected_mergeinfo_output, expected_elision_output, \
     expected_status, expected_disk, expected_skip = \
     noninheritable_mergeinfo_test_set_up(sbox)
@@ -17316,7 +17318,7 @@ def unnecessary_noninheritable_mergeinfo
   #       /A/B:4* <-- Should be inheritable
   #   Properties on 'branch\B\E':
   #     svn:mergeinfo
-  #       /A/B/E:4 <-- Not necessary 
+  #       /A/B/E:4 <-- Not necessary
   expected_output = wc.State(B_branch_path, {
     'E' : Item(status=' U'),
     })
@@ -17355,6 +17357,55 @@ def unnecessary_noninheritable_mergeinfo
                                        None, None, None, None, None, 1, 1,
                                        '--depth', 'immediates', B_branch_path)
 
+#----------------------------------------------------------------------
+# Test for issue #4132, "merge of replaced source asserts".
+# The original use-case is the following merges, which both asserted:
+#    svn merge -cr1295005 ^/subversion/trunk@1295000 ../src
+#    svn merge -cr1295004 ^/subversion/trunk/@r1295004 ../src
+@Issue(4132)
+@XFail()
+def svnmucc_abuse_1(sbox):
+  "svnmucc: merge a replacement"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  ## Using A/ as our trunk, since one cannot replace the root.
+
+  ## r2: open a branch
+  sbox.simple_repo_copy('A', 'A_COPY')
+
+  ## r3: padding (to make the revnums-mod-10 match)
+  sbox.simple_repo_copy('iota', 'padding')
+
+  ## r4: trunk: accidental change
+  sbox.simple_append('A/mu', 'accidental change')
+  sbox.simple_commit()
+
+  ## r5: fail to revert it
+  svntest.actions.run_and_verify_svnmucc(None, None, [],
+                                         '-m', 'r5',
+                                         '-U', sbox.repo_url,
+                                         'rm', 'A',
+                                         'cp', 'HEAD', 'A', 'A')
+
+  ## r6: really revert it
+  svntest.actions.run_and_verify_svnmucc(None, None, [],
+                                         '-m', 'r6',
+                                         '-U', sbox.repo_url,
+                                         'rm', 'A',
+                                         'cp', '3', 'A', 'A')
+
+  ## Attempt to merge that.
+  # This used to assert:
+  #   --- Recording mergeinfo for merge of r5 into 'svn-test-work/working_copies/merge_tests-125/A_COPY':
+  #   subversion/libsvn_subr/mergeinfo.c:1172: (apr_err=235000)
+  #   svn: E235000: In file 'subversion/libsvn_subr/mergeinfo.c' line 1172: assertion failed (IS_VALID_FORWARD_RANGE(first))
+  sbox.simple_update()
+  svntest.main.run_svn(None, 'merge', '-c', 'r5', '^/A@r5',
+                             sbox.ospath('A_COPY'))
+
+
 ########################################################################
 # Run the tests
 
@@ -17485,6 +17536,7 @@ test_list = [ None,
               record_only_merge_adds_new_subtree_mergeinfo,
               unnecessary_noninheritable_mergeinfo_missing_subtrees,
               unnecessary_noninheritable_mergeinfo_shallow_merge,
+              svnmucc_abuse_1,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/mergeinfo_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/mergeinfo_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/mergeinfo_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/mergeinfo_tests.py Mon Mar  5 20:34:22 2012
@@ -532,7 +532,7 @@ def wc_target_inherits_mergeinfo_from_re
   gamma_2_path  = os.path.join(wc_dir, 'A_COPY_2', 'D', 'gamma')
   tau_path      = os.path.join(wc_dir, 'A', 'D', 'G', 'tau')
   D_COPY_path   = os.path.join(wc_dir, 'A_COPY', 'D')
-  
+
   # Merge -c5 ^/A/D/G/rho A_COPY\D\G\rho
   # Merge -c7 ^/A A_COPY
   # Commit as r8
@@ -565,7 +565,7 @@ def wc_target_inherits_mergeinfo_from_re
   # Check the merged and eligible revisions both recursively and
   # non-recursively.
 
-  # Eligible : Non-recursive  
+  # Eligible : Non-recursive
   svntest.actions.run_and_verify_mergeinfo(
     adjust_error_for_server_version(''),
     ['4','5'], sbox.repo_url + '/A/D', subtree_wc,
@@ -618,7 +618,7 @@ def wc_target_inherits_mergeinfo_from_re
   svntest.actions.run_and_verify_svn(None, None, [], 'ci', '-m',
                                      'Merge r8 from A_COPY_2 to A_COPY',
                                      wc_dir)
- 
+
   def test_svn_mergeinfo_4_way(wc_target):
     # Eligible : Non-recursive
     svntest.actions.run_and_verify_mergeinfo(
@@ -738,7 +738,7 @@ def noninheritabled_mergeinfo_not_always
   # unconditionally set for merges with shallow operational depths.
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'propset', SVN_PROP_MERGEINFO,
-                                     '/A:3*\n', branch_path)  
+                                     '/A:3*\n', branch_path)
   svntest.main.run_svn(None, 'commit', '-m', 'shallow merge', wc_dir)
 
   # Now check that r3 is reported as fully merged from ^/A to ^/branch

Modified: subversion/branches/ev2-export/subversion/tests/cmdline/patch_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/tests/cmdline/patch_tests.py?rev=1297221&r1=1297220&r2=1297221&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/tests/cmdline/patch_tests.py (original)
+++ subversion/branches/ev2-export/subversion/tests/cmdline/patch_tests.py Mon Mar  5 20:34:22 2012
@@ -2822,12 +2822,13 @@ def patch_prop_offset(sbox):
 
   os.chdir(wc_dir)
 
-  expected_output = [
+  # Changing two properties so output order not well defined.
+  expected_output = svntest.verify.UnorderedOutput([
     ' U        iota\n',
     '>         applied hunk ## -6,6 +6,9 ## with offset -1 (prop1)\n',
     '>         applied hunk ## -14,11 +17,8 ## with offset 4 (prop1)\n',
     '>         applied hunk ## -5,6 +5,7 ## with offset -3 (prop2)\n',
-  ]
+  ])
 
   expected_disk = svntest.main.greek_state.copy()
   expected_disk.tweak('iota', props = {'prop1' : prop1_content,
@@ -3726,7 +3727,7 @@ def patch_deletes_prop(sbox):
   # *adds* the property.
   svntest.main.run_svn(None, 'revert', iota_path)
 
-  # Apply patch 
+  # Apply patch
   unidiff_patch = [
     "Index: iota\n",
     "===================================================================\n",
@@ -3749,7 +3750,7 @@ def patch_deletes_prop(sbox):
                                        None, # expected err
                                        1, # check-props
                                        1, # dry-run
-                                       '--reverse-diff') 
+                                       '--reverse-diff')
 
 @Issue(4004)
 def patch_reversed_add_with_props(sbox):
@@ -3798,7 +3799,7 @@ def patch_reversed_add_with_props(sbox):
                                        None, # expected err
                                        1, # check-props
                                        1, # dry-run
-                                       '--reverse-diff') 
+                                       '--reverse-diff')
 
 @Issue(4004)
 def patch_reversed_add_with_props2(sbox):
@@ -3853,7 +3854,7 @@ def patch_reversed_add_with_props2(sbox)
                                        None, # expected err
                                        1, # check-props
                                        1, # dry-run
-                                       '--reverse-diff') 
+                                       '--reverse-diff')
 
 def patch_dev_null(sbox):
   "patch with /dev/null filenames"