[svnbook] r5876 committed - branches/1.8/zh/book/ch08-embedding-svn.xml
wuzhouhui at users.sourceforge.net
wuzhouhui at users.sourceforge.net
Tue Feb 12 07:00:59 CST 2019
Revision: 5876
http://sourceforge.net/p/svnbook/source/5876
Author: wuzhouhui
Date: 2019-02-12 13:00:56 +0000 (Tue, 12 Feb 2019)
Log Message:
-----------
1.8/zh: chapter 8 reviewed
Modified Paths:
--------------
branches/1.8/zh/book/ch08-embedding-svn.xml
Modified: branches/1.8/zh/book/ch08-embedding-svn.xml
===================================================================
--- branches/1.8/zh/book/ch08-embedding-svn.xml 2019-02-08 15:02:57 UTC (rev 5875)
+++ branches/1.8/zh/book/ch08-embedding-svn.xml 2019-02-12 13:00:56 UTC (rev 5876)
@@ -16,8 +16,8 @@
</indexterm>
Subversion 具有模块化的设计: 它由众多由 C 编写而成的库函数实现. 每一个
库函数都有一个定义良好的目标和应用程序编程接口 (Application Programming
- Interface, API), 这种接口不仅可以被 Subversion 使用, 还能被任意一个希望
- 通过编程接口控制 Subversion 的软件使用. 另外, Subversion 的 API 不仅能被
+ Interface, 简称 API), 这种接口不仅可以被 Subversion 使用, 还能被任意一个希
+ 望通过编程接口控制 Subversion 的软件使用. 另外, Subversion 的 API 不仅能被
C 程序使用, 也能被其他高级语言编写的程序使用, 例如 Python, Perl, Java 和
Ruby.</para>
<!--
@@ -47,7 +47,7 @@
affected.</para>
-->
<para>本章的目标读者是那些希望通过 Subversion API 或它的各种语言绑定来控制
- Subversion 的人. 如果你希望围绕 Subversion 功能编写健壮的包装脚本来简化
+ Subversion 的人. 如果你希望围绕 Subversion 编写健壮的包装脚本来简化
你的工作, 或者正在开发 Subversion 与其他软件之间更加复杂的集成, 或者仅仅
是对 Subversion 的库函数感到好奇, 那你应该认真阅读本章. 但是如果你觉得
自己没必要从开发的层次上使用 Subversion, 那你完全可以跳过本章, 这并不会
@@ -68,7 +68,7 @@
<secondary>layers</secondary>
</indexterm>
Subversion 的每一个核心函数库都隶属于三个层次之一—仓库层, 仓库访问
- (Repository Access, RA) 层和客户端层 (见 <xref
+ (Repository Access, 简称 RA) 层和客户端层 (见 <xref
linkend="svn.intro.architecture.dia-1" />). 我们将会简单地介绍这些层次,
但是在这之前, 先简单地总结一下 Subversion 的各个函数库. 为了保持一致,
我们把函数库的名字写成删除了扩展名后, 在 Unix 中的库文件名 (例如
@@ -226,8 +226,8 @@
<para>在上面的介绍中, <quote>各种</quote> 这个词只出现了一次, 这是一个
好现象, 因为 Subversion 开发团队总是尽量将功能放到正确的层次和函数库
中实现. 站在开发人员的角度来看, 模块化设计最大的好处可能是降低了复杂
- 度, 于是你就可以快速地勾勒出 <quote>整体面貌</quote>, 更加容易地功能
- 的位置.</para>
+ 度, 于是你就可以快速地勾勒出 <quote>整体面貌</quote>, 更加容易地决定
+ 功能所属的位置.</para>
<!--
<para>Another benefit of modularity is the ability to replace a
@@ -250,7 +250,7 @@
<para>模块化设计的另一个好处是允许我们重新实现给定的模块, 只要保持 API 兼容
性, 就不会影响其他模块. 在某种意义上, Subversion 已经在这样做了. 函数库
<filename>libsvn_ra_local</filename>, <filename>libsvn_ra_serf</filename>
- 和 <filename>libsvn_ra_svn</filename> 各自都实现的一套相同的接口, 它们都
+ 和 <filename>libsvn_ra_svn</filename> 各自都实现了一套相同的接口, 它们都
是作为 <filename>libsvn_ra</filename> 的插件与仓库访问层通信—
<filename>libsvn_ra_local</filename> 与仓库直接通信, 另外两个通过网络与
仓库通信. <filename>libsvn_fs_base</filename> 和
@@ -606,7 +606,6 @@
commit of Subversion transactions and the modification of
revision properties. These particular events are wrapped by
the repository layer because they have hooks associated with
- ### TODO
them. A repository hook system is not strictly related to
implementing a versioning filesystem, so it lives in the
repository wrapper library.</para>
@@ -730,7 +729,7 @@
<literal>file://</literal>, <literal>http://</literal>,
<literal>https://</literal>, <literal>svn://</literal> 或
<literal>svn+ssh://</literal>) 决定了使用哪种仓库访问模块处理请求.
- 每个仓库访问模块都它认识的协议, 于是 RA 加载函数就能在运行时决定
+ 每个仓库访问模块都注册了它支持的协议, 于是 RA 加载函数就能在运行时决定
使用哪个模块. 用户可以执行 <userinput>svn --version</userinput> 查看
可用的 RA 模块及其所支持的协议:</para>
<!--
@@ -852,7 +851,7 @@
个工作副本都有这个目录, 目录内包含了用于记录工作副本状态的各种文件与
目录, 为管理性的操作提供了一个私有工作空间. 如果读者熟悉 CVS, 就会发
现 <filename>.svn</filename> 的功能与 CVS 工作副本里的
- <filename>CVS</filename> 非常类似.</para>
+ <filename>CVS</filename> 目录非常类似.</para>
<!--
Subversion's working copy library,
<filename>libsvn_wc</filename>, is directly responsible for
@@ -959,7 +958,7 @@
<para>如果你的程序建立在命令行程序的封装之上, 那么程序只能访问到已
被翻译过的信息 (上面我们刚说过, 信息可能是不完整的), 而这些信息
将被 <emphasis>再次</emphasis> 翻译成
- <emphasis>程序自己的</emphasis> 的表示格式. 每一次封装, 原始数据
+ <emphasis>程序自己的</emphasis> 表示格式. 每一次封装, 原始数据
的完整性被破坏的就越多, 类似于拷贝音频或视频磁带的拷贝 (的拷贝
…).</para>
@@ -1105,7 +1104,7 @@
Apache 可移植运行库 (Apache Portable Runtime, 简称 APR). APR
是 Apache 开发的可移植库, 最初是为了将服务器代码中与操作系统
相关的代码和不相关的代码分离开, 最终产生了一个提供通用 API 的
- 函数库, 这些 API 隐藏的操作系统之间的差异. 虽然 Apache HTTP 服务
+ 函数库, 这些 API 隐藏了操作系统之间的差异. 虽然 Apache HTTP 服务
器是 APR 的第一个用户, 但 Subversion 开发团队很快就意识到了 APR
的价值. 使用 APR 库意味着在 Subversion 代码中不存在依赖操作系统版
本的代码, 同时还意味着只要操作系统能编译和运行 Apache HTTP 服务器,
@@ -1224,7 +1223,7 @@
<quote>池</quote>), 而非每一个分配的对象. 不是使用
<function>malloc()</function> 及其亲友来分配内存, 而是调用
APR 库函数从内存池中分配内存. 如果从内存池中分配而来的对象都
- 已使用完毕, 你就可能销毁整个内存池, 同时也销毁了从该内存池中
+ 已使用完毕, 你就可以销毁整个内存池, 同时也销毁了从该内存池中
分配的 <emphasis>所有</emphasis> 对象. 于是, 你的程序不用再跟踪
将被释放的单个对象, 只需要考虑这些对象普遍的生命周期, 然后从
生命周期 (内存池被创建和销毁的时间) 匹配的内存池中分配这些对象.
@@ -1470,7 +1469,6 @@
ways. First, while SVNKit is developed as open source
software just like Subversion, SVNKit's license is more
restrictive than that of
- ### TODO (footnote)
Subversion.<footnote><para>Redistributions in any form must
be accompanied by information on how to obtain complete
source code for the software that uses SVNKit and any
@@ -1490,7 +1488,11 @@
事实上 SVNKit 与 Subversion 没有共享一行代码, 但是人们还是很容易
混淆 SVNKit 和 javahl, 甚至搞不清楚自己正在用的是哪个函数库. 读者
必须清醒地认识到 SVNKit 和 javahl 在某些方面非常不同, 首先, SVNKit
- 和 Subversion 一样都是开源软件, 但 SVNKit 的授权更加严格. 然后,
+ 和 Subversion 一样都是开源软件, 但 SVNKit 的授权更加严格. <footnote>
+ <para>如果软件用到了 SVNKit, 或者用到了使用了 SVNKit 的软件, 那么
+ 任意形式的二次发布必须带有如何获取软件完整源代码的信息. 详细
+ 的授权见 <ulink url="http://svnkit.com/license.html" />.
+ </para></footnote> 然后,
SVNKit 的目标是完全用 Java 实现, 因此在复制 Subversion 的功能时,
既要跟上官方 Subversion 的脚步, 也要考虑用 Java 实现相同功能的可
行性. 例如 SVNKit 无法通过 <literal>file://</literal> 协议访问
@@ -1969,7 +1971,8 @@
-->
<para>使用 Python 调用 Subversion API 的用户可能对回调函数在 Python
中的实现比较感兴趣. 前面已经说过, Subversion C API 对编程范式
- 回调函数/baton 的使用非常广泛, C 函数如果接受一个回调函数和 baton,
+ —回调函数/baton—的使用非常广泛, C 函数如果接受一个回调
+ 函数和 baton,
那么 在 Python 中将只接受一个回调函数, 那么主调函数如何向回调函数
传递任意的上下文信息呢? 在 Python 里, 这是通过作用域规则和参数的
默认值来实现的. 你可以从 <xref
More information about the svnbook-dev
mailing list