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,