You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2012/03/01 13:22:19 UTC

svn commit: r1295534 [2/3] - in /subversion/branches/1.7.x-issue4087: ./ build/generator/ subversion/bindings/swig/python/tests/trac/versioncontrol/tests/ subversion/include/private/ subversion/libsvn_client/ subversion/libsvn_fs_fs/ subversion/libsvn_...

Modified: subversion/branches/1.7.x-issue4087/subversion/po/zh_CN.po
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/po/zh_CN.po?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/po/zh_CN.po [UTF-8] (original)
+++ subversion/branches/1.7.x-issue4087/subversion/po/zh_CN.po [UTF-8] Thu Mar  1 12:22:17 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:14+0800\n"
-"PO-Revision-Date: 2011-12-22 13:41+0800\n"
+"POT-Creation-Date: 2012-02-27 09:18+0000\n"
+"PO-Revision-Date: 2012-02-27 09:18+0000\n"
 "Last-Translator: Subversion Developers <de...@subversion.apache.org>\n"
 "Language-Team: Simplified Chinese <de...@subversion.apache.org>\n"
 "Language: \n"
@@ -1136,12 +1136,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"
@@ -3189,6 +3185,10 @@ msgstr "版本库的 URL 非法"
 msgid "Unlock request failed: %d %s"
 msgstr "解锁请求失败: %d %s"
 
+#, c-format
+msgid "Unsupported encoding '%s'"
+msgstr "不支持的编码“%s”"
+
 msgid "The PROPFIND response did not include the requested baseline-collection value"
 msgstr "PROPFIND 响应中没有包含请求的 baseline-collection 值。"
 
@@ -3244,6 +3244,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)"
 
@@ -3450,12 +3454,20 @@ msgid "Unexpected server response to aut
 msgstr "服务器意外响应认证请求"
 
 #, c-format
+msgid "SASL authentication error: %s%s"
+msgstr "SASL 认证错误: %s%s"
+
+#, c-format
 msgid "Could not initialize the SASL library"
 msgstr "不能初始化 SASL 库"
 
 #, c-format
-msgid "SASL authentication error: %s"
-msgstr "SASL 认证失败: %s"
+msgid "Could not initialized the SASL library: %s%s"
+msgstr "不能初始化 SASL 库: %s%s"
+
+#, c-format
+msgid "Could not create SASL context: %s%s"
+msgstr "不能创建 SASL 上下文: %s%s"
 
 #, c-format
 msgid "Authentication error from server: %s"
@@ -4600,13 +4612,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"
@@ -5577,6 +5589,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”中"
 
@@ -6969,7 +6985,6 @@ msgstr "指定加锁注释ARG"
 msgid "force validity of lock comment source"
 msgstr "强制校验锁定注释源"
 
-#, fuzzy
 msgid ""
 "Show the log messages for a set of revision(s) and/or path(s).\n"
 "usage: 1. log [PATH][@REV]\n"
@@ -7030,6 +7045,8 @@ msgstr ""
 "  每条日志信息只会显示一次,即使指定了此版本涉及到的多个路径。默认日志信息\n"
 "  会追溯复制历史;使用 --stop-on-copy 可以关闭这种行为,这可以用来找出分支点。\n"
 "\n"
+"  选项 --depth 只能与选项 --diff 组合使用,用来限制在指定路径上显示差异的范围。\n"
+"\n"
 "  范例: \n"
 "    svn log\n"
 "    svn log foo.c\n"
@@ -7044,82 +7061,124 @@ msgstr "获取版本属性 ARG"
 msgid "the change made in revision ARG"
 msgstr "版本 ARG 引起的改变"
 
-msgid ""
-"Apply the differences between two sources to a working copy path.\n"
-"usage: 1. merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH]\n"
-"       2. merge --reintegrate SOURCE[@REV] [TARGET_WCPATH]\n"
-"       3. merge SOURCE1[@N] SOURCE2[@M] [TARGET_WCPATH]\n"
-"\n"
-"  1. The first form is called a \"sync\", or \"cherry-pick\", merge:\n"
-"     svn merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH]\n"
-"\n"
-"     A sync merge is used to merge into a branch any unmerged changes\n"
-"     made on its immediate ancestor branch.\n"
-"\n"
-"     A cherry-picking merge is used to merge specific revisions from\n"
-"     one branch to another.\n"
-"\n"
-"     SOURCE is usually a URL. The source of a cherry-picking merge can\n"
-"     also be a working copy path, in which case the corresponding URL\n"
-"     of the path is used.\n"
-"\n"
-"     If REV is specified, it is used as the peg revision for SOURCE,\n"
-"     i.e. SOURCE is looked up in the repository at revision REV.\n"
-"     If REV is not specified, the HEAD revision is assumed.\n"
-"\n"
-"     TARGET_WCPATH is a working copy of the branch the changes will\n"
-"     be applied to.\n"
-"\n"
-"     '-r N:M' specifies a revision range to be merged. The difference\n"
-"     between SOURCE@REV as it existed at revision N, and SOURCE@REV at\n"
-"     it existed at revision M, is merged into TARGET_WCPATH.  If no\n"
-"     revision range is specified, the default range of 0:REV is used.\n"
-"     \n"
-"     If mergeinfo within TARGET_WCPATH indicates that revisions within\n"
-"     the range were already merged, changes made in those revisions\n"
-"     are not merged again. If needed, the range is broken into multiple\n"
-"     sub-ranges, and each sub-range is merged separately.\n"
-"\n"
-"     If N is greater than M, the range is a \"reverse range\".\n"
-"     A reverse range can be used to undo changes made to SOURCE\n"
-"     between revisions N and M.\n"
+#. For this large section, let's keep it unindented for easier
+#. * viewing/editing. It has been vim-treated with a textwidth=75 and 'gw'
+#. * (with quotes and newlines removed).
+msgid ""
+"Merge changes into a working copy.\n"
+"usage: 1. merge SOURCE[@REV] [TARGET_WCPATH]\n"
+"          (the 'sync' merge)\n"
+"       2. merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH]\n"
+"          (the 'cherry-pick' merge)\n"
+"       3. merge --reintegrate SOURCE[@REV] [TARGET_WCPATH]\n"
+"          (the 'reintegrate' merge)\n"
+"       4. merge SOURCE1[@N] SOURCE2[@M] [TARGET_WCPATH]\n"
+"          (the '2-URL' merge)\n"
+"\n"
+"  1. This form is called a 'sync' (or 'catch-up') merge:\n"
+"\n"
+"       svn merge SOURCE[@REV] [TARGET_WCPATH]\n"
+"\n"
+"     A sync merge is used to fetch all the latest changes made on a parent\n"
+"     branch. In other words, the target branch has originally been created\n"
+"     by copying the source branch, and any changes committed on the source\n"
+"     branch since branching are applied to the target branch. This uses\n"
+"     merge tracking to skip all those revisions that have already been\n"
+"     merged, so a sync merge can be repeated periodically to stay up-to-\n"
+"     date with the source branch.\n"
+"\n"
+"     SOURCE specifies the branch from where the changes will be pulled, and\n"
+"     TARGET_WCPATH specifies a working copy of the target branch to which\n"
+"     the changes will be applied. Normally SOURCE and TARGET_WCPATH should\n"
+"     each correspond to the root of a branch. (If you want to merge only a\n"
+"     subtree, then the subtree path must be included in both SOURCE and\n"
+"     TARGET_WCPATH; this is discouraged, to avoid subtree mergeinfo.)\n"
+"\n"
+"     SOURCE is usually a URL. The optional '@REV' specifies both the peg\n"
+"     revision of the URL and the latest revision that will be considered\n"
+"     for merging; if REV is not specified, the HEAD revision is assumed. If\n"
+"     SOURCE is a working copy path, the corresponding URL of the path is\n"
+"     used, and the default value of 'REV' is the base revision (usually the\n"
+"     revision last updated to).\n"
 "\n"
-"     '-c M' is equivalent to the range '-r <M-1>:M'.\n"
-"     '-c -M' does the reverse: '-r M:<M-1>'.\n"
-"     \n"
-"     Multiple '-c' and/or '-r' options may be specified and mixing of\n"
-"     forward and reverse ranges is allowed.\n"
+"     TARGET_WCPATH is a working copy path; if omitted, '.' is assumed.\n"
 "\n"
 "       - Sync Merge Example -\n"
 "\n"
-"     A feature is being developed on a branch called \"feature\".\n"
-"     The feature branch is regularly synced with trunk to keep up with\n"
-"     changes made there.\n"
-"\n"
-"                 feature  +------------------------o-----\n"
-"                         /                         ^\n"
-"                        /                         /\n"
-"                       /          .............../\n"
+"     A feature is being developed on a branch called 'feature', which has\n"
+"     originally been a copy of trunk. The feature branch has been regularly\n"
+"     synced with trunk to keep up with the changes made there. The previous\n"
+"     sync merges are not shown on this diagram, and the last of them was\n"
+"     done when HEAD was r100. Currently, HEAD is r200.\n"
+"\n"
+"                feature  +------------------------o-----\n"
+"                        /                         ^\n"
+"                       /            ............  |\n"
+"                      /            .            . /\n"
 "         trunk ------+------------L--------------R------\n"
 "                                r100           r200\n"
-"     \n"
-"     In the above diagram, L marks the \"left\" side of the merge\n"
-"     (trunk@100), and R marks the \"right\" side of the merge (trunk@200).\n"
-"     The difference between the left and right side is merged into the target.\n"
-"\n"
-"     To perform the merge, check out a working copy of the feature\n"
-"     branch and run the following command in the top-level directory\n"
-"     of the working copy:\n"
+"\n"
+"     Subversion will locate all the changes on 'trunk' that have not yet\n"
+"     been merged into the 'feature' branch. In this case that is a single\n"
+"     range, r100:200. In the diagram above, L marks the left side\n"
+"     (trunk@100) and R marks the right side (trunk@200) of the merge. The\n"
+"     difference between L and R will be applied to the target working copy\n"
+"     path. In this case, the working copy is a clean checkout of the entire\n"
+"     'feature' branch.\n"
+"\n"
+"     To perform this sync merge, have a clean working copy of the feature\n"
+"     branch and run the following command in its top-level directory:\n"
 "\n"
 "         svn merge ^/trunk\n"
 "\n"
-"     The default revision range is -r0:HEAD, so any unmerged changes\n"
-"     will be merged.\n"
+"     Note that the merge is now only in your local working copy and still\n"
+"     needs to be committed to the repository so that it can be seen by\n"
+"     others. You can review the changes and you may have to resolve\n"
+"     conflicts before you commit the merge.\n"
+"\n"
+"\n"
+"  2. This form is called a 'cherry-pick' merge:\n"
+"\n"
+"       svn merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH]\n"
+"\n"
+"     A cherry-pick merge is used to merge specific revisions (or revision\n"
+"     ranges) from one branch to another. By default, this uses merge\n"
+"     tracking to automatically skip any revisions that have already been\n"
+"     merged to the target; you can use the --ignore-ancestry option to\n"
+"     disable such skipping.\n"
+"\n"
+"     SOURCE is usually a URL. The optional '@REV' specifies only the peg\n"
+"     revision of the URL and does not affect the merge range; if REV is not\n"
+"     specified, the HEAD revision is assumed. If SOURCE is a working copy\n"
+"     path, the corresponding URL of the path is used, and the default value\n"
+"     of 'REV' is the base revision (usually the revision last updated to).\n"
+"\n"
+"     TARGET_WCPATH is a working copy path; if omitted, '.' is assumed.\n"
+"\n"
+"     The revision ranges to be merged are specified by the '-r' and/or '-c'\n"
+"     options. '-r N:M' refers to the difference in the history of the\n"
+"     source branch between revisions N and M. You can use '-c M' to merge\n"
+"     single revisions: '-c M' is equivalent to '-r <M-1>:M'. Each such\n"
+"     difference is applied to TARGET_WCPATH.\n"
+"\n"
+"     If the mergeinfo in TARGET_WCPATH indicates that revisions within the\n"
+"     range were already merged, changes made in those revisions are not\n"
+"     merged again. If needed, the range is broken into multiple sub-ranges,\n"
+"     and each sub-range is merged separately.\n"
+"\n"
+"     A 'reverse range' can be used to undo changes. For example, when\n"
+"     source and target refer to the same branch, a previously committed\n"
+"     revision can be 'undone'. In a reverse range, N is greater than M in\n"
+"     '-r N:M', or the '-c' option is used with a negative number: '-c -M'\n"
+"     is equivalent to '-r M:<M-1>'.\n"
 "\n"
-"       - Cherry-picking Merge Example -\n"
+"     Multiple '-c' and/or '-r' options may be specified and mixing of\n"
+"     forward and reverse ranges is allowed.\n"
 "\n"
-"     A bug has been fixed on trunk on revision 50. This fix needs to\n"
-"     be merged from the trunk into the release branch.\n"
+"       - Cherry-pick Merge Example -\n"
+"\n"
+"     A bug has been fixed on trunk in revision 50. This fix needs to\n"
+"     be merged from trunk onto the release branch.\n"
 "\n"
 "            1.x-release  +-----------------------o-----\n"
 "                        /                        ^\n"
@@ -7127,161 +7186,168 @@ msgid ""
 "                      /                          |\n"
 "         trunk ------+--------------------------LR-----\n"
 "                                                r50\n"
-"     \n"
-"     In the above diagram, L marks the left side of the merge (trunk@49)\n"
-"     and R marks the right side of the merge (trunk@50).\n"
-"     The difference between the left and right side is merged into the target.\n"
-"\n"
-"     To perform the merge, check out a working copy of the release\n"
-"     branch and run the following command in the top-level directory\n"
-"     of the working copy:\n"
+"\n"
+"     In the above diagram, L marks the left side (trunk@49) and R marks the\n"
+"     right side (trunk@50) of the merge. The difference between the left\n"
+"     and right side is applied to the target working copy path.\n"
+"\n"
+"     Note that the difference between revision 49 and 50 is exactly those\n"
+"     changes that were committed in revision 50, not including changes\n"
+"     committed in revision 49.\n"
+"\n"
+"     To perform the merge, have a clean working copy of the release branch\n"
+"     and run the following command in its top-level directory; remember\n"
+"     that the default target is '.':\n"
 "\n"
 "         svn merge -c50 ^/trunk\n"
 "\n"
-"     If several commits to trunk were related to the fix, multiple\n"
-"     revisions can be merged:\n"
+"     You can also cherry-pick several revisions and/or revision ranges:\n"
+"\n"
+"         svn merge -c50,54,60 -r65:68 ^/trunk\n"
 "\n"
-"         svn merge -c50,54,60 ^/trunk\n"
 "\n"
+"  3. This form is called a 'reintegrate merge':\n"
 "\n"
-"  2. The second form is called a \"reintegrate merge\":\n"
-"     svn merge --reintegrate SOURCE[@REV] [TARGET_WCPATH]\n"
+"       svn merge --reintegrate SOURCE[@REV] [TARGET_WCPATH]\n"
 "\n"
-"     SOURCE is the URL of a branch to be merged back into (usually) its\n"
-"     immediate ancestor branch.  If REV is specified, it is used a\n"
-"     the peg revision for SOURCE, i.e. SOURCE is looked up in the\n"
-"     repository at revision REV.  If REV is not specified, the HEAD\n"
-"     revision is assumed.\n"
+"     In a reintegrate merge, an (e.g. feature) branch is merged back to its\n"
+"     originating branch. In other words, the source branch has originally\n"
+"     been created by copying the target branch, development has concluded\n"
+"     on the source branch and it should now be merged back into the target\n"
+"     branch.\n"
+"     \n"
+"     SOURCE is the URL of a branch to be merged back. If REV is specified,\n"
+"     it is used as the peg revision for SOURCE; if REV is not specified,\n"
+"     the HEAD revision is assumed.\n"
 "\n"
-"     TARGET_WCPATH is a working copy of the branch the changes will\n"
-"     be applied to.\n"
+"     TARGET_WCPATH is a working copy of the branch the changes will be\n"
+"     applied to.\n"
 "\n"
 "       - Reintegrate Merge Example -\n"
 "\n"
-"     A feature has been developed on a branch called \"feature\".\n"
-"     The feature branch started as a copy of trunk@W. Work on the\n"
-"     feature has completed and it should be merged back into the trunk.\n"
-"     \n"
-"     The feature branch was last synced with its immediate ancestor,\n"
-"     the trunk, in revision X. So the difference between trunk@X and\n"
-"     feature@HEAD contains the complete set of changes that implement\n"
-"     the feature, and no other changes. These changes are applied to\n"
-"     the trunk.\n"
-"\n"
-"                 feature  +-------------------------------R\n"
-"                         /                               . \\\n"
-"                        /                  ..............   \\\n"
-"                       /                  .                  v\n"
+"     A feature has been developed on a branch called 'feature'. The feature\n"
+"     branch started as a copy of trunk@W. Work on the feature has completed\n"
+"     and it should be merged back into the trunk.\n"
+"\n"
+"     The feature branch was last synced with trunk up to revision X. So the\n"
+"     difference between trunk@X and feature@HEAD contains the complete set\n"
+"     of changes that implement the feature, and no other changes. These\n"
+"     changes are applied to trunk.\n"
+"\n"
+"                feature  +--------------------------------R\n"
+"                        /                                . \\\n"
+"                       /                    .............   \\\n"
+"                      /                    .                 v\n"
 "         trunk ------+--------------------L------------------o\n"
 "                    rW                   rX\n"
 "\n"
-"     In the diagram above, L marks the left side of the merge (trunk@X),\n"
-"     and R marks the right side of the merge (feature@HEAD). The difference\n"
-"     between the left and right side is merged into the target.\n"
+"     In the diagram above, L marks the left side (trunk@X) and R marks the\n"
+"     right side (feature@HEAD) of the merge. The difference between the\n"
+"     left and right side is merged into trunk, the target.\n"
 "\n"
-"     To perform the merge, check out a working copy of the trunk, and run\n"
-"     the following command in the top-level directory of the working copy:\n"
+"     To perform the merge, have a clean working copy of trunk and run the\n"
+"     following command in its top-level directory:\n"
 "\n"
 "         svn merge --reintegrate ^/feature\n"
 "\n"
-"     To prevent unnecessary merge conflicts, reintegrate merges require\n"
-"     that TARGET_WCPATH is not a mixed-revision working copy, has no\n"
-"     local modifications, and has no switched subtrees.\n"
-"\n"
-"     Reintegrate merges also require that the reintegrate source be fully\n"
-"     synced with the target since their common branch point.\n"
-"     In the above example this means that all of the changes made\n"
-"     on trunk between revision W and revision X are fully merged to\n"
-"     the feature branch before it can be reintegrated back to trunk.\n"
-"\n"
-"     After the reintegrate merge, the feature branch cannot be synced\n"
-"     to the trunk again without merge conflicts. If further work must\n"
-"     be done on the feature branch, it should be deleted and then re-created.\n"
+"     To prevent unnecessary merge conflicts, a reintegrate merge requires\n"
+"     that TARGET_WCPATH is not a mixed-revision working copy, has no local\n"
+"     modifications, and has no switched subtrees.\n"
+"\n"
+"     A reintegrate merge also requires that the source branch is coherently\n"
+"     synced with the target -- in the above example, this means that all\n"
+"     revisions between the branch point W and the last merged revision X\n"
+"     are merged to the feature branch, so that there are no unmerged\n"
+"     revisions in-between.\n"
+"\n"
+"     After the reintegrate merge, the feature branch cannot be synced to\n"
+"     the trunk again without merge conflicts. If further work must be done\n"
+"     on the feature branch, it should be deleted and then re-created.\n"
+"\n"
 "\n"
+"  4. This form is called a '2-URL merge':\n"
 "\n"
-"  3. The third form is called a \"2-URL merge\":\n"
-"     svn merge SOURCE1[@N] SOURCE2[@M] [TARGET_WCPATH]\n"
+"       svn merge SOURCE1[@N] SOURCE2[@M] [TARGET_WCPATH]\n"
 "\n"
 "     Two source URLs are specified, together with two revisions N and M.\n"
-"     The two sources to be compared at the specified revisions, and the\n"
+"     The two sources are compared at the specified revisions, and the\n"
 "     difference is applied to TARGET_WCPATH, which is a path to a working\n"
-"     copy of another branch.\n"
+"     copy of another branch. The three branches involved can be completely\n"
+"     unrelated.\n"
 "\n"
-"     The revisions default to HEAD if omitted.\n"
+"     You should use this merge variant only if the other variants do not\n"
+"     apply to your situation, as this variant can be quite complex to\n"
+"     master.\n"
+"\n"
+"     If TARGET_WCPATH is omitted, a default value of '.' is assumed.\n"
+"     However, in the special case where both sources refer to a file node\n"
+"     with the same basename and a similarly named file is also found within\n"
+"     '.', the differences will be applied to that local file.  The source\n"
+"     revisions default to HEAD if omitted.\n"
 "\n"
-"     If TARGET_WCPATH is omitted, a default value of '.' is assumed,\n"
-"     unless the sources have identical basenames that match a file\n"
-"     within '.'; In which case, the differences will be applied to\n"
-"     that file.\n"
-"\n"
-"     The sources can also be specified as working copy paths, in which\n"
-"     case the URLs of the merge sources are derived from the working copies.\n"
-"\n"
-"     This is the most flexible type of merge, but also the most difficult\n"
-"     to use. It can be used to merge the differences between two (possibly\n"
-"     ancestrally unrelated) branches into a working copy of another branch.\n"
-"     This type of merge should be used very carefully because the probability\n"
-"     of merge conflicts is quite high. In most use cases, a sync, cherry-pick,\n"
-"     or reintegrate merge is sufficient and reduces the chances of mistakes.\n"
+"     The sources can also be specified as working copy paths, in which case\n"
+"     the URLs of the merge sources are derived from the working copies.\n"
 "\n"
 "       - 2-URL Merge Example -\n"
 "\n"
-"     A feature has been developed on a branch called \"feature\".\n"
-"     Development for the upcoming 3.0 release has happened in parallel on\n"
-"     the \"3.x-release\" branch. The work on the feature branch must be\n"
-"     merged to the 3.x-release branch. However, the feature branch and\n"
-"     the 3.x-release branch are not directly related, so a 2-URL merge\n"
-"     is needed.\n"
-"     The feature branch was last synced with its immediate ancestor,\n"
-"     the trunk, up to revision 500. So the difference between trunk@500\n"
-"     and feature@HEAD contains the complete set of changes related to\n"
-"     the feature, and no other changes. These changes are applied to\n"
-"     the 3.x-release branch.\n"
+"     Two features have been developed on separate branches called 'foo' and\n"
+"     'bar'. It has since become clear that 'bar' should be combined with\n"
+"     the 'foo' branch for further development before reintegration.\n"
+"\n"
+"     Although both feature branches originate from trunk, they are not\n"
+"     directly related -- one is not a direct copy of the other. A 2-URL\n"
+"     merge is necessary.\n"
+"\n"
+"     The 'bar' branch has been synced with trunk up to revision 500.\n"
+"     (If this revision number is not known, it can be located using the\n"
+"     'svn log' and/or 'svn mergeinfo' commands.)\n"
+"     The difference between trunk@500 and bar@HEAD contains the complete\n"
+"     set of changes related to feature 'bar', and no other changes. These\n"
+"     changes are applied to the 'foo' branch.\n"
 "\n"
-"                   3.x-release  +-----------------------------------o\n"
+"                           foo  +-----------------------------------o\n"
 "                               /                                    ^\n"
 "                              /                                    /\n"
 "                             /              r500                  /\n"
 "         trunk ------+------+-----------------L--------->        /\n"
-"                      \\                         .               /\n"
-"                       \\                         ...........   /\n"
+"                      \\                        .                /\n"
+"                       \\                        ............   /\n"
 "                        \\                                   . /\n"
-"                feature  +-----------------------------------R\n"
+"                    bar  +-----------------------------------R\n"
+"\n"
+"     In the diagram above, L marks the left side (trunk@500) and R marks\n"
+"     the right side (bar@HEAD) of the merge. The difference between the\n"
+"     left and right side is applied to the target working copy path, in\n"
+"     this case a working copy of the 'foo' branch.\n"
+"\n"
+"     To perform the merge, have a clean working copy of the 'foo' branch\n"
+"     and run the following command in its top-level directory:\n"
+"\n"
+"         svn merge ^/trunk@500 ^/bar\n"
 "\n"
-"     In the diagram above, L marks the left side of the merge (trunk@500),\n"
-"     and R marks the right side of the merge is (feature@HEAD).\n"
-"     The difference between the left and right side is merged into the target.\n"
-"\n"
-"     To perform the merge, check out a working copy of the 3.x-release\n"
-"     branch and run the following command in the top-level directory\n"
-"     of the working copy:\n"
-"       \n"
-"         svn merge ^/trunk@500 ^/feature\n"
-"\n"
-"     Before performing a 2-URL merge, it is a good idea to preview the\n"
-"     changes which will be merged, because there is no guarantee that\n"
-"     the merge will be free of conflicts. The preview can be done with\n"
-"     the svn diff command:\n"
-"\n"
-"         svn diff ^/trunk@500 ^/feature@HEAD\n"
-"\n"
-"     Note that a 2-URL merge can also merge from foreign repositories.\n"
-"     While SOURCE1 and SOURCE2 must both come from the same repository,\n"
-"     TARGET_WCPATH may come from a different repository than the sources.\n"
-"     However, there are some caveats. Most notably, copies made in the\n"
-"     merge source will be transformed into plain additions in the merge\n"
-"     target. Also, merge-tracking is not supported.\n"
+"     The exact changes applied by a 2-URL merge can be previewed with svn's\n"
+"     diff command, which is a good idea to verify if you do not have the\n"
+"     luxury of a clean working copy to merge to. In this case:\n"
+"\n"
+"         svn diff ^/trunk@500 ^/bar@HEAD\n"
 "\n"
 "\n"
 "  The following applies to all types of merges:\n"
 "\n"
 "  To prevent unnecessary merge conflicts, svn merge requires that\n"
-"  TARGET_WCPATH is not a mixed-revision working copy.\n"
-"  Running 'svn update' before starting a merge ensures that all\n"
-"  items in the working copy are based on the same revision.\n"
+"  TARGET_WCPATH is not a mixed-revision working copy. Running 'svn update'\n"
+"  before starting a merge ensures that all items in the working copy are\n"
+"  based on the same revision.\n"
+"\n"
+"  If possible, you should have no local modifications in the merge's target\n"
+"  working copy prior to the merge, to keep things simpler. It will be\n"
+"  easier to revert the merge and to understand the branch's history.\n"
 "\n"
-"  For each merged item a line will be printed with characters reporting\n"
-"  the action taken. These characters have the following meaning:\n"
+"  Switched sub-paths should also be avoided during merging, as they may\n"
+"  cause incomplete merges and create subtree mergeinfo.\n"
+"\n"
+"  For each merged item a line will be printed with characters reporting the\n"
+"  action taken. These characters have the following meaning:\n"
 "\n"
 "    A  Added\n"
 "    D  Deleted\n"
@@ -7297,18 +7363,31 @@ msgid ""
 "  the first and second columns indicate textual conflicts in files\n"
 "  and in property values, respectively.\n"
 "\n"
-"  NOTE:  Subversion uses the svn:mergeinfo property to track merge\n"
-"  history.  This property is considered at the start of a merge to\n"
-"  determine what to merge and it is updated at the conclusion of the\n"
-"  merge to describe the merge that took place.  Mergeinfo is used only\n"
-"  if the two sources are on the same line of history -- if the first\n"
-"  source is an ancestor of the second, or vice-versa.  This is guaranteed\n"
-"  to be the case when using sync merges and reintegrate merges.\n"
-"  The --ignore-ancestry option prevents merge tracking and thus\n"
-"  ignores mergeinfo, neither considering it nor recording it.\n"
+"    - Merge Tracking -\n"
+"\n"
+"  Subversion uses the svn:mergeinfo property to track merge history. This\n"
+"  property is considered at the start of a merge to determine what to merge\n"
+"  and it is updated at the conclusion of the merge to describe the merge\n"
+"  that took place. Mergeinfo is used only if the two sources are on the\n"
+"  same line of history -- if the first source is an ancestor of the second,\n"
+"  or vice-versa (i.e. if one has originally been created by copying the\n"
+"  other). This is verified and enforced when using sync merges and\n"
+"  reintegrate merges.\n"
+"\n"
+"  The --ignore-ancestry option prevents merge tracking and thus ignores\n"
+"  mergeinfo, neither considering it nor recording it.\n"
+"\n"
+"    - Merging from foreign repositories -\n"
+"\n"
+"  Subversion does support merging from foreign repositories.\n"
+"  While all merge source URLs must point to the same repository, the merge\n"
+"  target working copy may come from a different repository than the source.\n"
+"  However, there are some caveats. Most notably, copies made in the\n"
+"  merge source will be transformed into plain additions in the merge\n"
+"  target. Also, merge-tracking is not supported for merges from foreign\n"
+"  repositories.\n"
 msgstr ""
 
-#, fuzzy
 msgid ""
 "Display merge-related information.\n"
 "usage: mergeinfo SOURCE[@REV] [TARGET[@REV]]\n"
@@ -7323,9 +7402,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"
@@ -7515,7 +7596,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"
@@ -7610,18 +7690,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"
@@ -7629,6 +7706,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"
@@ -7640,7 +7722,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"
@@ -7656,7 +7737,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"
@@ -7670,8 +7751,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"
@@ -7729,7 +7810,6 @@ msgstr ""
 "\n"
 "  注意: 本子命令不会访问网络,它解除任何冲突的状态。\n"
 
-#, fuzzy
 msgid ""
 "Print the status of working copy files and directories.\n"
 "usage: status [PATH...]\n"
@@ -7877,10 +7957,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"
@@ -7889,15 +7973,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"
@@ -7908,7 +7992,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"
@@ -7960,12 +8043,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"
@@ -7988,7 +8074,6 @@ msgstr ""
 "\n"
 "    使用 --force 终止锁定。\n"
 
-#, fuzzy
 msgid ""
 "Bring changes from the repository into the working copy.\n"
 "usage: update [PATH...]\n"
@@ -8050,17 +8135,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 ""
@@ -8438,7 +8531,7 @@ msgstr ""
 
 #, c-format
 msgid "Status against revision: %6ld\n"
-msgstr "版本的 %6ld 状态\n"
+msgstr "版本 %6ld 的状态\n"
 
 #, c-format
 msgid "Sending copy of       %s\n"
@@ -10622,3 +10715,6 @@ msgstr "“%s” 的类型未知\n"
 #, c-format
 msgid "Uncommitted local addition, copy or move%s"
 msgstr "未提交的本地增加,复制或移动 %s"
+
+#~ msgid "'%s' is scheduled for addition within unversioned parent"
+#~ msgstr "在未纳入版本控制的父目录,“%s” 被加入增加调度"

Modified: subversion/branches/1.7.x-issue4087/subversion/svn/log-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/svn/log-cmd.c?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/svn/log-cmd.c (original)
+++ subversion/branches/1.7.x-issue4087/subversion/svn/log-cmd.c Thu Mar  1 12:22:17 2012
@@ -51,8 +51,9 @@ struct log_receiver_baton
   /* Client context. */
   svn_client_ctx_t *ctx;
 
-  /* The URL target of the log operation. */
-  const char *target_url;
+  /* The target of the log operation. */
+  const char *target_path_or_url;
+  svn_opt_revision_t target_peg_revision;
 
   /* Don't print log message body nor its line count. */
   svn_boolean_t omit_log_message;
@@ -283,7 +284,6 @@ log_entry_receiver(void *baton,
       apr_status_t status;
       svn_opt_revision_t start_revision;
       svn_opt_revision_t end_revision;
-      svn_error_t *err;
 
       if ((status = apr_file_open_stdout(&outfile, pool)))
         return svn_error_wrap_apr(status, _("Can't open stdout"));
@@ -303,82 +303,22 @@ log_entry_receiver(void *baton,
       end_revision.value.number = log_entry->revision;
 
       SVN_ERR(svn_cmdline_printf(pool, _("\n")));
-      err = svn_client_diff5(diff_options,
-                             lb->target_url,
-                             &start_revision,
-                             lb->target_url,
-                             &end_revision,
-                             NULL,
-                             lb->depth,
-                             FALSE, /* ignore ancestry */
-                             TRUE, /* no diff deleted */
-                             FALSE, /* show copies as adds */
-                             FALSE, /* ignore content type */
-                             FALSE, /* use git diff format */
-                             svn_cmdline_output_encoding(pool),
-                             outfile,
-                             errfile,
-                             NULL,
-                             lb->ctx, pool);
-      if (err)
-        {
-          /* We get a "path not found" error in case the revision created
-           * lb->target_url. Try to show a diff from the parent instead. */
-          if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
-            {
-              const char *parent;
-              apr_pool_t *iterpool;
-
-              svn_error_clear(err);
-
-              parent = svn_uri_dirname(lb->target_url, pool);
-              iterpool = svn_pool_create(pool);
-              while (strcmp(parent, lb->target_url) != 0)
-                {
-                  svn_pool_clear(iterpool);
-                  err = svn_client_diff5(diff_options,
-                                         parent,
-                                         &start_revision,
-                                         parent,
-                                         &end_revision,
-                                         NULL,
-                                         lb->depth,
-                                         FALSE, /* ignore ancestry */
-                                         TRUE, /* no diff deleted */
-                                         FALSE, /* show copies as adds */
-                                         FALSE, /* ignore content type */
-                                         FALSE, /* use git diff format */
-                                         svn_cmdline_output_encoding(iterpool),
-                                         outfile,
-                                         errfile,
-                                         NULL,
-                                         lb->ctx, iterpool);
-                  if (err == SVN_NO_ERROR)
-                    break;
-                  else
-                    {
-                      if (err->apr_err == SVN_ERR_FS_NOT_FOUND)
-                        {
-                          svn_error_clear(err);
-                          parent = svn_uri_dirname(parent, pool);
-                          continue;
-                        }
-                      if (err->apr_err == SVN_ERR_RA_ILLEGAL_URL ||
-                          err->apr_err == SVN_ERR_AUTHZ_UNREADABLE ||
-                          err->apr_err == SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED)
-                        {
-                          svn_error_clear(err);
-                          break;
-                        }
-                      return svn_error_trace(err);
-                    }
-                }
-              svn_pool_destroy(iterpool);
-            }
-          else
-            return svn_error_trace(err);
-        }
-
+      SVN_ERR(svn_client_diff_peg5(diff_options,
+                                   lb->target_path_or_url,
+                                   &lb->target_peg_revision,
+                                   &start_revision, &end_revision,
+                                   NULL,
+                                   lb->depth,
+                                   FALSE, /* ignore ancestry */
+                                   TRUE, /* no diff deleted */
+                                   FALSE, /* show copies as adds */
+                                   FALSE, /* ignore content type */
+                                   FALSE, /* use git diff format */
+                                   svn_cmdline_output_encoding(pool),
+                                   outfile,
+                                   errfile,
+                                   NULL,
+                                   lb->ctx, pool));
       SVN_ERR(svn_cmdline_printf(pool, _("\n")));
     }
 
@@ -571,8 +511,6 @@ svn_cl__log(apr_getopt_t *os,
   struct log_receiver_baton lb;
   const char *target;
   int i;
-  svn_opt_revision_t peg_revision;
-  const char *true_path;
   apr_array_header_t *revprops;
 
   if (!opt_state->xml)
@@ -626,8 +564,6 @@ svn_cl__log(apr_getopt_t *os,
   /* Add "." if user passed 0 arguments */
   svn_opt_push_implicit_dot_target(targets, pool);
 
-  target = APR_ARRAY_IDX(targets, 0, const char *);
-
   /* Determine if they really want a two-revision range. */
   if (opt_state->used_change_arg)
     {
@@ -649,9 +585,15 @@ svn_cl__log(apr_getopt_t *os,
         }
     }
 
-  /* Strip peg revision. */
-  SVN_ERR(svn_opt_parse_path(&peg_revision, &true_path, target, pool));
-  APR_ARRAY_IDX(targets, 0, const char *) = true_path;
+  /* Parse the first target into path-or-url and peg revision. */
+  target = APR_ARRAY_IDX(targets, 0, const char *);
+  SVN_ERR(svn_opt_parse_path(&lb.target_peg_revision, &lb.target_path_or_url,
+                             target, pool));
+  if (lb.target_peg_revision.kind == svn_opt_revision_unspecified)
+    lb.target_peg_revision.kind = (svn_path_is_url(target)
+                                     ? svn_opt_revision_head
+                                     : svn_opt_revision_working);
+  APR_ARRAY_IDX(targets, 0, const char *) = lb.target_path_or_url;
 
   if (svn_path_is_url(target))
     {
@@ -670,8 +612,6 @@ svn_cl__log(apr_getopt_t *os,
 
   lb.ctx = ctx;
   lb.omit_log_message = opt_state->quiet;
-  SVN_ERR(svn_client_url_from_path2(&lb.target_url, true_path, ctx,
-                                    pool, pool));
   lb.show_diff = opt_state->show_diff;
   lb.depth = opt_state->depth == svn_depth_unknown ? svn_depth_infinity
                                                    : opt_state->depth;
@@ -722,7 +662,7 @@ svn_cl__log(apr_getopt_t *os,
             APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_LOG;
         }
       SVN_ERR(svn_client_log5(targets,
-                              &peg_revision,
+                              &lb.target_peg_revision,
                               opt_state->revision_ranges,
                               opt_state->limit,
                               opt_state->verbose,
@@ -745,7 +685,7 @@ svn_cl__log(apr_getopt_t *os,
       if (!opt_state->quiet)
         APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_LOG;
       SVN_ERR(svn_client_log5(targets,
-                              &peg_revision,
+                              &lb.target_peg_revision,
                               opt_state->revision_ranges,
                               opt_state->limit,
                               opt_state->verbose,

Propchange: subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/basic_tests.py
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu Mar  1 12:22:17 2012
@@ -1,4 +1,5 @@
 /subversion/branches/1.5.x-r30215/subversion/tests/cmdline/basic_tests.py:870312
+/subversion/branches/1.7.x/subversion/tests/cmdline/basic_tests.py:1243707-1295531
 /subversion/branches/1.7.x-JavaHL-pools/subversion/tests/cmdline/basic_tests.py:1158684-1158722
 /subversion/branches/1.7.x-issue3888/subversion/tests/cmdline/basic_tests.py:1148937-1149162
 /subversion/branches/1.7.x-issue3975/subversion/tests/cmdline/basic_tests.py:1160761-1161546
@@ -10,6 +11,7 @@
 /subversion/branches/1.7.x-r1159093/subversion/tests/cmdline/basic_tests.py:1159097-1159230
 /subversion/branches/1.7.x-r1163557/subversion/tests/cmdline/basic_tests.py:1163574-1170648
 /subversion/branches/1.7.x-r1173425/subversion/tests/cmdline/basic_tests.py:1173429-1176454
+/subversion/branches/1.7.x-r1210147/subversion/tests/cmdline/basic_tests.py:1213310-1293110
 /subversion/branches/atomic-revprop/subversion/tests/cmdline/basic_tests.py:965046-1000689
 /subversion/branches/bdb-reverse-deltas/subversion/tests/cmdline/basic_tests.py:872050-872529
 /subversion/branches/diff-callbacks3/subversion/tests/cmdline/basic_tests.py:870059-870761

Modified: subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/diff_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/diff_tests.py?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/diff_tests.py (original)
+++ subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/diff_tests.py Thu Mar  1 12:22:17 2012
@@ -57,6 +57,16 @@ def make_diff_header(path, old_tag, new_
     "+++ " + path_as_shown + "\t(" + new_tag + ")\n",
     ]
 
+def make_no_diff_deleted_header(path, old_tag, new_tag):
+  """Generate the expected diff header for a deleted file PATH when in
+  'no-diff-deleted' mode. (In that mode, no further details appear after the
+  header.) Return the header as an array of newline-terminated strings."""
+  path_as_shown = path.replace('\\', '/')
+  return [
+    "Index: " + path_as_shown + " (deleted)\n",
+    "===================================================================\n",
+    ]
+
 def make_git_diff_header(target_path, repos_relpath,
                          old_tag, new_tag, add=False, src_label=None,
                          dst_label=None, delete=False, text_changes=True,
@@ -1165,8 +1175,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)
 
 
 #----------------------------------------------------------------------
@@ -3590,6 +3602,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)
 
@@ -3630,6 +3645,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/1.7.x-issue4087/subversion/tests/cmdline/externals_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/externals_tests.py?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/externals_tests.py (original)
+++ subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/externals_tests.py Thu Mar  1 12:22:17 2012
@@ -2231,6 +2231,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
 
@@ -2274,6 +2341,7 @@ test_list = [ None,
               copy_file_externals,
               remap_file_external_with_prop_del,
               dir_external_with_dash_r_only,
+              url_to_wc_copy_of_externals,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/lock_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/lock_tests.py?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/lock_tests.py (original)
+++ subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/lock_tests.py Thu Mar  1 12:22:17 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/1.7.x-issue4087/subversion/tests/cmdline/log_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/log_tests.py?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/log_tests.py (original)
+++ subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/log_tests.py Thu Mar  1 12:22:17 2012
@@ -34,6 +34,7 @@ from svntest import wc
 from svntest.main import server_has_mergeinfo
 from svntest.main import SVN_PROP_MERGEINFO
 from merge_tests import set_up_branch
+from diff_tests import make_diff_header, make_no_diff_deleted_header
 
 # (abbreviation)
 Skip = svntest.testcase.Skip_deco
@@ -178,7 +179,8 @@ def guarantee_repos_and_wc(sbox):
   to test the code"""
   svntest.main.file_write(msg_file, msg)
   svntest.main.file_append(iota_path, "8")
-  svntest.main.file_append(rho_path, "8")
+  svntest.main.file_append(rho_path, "88") # More than one char so libmagic
+                                           # treats it as text.
   svntest.main.run_svn(None, 'add', rho_path)
   svntest.main.run_svn(None,
                        'ci', '-F', msg_file)
@@ -424,7 +426,7 @@ class SVNLogParseError(Exception):
   pass
 
 
-def parse_log_output(log_lines):
+def parse_log_output(log_lines, with_diffs=False):
   """Return a log chain derived from LOG_LINES.
   A log chain is a list of hashes; each hash represents one log
   message, in the order it appears in LOG_LINES (the first log
@@ -438,6 +440,7 @@ def parse_log_output(log_lines):
      'date'     ===>  string
      'msg'      ===>  string  (the log message itself)
      'lines'    ===>  number  (so that it may be checked against rev)
+
   If LOG_LINES contains changed-path information, then the hash
   also contains
 
@@ -451,7 +454,11 @@ def parse_log_output(log_lines):
 
      'reverse_merges'   ===> list of reverse-merging revisions that resulted
   in this log being part of the list of messages.
-     """
+
+  If LOG_LINES contains diffs and WITH_DIFFS=True, then the hash also contains
+
+     'diff_lines'  ===> list of strings  (diffs)
+  """
 
   # Here's some log output to look at while writing this function:
 
@@ -566,6 +573,20 @@ def parse_log_output(log_lines):
       for line in log_lines[0:lines]:
         msg += line
       del log_lines[0:lines]
+
+      # Maybe accumulate a diff.
+      # If there is a diff, there is a blank line before and after it.
+      if with_diffs and len(log_lines) >= 2 and log_lines[0] == '\n':
+        log_lines.pop(0)
+        diff_lines = []
+        while len(log_lines) and log_lines[0] != msg_separator:
+          diff_lines.append(log_lines.pop(0))
+        if diff_lines[-1] == '\n':
+          diff_lines.pop()
+        else:
+          raise SVNLogParseError("no blank line after diff in log")
+        this_item['diff_lines'] = diff_lines
+
     elif this_line == msg_separator:
       if this_item:
         this_item['msg'] = msg
@@ -2028,6 +2049,59 @@ def log_on_nonexistent_path_and_valid_re
   svntest.actions.run_and_verify_svn(None, None, expected_error,
                                      'log', '-q', bad_path_default_rev)
 
+#----------------------------------------------------------------------
+def log_diff(sbox):
+  "'svn log --diff'"
+
+  guarantee_repos_and_wc(sbox)
+
+  was_cwd = os.getcwd()
+  os.chdir(sbox.wc_dir)
+
+  exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+                                                              'log', '--diff')
+  os.chdir(was_cwd)
+
+  for line in output:
+    if line.startswith('Index:'):
+      break
+  else:
+    raise SVNLogParseError("no diffs found in log output")
+
+  # After a copy, a log of the copy destination used to fail because the
+  # diff tried to use the head-revision URL with the old revision numbers
+  # without using the correct peg revision.
+
+  sbox.simple_copy('A', 'A2')
+  sbox.simple_commit()
+
+  os.chdir(sbox.wc_dir)
+  exit_code, output, err = svntest.actions.run_and_verify_svn(None, None, [],
+                                                              'log', '--diff',
+                                                              '-r10:8', 'A2')
+  os.chdir(was_cwd)
+
+  r9diff = make_no_diff_deleted_header('A2/B/E/alpha', 8, 9) \
+           + make_diff_header('A2/B/E/beta', 'revision 8', 'revision 9') \
+           + [ "@@ -1 +1,2 @@\n",
+               " This is the file 'beta'.\n",
+               "+9\n",
+               "\ No newline at end of file\n",
+             ]
+  r8diff = make_diff_header('A2/D/G/rho', 'revision 0', 'revision 8') \
+           + [ "@@ -0,0 +1 @@\n",
+               "+88\n",
+               "\ No newline at end of file\n",
+             ]
+  log_chain = parse_log_output(output, with_diffs=True)
+  if len(log_chain) != 3:
+    raise SVNLogParseError("%d logs found, 3 expected" % len(log_chain))
+  svntest.verify.compare_and_display_lines(None, "diff for r9",
+                                           r9diff, log_chain[1]['diff_lines'])
+  svntest.verify.compare_and_display_lines(None, "diff for r8",
+                                           r8diff, log_chain[2]['diff_lines'])
+
+
 ########################################################################
 # Run the tests
 
@@ -2067,6 +2141,7 @@ test_list = [ None,
               merge_sensitive_log_ignores_cyclic_merges,
               log_with_unrelated_peg_and_operative_revs,
               log_on_nonexistent_path_and_valid_rev,
+              log_diff,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/merge_reintegrate_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/merge_reintegrate_tests.py?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/merge_reintegrate_tests.py (original)
+++ subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/merge_reintegrate_tests.py Thu Mar  1 12:22:17 2012
@@ -2572,6 +2572,46 @@ def reintegrate_replaced_source(sbox):
                                        [], None, None, None, None, True, True,
                                        '--reintegrate', A_path)
   
+#----------------------------------------------------------------------
+@SkipUnless(svntest.main.is_posix_os)
+@Issue(4052)
+def reintegrate_symlink_deletion(sbox):
+  "reintegrate symlink deletion"
+
+  sbox.build()
+  wc_dir = sbox.wc_dir
+
+  ## path vars
+  A_path = sbox.ospath('A')
+  A_omicron_path = sbox.ospath('A/omicron')
+  mu_path = sbox.ospath('A/mu')
+  A_COPY_path = sbox.ospath('A_COPY')
+  A_COPY_omicron_path = sbox.ospath('A_COPY/omicron')
+  A_url = sbox.repo_url + "/A"
+  A_COPY_url = sbox.repo_url + "/A_COPY"
+
+  ## add symlink
+  os.symlink(mu_path, A_omicron_path)
+  sbox.simple_add('A/omicron')
+  sbox.simple_commit(message='add symlink')
+
+  ## branch
+  sbox.simple_repo_copy('A', 'A_COPY')
+  sbox.simple_update()
+
+  ## branch rm
+  sbox.simple_rm('A_COPY/omicron')
+  sbox.simple_commit(message='remove symlink on branch')
+
+  ## Note: running update at this point avoids the bug.
+
+  ## reintegrate
+  # ### TODO: verify something here
+  svntest.main.run_svn(None, 'merge', '--reintegrate',
+                       A_COPY_url, A_path)
+
+
+
 ########################################################################
 # Run the tests
 
@@ -2595,6 +2635,7 @@ test_list = [ None,
               reintegrate_creates_bogus_mergeinfo,
               no_source_subtree_mergeinfo,
               reintegrate_replaced_source,
+              reintegrate_symlink_deletion,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/patch_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/patch_tests.py?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/patch_tests.py (original)
+++ subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/patch_tests.py Thu Mar  1 12:22:17 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,

Modified: subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/special_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/special_tests.py?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/special_tests.py (original)
+++ subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/special_tests.py Thu Mar  1 12:22:17 2012
@@ -906,6 +906,37 @@ def update_symlink(sbox):
                                         None, None, None,
                                         None, None, 1)
 
+@Issue(4102)
+@SkipUnless(svntest.main.is_posix_os)
+def externals_as_symlink_targets(sbox):
+  "externals as symlink targets"
+  sbox.build()
+  wc = sbox.ospath
+
+  # Control: symlink to normal dir and file.
+  os.symlink('E', wc('sym_E'))
+  os.symlink('mu', wc('sym_mu'))
+
+  # Test case: symlink to external dir and file.
+  sbox.simple_propset("svn:externals",
+                      '^/A/B/E ext_E\n'
+                      '^/A/mu ext_mu',
+                      '')
+  sbox.simple_update()
+  os.symlink('ext_E', wc('sym_ext_E'))
+  os.symlink('ext_mu', wc('sym_ext_mu'))
+
+  # Adding symlinks to normal items and to a file external is OK.
+  sbox.simple_add('sym_E', 'sym_mu', 'sym_ext_mu')
+
+  ### Adding a symlink to an external dir failed with
+  ###   svn: E200009: Could not add all targets because some targets are
+  ###   already versioned
+  sbox.simple_add('sym_ext_E')
+
+  sbox.simple_commit()
+    
+
 ########################################################################
 # Run the tests
 
@@ -933,6 +964,7 @@ test_list = [ None,
               symlink_to_wc_basic,
               symlink_to_wc_svnversion,
               update_symlink,
+              externals_as_symlink_targets,
              ]
 
 if __name__ == '__main__':

Modified: subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/stat_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/stat_tests.py?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/stat_tests.py (original)
+++ subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/stat_tests.py Thu Mar  1 12:22:17 2012
@@ -924,38 +924,13 @@ def status_in_xml(sbox):
   else:
     raise svntest.Failure
 
-  template = ['<?xml version="1.0" encoding="UTF-8"?>\n',
-              "<status>\n",
-              "<target\n",
-              "   path=\"%s\">\n" % (file_path),
-              "<entry\n",
-              "   path=\"%s\">\n" % (file_path),
-              "<wc-status\n",
-              "   props=\"none\"\n",
-              "   item=\"modified\"\n",
-              "   revision=\"1\">\n",
-              "<commit\n",
-              "   revision=\"1\">\n",
-              "<author>%s</author>\n" % svntest.main.wc_author,
-              time_str,
-              "</commit>\n",
-              "</wc-status>\n",
-              "</entry>\n",
-              "<against\n",
-              "   revision=\"1\"/>\n",
-              "</target>\n",
-              "</status>\n",
-             ]
+  expected_entries = {file_path : {'wcprops' : 'none',
+                                   'wcitem' : 'modified',
+                                   'wcrev' : '1',
+                                   'crev' : '1',
+                                   'author' : svntest.main.wc_author}}
 
-  exit_code, output, error = svntest.actions.run_and_verify_svn(None, None, [],
-                                                                'status',
-                                                                file_path,
-                                                                '--xml', '-u')
-
-  for i in range(0, len(output)):
-    if output[i] != template[i]:
-      print("ERROR: expected: %s actual: %s" % (template[i], output[i]))
-      raise svntest.Failure
+  svntest.actions.run_and_verify_status_xml(expected_entries, file_path, '-u')
 
   svntest.actions.run_and_verify_svn(None, None, [],
                                      'cp', '-m', 'repo-to-repo copy',
@@ -964,36 +939,12 @@ def status_in_xml(sbox):
   
   file_path = sbox.ospath('iota2')
 
-  template = ['<?xml version="1.0" encoding="UTF-8"?>\n',
-              "<status>\n",
-              "<target\n",
-              "   path=\"%s\">\n" % (file_path),
-              "<entry\n",
-              "   path=\"%s\">\n" % (file_path),
-              "<wc-status\n",
-              "   props=\"none\"\n",
-              "   item=\"none\">\n",
-              "</wc-status>\n",
-              "<repos-status\n",
-              "   props=\"none\"\n",
-              "   item=\"added\">\n",
-              "</repos-status>\n",
-              "</entry>\n",
-              "<against\n",
-              "   revision=\"2\"/>\n",
-              "</target>\n",
-              "</status>\n",
-             ]
+  expected_entries = {file_path : {'wcprops' : 'none',
+                                   'wcitem' : 'none',
+                                   'rprops' : 'none',
+                                   'ritem' : 'added'}}
 
-  exit_code, output, error = svntest.actions.run_and_verify_svn(None, None, [],
-                                                                'status',
-                                                                file_path,
-                                                                '--xml', '-u')
-
-  for i in range(0, len(output)):
-    if output[i] != template[i]:
-      print("ERROR: expected: %s actual: %s" % (template[i], output[i]))
-      raise svntest.Failure
+  svntest.actions.run_and_verify_status_xml(expected_entries, file_path, '-u')
 
 #----------------------------------------------------------------------
 
@@ -1269,53 +1220,23 @@ def status_update_with_incoming_props(sb
   else:
     raise svntest.Failure
 
-  xout = ['<?xml version="1.0" encoding="UTF-8"?>\n',
-          "<status>\n",
-          "<target\n",
-          "   path=\"%s\">\n" % (wc_dir),
-          "<entry\n",
-          "   path=\"%s\">\n" % (A_path),
-          "<wc-status\n",
-          "   props=\"none\"\n",
-          "   item=\"normal\"\n",
-          "   revision=\"1\">\n",
-          "<commit\n",
-          "   revision=\"1\">\n",
-          "<author>%s</author>\n" % svntest.main.wc_author,
-          time_str,
-          "</commit>\n",
-          "</wc-status>\n",
-          "<repos-status\n",
-          "   props=\"modified\"\n",
-          "   item=\"none\">\n",
-          "</repos-status>\n",
-          "</entry>\n",
-          "<entry\n",
-          "   path=\"%s\">\n" % (wc_dir),
-          "<wc-status\n",
-          "   props=\"none\"\n",
-          "   item=\"normal\"\n",
-          "   revision=\"1\">\n",
-          "<commit\n",
-          "   revision=\"1\">\n",
-          "<author>%s</author>\n" % svntest.main.wc_author,
-          time_str,
-          "</commit>\n",
-          "</wc-status>\n",
-          "<repos-status\n",
-          "   props=\"modified\"\n",
-          "   item=\"none\">\n",
-          "</repos-status>\n",
-          "</entry>\n",
-          "<against\n",
-          "   revision=\"2\"/>\n",
-          "</target>\n",
-          "</status>\n",]
-
-  exit_code, output, error = svntest.actions.run_and_verify_svn(None, xout, [],
-                                                                'status',
-                                                                wc_dir,
-                                                                '--xml', '-uN')
+  expected_entries ={wc_dir : {'wcprops' : 'none',
+                               'wcitem' : 'normal',
+                               'wcrev' : '1',
+                               'crev' : '1',
+                               'author' : svntest.main.wc_author,
+                               'rprops' : 'modified',
+                               'ritem' : 'none'},
+                     A_path : {'wcprops' : 'none',
+                               'wcitem' : 'normal',
+                               'wcrev' : '1',
+                               'crev' : '1',
+                               'author' : svntest.main.wc_author,
+                               'rprops' : 'modified',
+                               'ritem' : 'none'},
+                     }
+
+  svntest.actions.run_and_verify_status_xml(expected_entries, wc_dir, '-uN')
 
 # more incoming prop updates.
 def status_update_verbose_with_incoming_props(sbox):

Modified: subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svnlook_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svnlook_tests.py?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svnlook_tests.py (original)
+++ subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svnlook_tests.py Thu Mar  1 12:22:17 2012
@@ -117,35 +117,39 @@ def test_misc(sbox):
   # the 'svnlook tree --full-paths' output if demanding the whole repository
   treelist = run_svnlook('tree', repo_dir)
   treelistfull = run_svnlook('tree', '--full-paths', repo_dir)
+
   path = ''
-  n = 0
+  treelistexpand = []
   for entry in treelist:
     len1 = len(entry)
     len2 = len(entry.lstrip())
-    path = path[0:2*(len1-len2)-1] + entry.strip()
-    test = treelistfull[n].rstrip()
-    if n != 0:
-      test = "/" + test
-    if not path == test:
-      print("Unexpected result from tree with --full-paths:")
-      print("  entry            : %s" % entry.rstrip())
-      print("  with --full-paths: %s" % treelistfull[n].rstrip())
-      raise svntest.Failure
-    n = n + 1
+    path = path[0:2*(len1-len2)-1] + entry.strip() + '\n'
+    if path == '/\n':
+      treelistexpand.append(path)
+    else:
+      treelistexpand.append(path[1:])
+
+  treelistexpand = svntest.verify.UnorderedOutput(treelistexpand)
+  svntest.verify.compare_and_display_lines('Unexpected result from tree', '',
+                                           treelistexpand, treelistfull)
 
   # check if the 'svnlook tree' output is the ending of
   # the 'svnlook tree --full-paths' output if demanding
   # any part of the repository
-  n = 0
   treelist = run_svnlook('tree', repo_dir, '/A/B')
   treelistfull = run_svnlook('tree', '--full-paths', repo_dir, '/A/B')
+
+  path = ''
+  treelistexpand = []
   for entry in treelist:
-    if not treelistfull[n].endswith(entry.lstrip()):
-      print("Unexpected result from tree with --full-paths:")
-      print("  entry            : %s" % entry.rstrip())
-      print("  with --full-paths: %s" % treelistfull[n].rstrip())
-      raise svntest.Failure
-    n = n + 1
+    len1 = len(entry)
+    len2 = len(entry.lstrip())
+    path = path[0:2*(len1-len2)] + entry.strip() + '\n'
+    treelistexpand.append('/A/' + path)
+
+  treelistexpand = svntest.verify.UnorderedOutput(treelistexpand)
+  svntest.verify.compare_and_display_lines('Unexpected result from tree', '',
+                                           treelistexpand, treelistfull)
 
   treelist = run_svnlook('tree', repo_dir, '/')
   if treelist[0] != '/\n':
@@ -695,7 +699,7 @@ fp.close()"""
                     #  internal property, not really expected
                     '  svn:check-locks\n',
                     '  bogus_rev_prop\n', '  svn:date\n']
-  verify_logfile(logfilepath, expected_data)
+  verify_logfile(logfilepath, svntest.verify.UnorderedOutput(expected_data))
 
 ########################################################################
 # Run the tests

Modified: subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svnrdump_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svnrdump_tests.py?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svnrdump_tests.py (original)
+++ subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svnrdump_tests.py Thu Mar  1 12:22:17 2012
@@ -70,8 +70,31 @@ def build_repos(sbox):
   # Create an empty repository.
   svntest.main.create_repos(sbox.repo_dir)
 
+def compare_repos_dumps(svnrdump_sbox, svnadmin_dumpfile):
+  """Compare two dumpfiles, one created from SVNRDUMP_SBOX, and other given
+  by SVNADMIN_DUMPFILE.  The dumpfiles do not need to match linewise, as the
+  SVNADMIN_DUMPFILE contents will first be loaded into a repository and then
+  re-dumped to do the match, which should generate the same dumpfile as
+  dumping SVNRDUMP_SBOX."""
+
+  svnrdump_contents = svntest.actions.run_and_verify_dump(
+                                                    svnrdump_sbox.repo_dir)
+
+  svnadmin_sbox = svnrdump_sbox.clone_dependent()
+  svntest.main.safe_rmtree(svnadmin_sbox.repo_dir)
+  svntest.main.create_repos(svnadmin_sbox.repo_dir)
+
+  svntest.actions.run_and_verify_load(svnadmin_sbox.repo_dir, svnadmin_dumpfile)
+
+  svnadmin_contents = svntest.actions.run_and_verify_dump(
+                                                    svnadmin_sbox.repo_dir)
+
+  svntest.verify.compare_dump_files(
+    "Dump files", "DUMP", svnadmin_contents, svnrdump_contents)
+
 def run_dump_test(sbox, dumpfile_name, expected_dumpfile_name = None,
-                  subdir = None, bypass_prop_validation = False):
+                  subdir = None, bypass_prop_validation = False,
+                  ignore_base_checksums = False):
   """Load a dumpfile using 'svnadmin load', dump it with 'svnrdump
   dump' and check that the same dumpfile is produced or that
   expected_dumpfile_name is produced if provided. Additionally, the
@@ -107,12 +130,21 @@ def run_dump_test(sbox, dumpfile_name, e
     svnadmin_dumpfile = open(os.path.join(svnrdump_tests_dir,
                                           expected_dumpfile_name),
                              'rb').readlines()
+    # Compare the output from stdout
+    if ignore_base_checksums:
+      svnadmin_dumpfile = [l for l in svnadmin_dumpfile
+                                    if not l.startswith('Text-delta-base-md5')]
+      svnrdump_dumpfile = [l for l in svnrdump_dumpfile
+                                    if not l.startswith('Text-delta-base-md5')]
+
     svnadmin_dumpfile = svntest.verify.UnorderedOutput(svnadmin_dumpfile)
 
-  # Compare the output from stdout
-  svntest.verify.compare_and_display_lines(
-    "Dump files", "DUMP", svnadmin_dumpfile, svnrdump_dumpfile,
-    None, mismatched_headers_re)
+    svntest.verify.compare_and_display_lines(
+      "Dump files", "DUMP", svnadmin_dumpfile, svnrdump_dumpfile,
+      None, mismatched_headers_re)
+    
+  else:
+    compare_repos_dumps(sbox, svnadmin_dumpfile)
 
 def run_load_test(sbox, dumpfile_name, expected_dumpfile_name = None,
                   expect_deltas = True):
@@ -155,9 +187,12 @@ def run_load_test(sbox, dumpfile_name, e
                                           expected_dumpfile_name),
                              'rb').readlines()
 
-  # Compare the output from stdout
-  svntest.verify.compare_and_display_lines(
-    "Dump files", "DUMP", svnrdump_dumpfile, svnadmin_dumpfile)
+    # Compare the output from stdout
+    svntest.verify.compare_and_display_lines(
+      "Dump files", "DUMP", svnrdump_dumpfile, svnadmin_dumpfile)
+
+  else:
+    compare_repos_dumps(sbox, svnrdump_dumpfile)
 
 ######################################################################
 # Tests
@@ -345,7 +380,7 @@ def copy_bad_line_endings2_dump(sbox):
   "dump: non-LF line endings in svn:* props"
   run_dump_test(sbox, "copy-bad-line-endings2.dump",
                 expected_dumpfile_name="copy-bad-line-endings2.expected.dump",
-                bypass_prop_validation=True)
+                bypass_prop_validation=True, ignore_base_checksums=True)
 
 @Skip(svntest.main.is_ra_type_dav_serf)
 def commit_a_copy_of_root_dump(sbox):

Modified: subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svnsync_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svnsync_tests.py?rev=1295534&r1=1295533&r2=1295534&view=diff
==============================================================================
--- subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svnsync_tests.py (original)
+++ subversion/branches/1.7.x-issue4087/subversion/tests/cmdline/svnsync_tests.py Thu Mar  1 12:22:17 2012
@@ -222,7 +222,7 @@ def verify_mirror(dest_sbox, exp_dump_fi
   # Create a dump file from the mirror repository.
   dest_dump = svntest.actions.run_and_verify_dump(dest_sbox.repo_dir)
 
-  svntest.verify.compare_and_display_lines(
+  svntest.verify.compare_dump_files(
     "Dump files", "DUMP", exp_dump_file_contents, dest_dump)
 
 def run_test(sbox, dump_file_name, subdir=None, exp_dump_file_name=None,