目次
Subversion はオープンソースのソフトウェアプロジェクトで、 Apacheスタイルのソフトウェアライセンスを持っています。プロジェクトは カリフォルニアに本拠地があるソフトウェア開発会社CollabNet, Inc., の 経済的な支援を受けています。このコミュニティはSubversionの開発を めぐって構成されていますが、このプロジェクトに時間を割いてもらったり 注意を向けてもらえるような形で無償援助してくれる人を常に歓迎して います。ボランティアはどんな形の援助もすることができます。 それは、バグを見つけたり、テストしたり、既にあるコードを改良したり、 まったく新しい機能を追加したりといったことを含みます。
この章はソースコードに自分の手を実際に染めることによってSubversion のいままさに起こっている進化を援護しようとする人に向けてのものです。 ソフトウェアのもっと詳細に触れ、Subversion自身を開発するのに— あるいは、Subversionライブラリを使った完全に新しいツールを書くために —必要になる技術的に重要な点について説明します。もし、そんな レベルの話に参加したくないのであれば、この章は飛ばしてもらって結構 です。Subversionのユーザとしての経験には影響を与えませんので。
Subversionはモジュール化された設計になっていて、Cライブラリの集まりと して実装されています。ライブラリのそれぞれはよく定義された目的とインター フェースを持っていて、ほとんどのモジュールは三つの主要な層のどれかに属 します。—リポジトリ層、リポジトリアクセス層(RA)、そしてクライア ント層です。これらの層について簡単に見ていきますが、最初に表 8.1. 「Subversionライブラリの一覧」 にあるSubversion ライブラリ一覧を見てくだ さい。一貫した議論とするため、ライブラリは、拡張子を除いた Unix のライ ブラリ名称で参照することにします(たとえば: libsvn_fs, libsvn_wc, mod_dav_svn)。
表 8.1. Subversionライブラリの一覧
ライブラリ | 説明 |
---|---|
libsvn_client | クライアントプログラムへの主要なインターフェース |
libsvn_delta | ツリーとバイトストリームの差分ルーチン |
libsvn_diff | コンテキスト差分とマージルーチン |
libsvn_fs | ファイルシステムの共通関数と、モジュールローダー |
libsvn_fs_base | Berkeley DB ファイルシステムバックエンド |
libsvn_fs_fs | ネイティブファイルシステム (FSFS) バックエンド |
libsvn_ra | リポジトリアクセスのための共通ルーチンとモジュールローダ |
libsvn_ra_dav | WebDAV リポジトリアクセスモジュール |
libsvn_ra_local | ローカルリポジトリアクセスモジュール |
libsvn_ra_svn | 独自プロトコルによるリポジトリアクセスモジュール |
libsvn_repos | リポジトリインターフェース |
libsvn_subr | さまざまな役に立つサブルーチン |
libsvn_wc | 作業コピー管理ライブラリ |
mod_authz_svn | WebDAV経由で Subversion リポジトリにアクセスするための Apache 認証モジュール。 |
mod_dav_svn | WebDAV操作をSubversionのものに対応付けるApacheモジュール |
表 8.1. 「Subversionライブラリの一覧」 に「さまざまな」という言 葉が一つだけ出てきているというのは、良い設計である証拠です。Subversion 開発チームはそれぞれの機能が、正しい層とライブラリにあることを確認する のを、重要なことだと考えています。多分、モジュール化した設計の一番大き な利点は開発者の観点から見た複雑さを減らすことができることです。開発者 として、あなたはすぐに、「話の概要」を知ることができ、それ によって比較的簡単にある特定の機能の場所を特定することができるようにな ります。
モジュール化のほかの利点は、与えられたモジュールをコードの別の部分に 影響与えることなしに、同じAPIを実装した新しいライブラリで置き換えることが できるということです。ある意味で、これはSubversion内部で既に起きて いることです。libsvn_ra_dav, libsvn_ra_local, そして libsvn_ra_svn の すべては、同じインターフェースを実装しています。そして、この三つすべて が、リポジトリ層とやり取りします。 — libsvn_ra_dav と libsvn_ra_svn はネットワーク越しにそう しますし、libsvn_ra_local は直接リポジトリに接続します。 libsvn_fs_base と libsvn_fs_fs ライブラリは、さらにまた別の例です。
クライアント自身もまたSubversionの設計でのモジュール性をはっきり 示しています。Subversionは現在のところコマンドラインクライアント プログラムのみを実装していますが、SubversionのためにGUIとして振る舞う ようなサードパーティーによって開発されているいくつかのプログラムが あります。このようなGUIも、既に実装されているコマンドクライアント と同じAPIを利用します。Subversionのlibsvn_client ライブラリは Subversionクライアントを設計するのに必要なほとんどの機能のために 利用することができます。 (クライアント層項参照)。
Subversionのリポジトリ層を参照するとき、一般的に、二つのライブラリに ついて語っています—リポジトリライブラリとファイルシステムライブラリ です。これらのライブラリはバージョン管理されたデータのさまざまなリビジョン のための格納と報告の仕組みを提供しています。この層はリポジトリアクセス層 を経由してクライアント層とつながっていて、Subversion利用者から見ると、 「通信の相手先」にあるものに見えます。
Subversionのファイルシステムはlibsvn_fs APIによってアクセスされ、 オペレーティングシステムにインストールされているカーネルレベルの 意味でのファイルシステム(Linuxのext2 や、NTFSのような)ではなく、 仮想的なファイルシステムのことです。「ファイル」と 「ディレクトリ」を (自分の好きなシェルを使って操作することができるような)現実の ファイルとディレクトリとして保存するのではなく、バックエンドの 抽象的な保存の仕組みとして二つのうちのどちらかが利用可能です — Berkeley DB データベース環境か、フラットファイルによる 表現です。(この二つのバックエンドについてより深く知りたい場合は リポジトリの保存形式項を見てください)。 しかし、Subversionの今後のリリースの中で開発コミュニティによって 興味を引いている、別のバックエンドデータベースシステムの利用 可能性があります。たとえば、オープンデータベースコネクティビティー (ODBC)などです。
libsvn_fs が提供するファイルシステムAPIは他のファイルシステムAPI でも期待できるような機能を持っています: ファイルやディレクトリの 作成や削除ができて、コピーや、移動ができ、ファイルの内容を 修正することができて、などなどです。あまり一般的ではないような 機能もあります。たとえば、ファイルやディレクトリに付随した メタデータ(「属性」)の追加、変更、削除、などです。さらに Subversionファイルシステムはバージョン化可能なファイルシステムで、 これは、ディレクトリツリーに変更を加えると、Subversionはその変更 以前に、そのツリーがどのように見えるかを憶えておくということを 意味します。そして、さらにその前の変更前、さらにその前、などです。 このようにして、ファイルシステムに何かを最初に追加したところまでの すべてのバージョンに戻ることができます。
ツリーに加えたすべての変更はSubversionのトランザクションの中で実行 されます。以下は、ファイルシステムを修正するための単純で一般的な 手続きです:
Subversionトランザクションの開始
修正の実行(追加、削除、属性の修正、など)
トランザクションのコミット
トランザクションをコミットすると、ファイルシステムの変更は歴史上の 出来事として永久に記録されます。このようなそれぞれのサイクルは ツリーに新しいリビジョンを作り、それぞれのリビジョンは「あることが どのようであったか」という純粋なスナップショットとしていつでもアクセス できるようになります。
ファイルシステムインターフェースによって用意される機能のほとんどは
ファイルシステムパスに対して起こる操作として提供されます。
つまり、ファイルシステムの外部からは、ファイルやディレクトリの個別の
リビジョンを記述し、アクセスする、主要な仕組みは、/foo/bar
のようなパス文字列を使うことを通じて提供され、それはちょうど、あなたが
なじみのシェルプログラムを通じてファイルやディレクトリにアクセスする
ような感じになります。適切なパス名を正しいAPI関数に渡すことによって、
新しいファイルやディレクトリを追加することができます。同じ仕組みを使って
そのファイルなどに関した情報を問い合わせることができます。
ほとんどのファイルシステムとは違い、パスだけを指定するのは、Subversion のファイルやディレトクリを特定するのに十分な情報ではありません。 ディレクトリツリーを二次元のシステムと考えてください。ここで、あるノードの 兄弟は、左から右に移動することを表現していて、サブディレトクリに降りていく のは、下向きの移動であると考えてください。図 8.1. 「二次元の中のファイルとディレクトリ」 は典型的なツリーの 表現を示しています。
もちろんSubversionのファイルシステムは隠れた第三の次元を持っていますが、
それはほとんどのファイルシステムが持っていないものです—それは時間の次元です!
[41]
ファイルシステムインターフェースで、path
引数を
持つほとんどすべての関数はまたroot
引数も指定し
なくてはなりません。このsvn_fs_root_t 引数は、
リビジョンか、Subversionのトランザクション(それは普通はリビジョンとな
るべきものです)のどちらかをあらわし、リビジョン32の
/foo/bar
と、リビジョン98の同じパスとの間の違いを
理解するのに必要になる三次元コンテキストを用意します。図 8.2. 「バージョン化した時刻—第三の次元!」 はSubversionファイルシステムの宇宙に
追加された次元についてのリビジョン履歴をあらわしています。
以前指摘したように、libsvn_fs API は他のファイルシステムと見かけは よくにているが、このすばらしいバージョン管理能力だけは例外です。 それはバージョンファイルシステムに興味のあるすべてのプログラマによって 利用できるように設計されました。偶然の一致ではありませんが、 Subversion自身もその機能に興味があります。しかし、ファイルシステムAPI は基本的なファイルとディレクトリのバージョン管理をサポートしていますが Subversionはさらに多くを要求します—そしてそれはlibsvn_repos が 提供するものです。
Subversionリポジトリライブラリ(libsvn_repos)は基本的には ファイルシステム機能のまわりにあるラッパーライブラリです。この ライブラリはリポジトリレイアウトの作成、ファイルシステムの初期化を 正しく実行すること、などに責任を持ちます。Libsvn_repos はまた フックを実装します—特定の処理が実行されるときにリポジトリの コードによって実行されるスクリプトです。このようなスクリプトは 通知、認証、あるいはリポジトリ管理者が望むようなさまざまな 目的にとって役に立つものです。このタイプの機能と、リポジトリライブラリ によって提供されるほかのユーティリティーはバージョン化ファイルシステム の実装に強く関連しているわけではありません。それが独自のライブラリとして 実装された理由です。
libsvn_repos APIを使おうとする開発者には、それがファイルシステムインターフェース に対する完全なラッパではないことがわかるでしょう。つまり、 ファイルシステム操作の一般的なサイクルにある主要なイベントに ついてだけリポジトリインターフェースによってラップされます。 その中のいくつかは、Subversionトランザクションの生成やコミット、 リビジョン属性の修正などです。このような特定のイベントはそれに 関連したフックがあるため、リポジトリ層によってラップされます。 将来的には他のイベントもリポジトリAPIによってラップされるかも 知れません。しかし、残りのファイルシステムの作用のすべては libsvn_fs API 経由で直接実行されます。
たとえば、ディレクトリが追加されるファイルシステムの新しい
リビジョンを作るための、リポジトリとファイルシステムインターフェース
について、使い方を説明したコードがあります。
この例で(そして、この本全体を通じてすべてのほかの例でも)、
SVN_ERR()
マクロは単にラップした関数からの
失敗した場合のエラーコードのチェックです。そしてそのようなもの
があればそのエラーを返します。
例 8.1. リポジトリ層の利用
/* Create a new directory at the path NEW_DIRECTORY in the Subversion repository located at REPOS_PATH. Perform all memory allocation in POOL. This function will create a new revision for the addition of NEW_DIRECTORY. */ static svn_error_t * make_new_directory (const char *repos_path, const char *new_directory, apr_pool_t *pool) { svn_error_t *err; svn_repos_t *repos; svn_fs_t *fs; svn_revnum_t youngest_rev; svn_fs_txn_t *txn; svn_fs_root_t *txn_root; const char *conflict_str; /* Open the repository located at REPOS_PATH. */ SVN_ERR (svn_repos_open (&repos, repos_path, pool)); /* Get a pointer to the filesystem object that is stored in REPOS. */ fs = svn_repos_fs (repos); /* Ask the filesystem to tell us the youngest revision that currently exists. */ SVN_ERR (svn_fs_youngest_rev (&youngest_rev, fs, pool)); /* Begin a new transaction that is based on YOUNGEST_REV. We are less likely to have our later commit rejected as conflicting if we always try to make our changes against a copy of the latest snapshot of the filesystem tree. */ SVN_ERR (svn_fs_begin_txn (&txn, fs, youngest_rev, pool)); /* Now that we have started a new Subversion transaction, get a root object that represents that transaction. */ SVN_ERR (svn_fs_txn_root (&txn_root, txn, pool)); /* Create our new directory under the transaction root, at the path NEW_DIRECTORY. */ SVN_ERR (svn_fs_make_dir (txn_root, new_directory, pool)); /* Commit the transaction, creating a new revision of the filesystem which includes our added directory path. */ err = svn_repos_fs_commit_txn (&conflict_str, repos, &youngest_rev, txn, pool); if (! err) { /* No error? Excellent! Print a brief report of our success. */ printf ("Directory '%s' was successfully added as new revision " "'%ld'.¥n", new_directory, youngest_rev); } else if (err->apr_err == SVN_ERR_FS_CONFLICT) { /* Uh-oh. Our commit failed as the result of a conflict (someone else seems to have made changes to the same area of the filesystem that we tried to modify). Print an error message. */ printf ("A conflict occurred at path '%s' while attempting " "to add directory '%s' to the repository at '%s'.¥n", conflict_str, new_directory, repos_path); } else { /* Some other error has occurred. Print an error message. */ printf ("An error occurred while attempting to add directory '%s' " "to the repository at '%s'.¥n", new_directory, repos_path); } /* Return the result of the attempted commit to our caller. */ return err; }
このコードで、リポジトリとファイルシステムインターフェースの両方に
対する呼び出しがあります。svn_fs_commit_txn()
を
使ってトランザクションを簡単にコミットできます。しかし、
ファイルシステムAPIはリポジトリライブラリのフックの仕組みについては
何も知りません。もしSubversionリポジトリにトランザクションをコミット
するたびに自動的にある種の非Subversion的な作業を実行させたい場合、
(たとえば、開発者メーリングリストにそのトランザクションで起きたすべて
変更を説明するメール を送信する、など)、その関数のlibsvn_reposで
ラップされたバージョンを使う必要があります—
svn_repos_fs_commit_txn()
。
この関数は実際にはもし存在すれば、最初に「pre-commit」フックスクリプトを実行し、
それからトランザクションをコミットし、最後に「post-commit」フックスクリプト
を実行します。フックは、実際にはコアのファイルシステムライブラリ自身
に含まれない特別の報告の仕組みを用意します。
(Subversionのリポジトリフックについての詳細はフックスクリプト項を見てください)。
フックの仕組みは、残りのファイルシステムコードから 独立したリポジトリライブラリの抽象化が一つの理由です。 libsvn_repos API はほかにもいくつかの重要なユーティリティーを Subversionに提供しています。これには以下のようなものがあります:
Subversionリポジトリと、それに含まれるファイルシステム上での ファイルの生成、オープン、削除、そして回復のステップ
二つのファイルシステムツリー間の比較の表示
ファイルシステム中で修正されたファイルがあるすべて(あるいは いくつかの)のリビジョンに結びついたコミットログメッセージへの 問い合わせ
ファイルシステムの可読な「ダンプ」の生成、ファイルシステム中にある リビジョンの完全な表現
ダンプフォーマットの解析、異なるSubversionリポジトリの中に ダンプされたリビジョンをロードすること
Subversionが進化し続けるにつれて、リポジトリライブラリは 増えつづける機能と設定可能なオプションをサポートを提供する ために,ファイルシステムライブラリとともに大きくなり続ける でしょう。
もしSubversionリポジトリ層が、「通信路のもう一方の端点」 であるなら、リポジトリ アクセス層は、その通信路そのもののです。クライアントライブラリとリポジトリ の間でデータを相互変換することが課せられたこの層は libsva_raモジュールローダ ライブラリ、そのRAモジュール自身(現在のところ、libsvn_ra_dav, libsvn_ra_local,そして libsvn_ra_svnを含みます)、そして一つ以上の RA モジュールに必要となる追加 のライブラリ、たとえば、libsvn_ra_dav が通信するための、mod_dav_svn Apache モジュールを含みます。mod_dva_svn モジュールを利用しないときには、 libsvn_ra_svn のサーバであるsvnserveが通信します。
Subversionは、リポジトリリソースを特定するのに URLを利用するので、
URLスキーマのプロトコル部(普通は、file:
,
http:
, https:
, あるいは
svn:
) はどの RA モジュールが通信を処理するか
を決めるために使われます。それぞれのモジュールは、プロトコルのリスト
を登録しますが、それはどうやって「話せば」良いかを知っているので、
RA ローダが実行時にどのRAモジュールをその処理のために利用するかを
決定することができます。どのRAモジュールがSubversionコマンドライン
クライアントに利用可能かを決定することができ、svn --version
を実行することで、どのプロトコルはサポートしていないと言ってくるか
を知ることができます。:
$ svn --version svn, version 1.2.3 (r15833) compiled Sep 13 2005, 22:45:22 Copyright (C) 2000-2005 CollabNet. Subversion is open source software, see http://subversion.tigris.org/ This product includes software developed by CollabNet (http://www.Collab.Net/). The following repository access (RA) modules are available: * ra_dav : Module for accessing a repository via WebDAV (DeltaV) protocol. - handles 'http' scheme - handles 'https' scheme * ra_svn : Module for accessing a repository using the svn network protocol. - handles 'svn' scheme * ra_local : Module for accessing a repository on local disk. - handles 'file' scheme
libsvn_ra_dav ライブラリは、サーバとは別のマシン上で
実行されているクライアントによって利用されるように設計されています。
クライアントはURLを使って特定のサーバを指定することで通信します。
ここでいうURLは、http:
または
https:
のプロトコル部分を含んでいるようなものです。
どのようにこのモジュールが動作するかを理解するために、最初にリポジトリ
アクセス層の特定の設定中にあるほかのいくつかのキーコンポーネントに
触れる必要があります—それは強力な Apache HTTP サーバと、
Neon HTTP/WebDAV クライアントライブラリです。
Subversionの主なネットワークサーバはApache HTTP サーバです。Apache は 十分にテストされ、拡張可能なオープンソースのサーバプロセスで、それは まじめな用途に利用することができます。それはネットワークの高負荷に 持ちこたえることができ、たくさんのプラットフォーム上で動作します。 Apacheサーバはたくさんの異なる標準認証プロトコルをサポートし、 たくさんの人々によってサポートされたモジュールを利用することで 拡張することができます。それはまたネットワークパイプラインやキャッシング のような最適化をサポートしています。サーバとしてApache を利用することに よって、Subversionはこれらのすべての機能を自由に手に入れることが できます。そして、ほとんどのファイアウォールはHTTPの通信を通すように 設定されているので、システム管理者は、普通はファイアウォール設定 を変更する必要すらなくSubversionを動作させることができます。
SubversionはHTTPとWebDAV(DeltaV付きで) を使って、Apacheサーバと 通信します。これについては、この章の WebDAVの節を呼んでください。 しかし、簡単に言えば、WebDAVとDeltaV は標準的なHTTP1.1プロトコル の拡張で、それはweb上でファイルの共有とバージョン化を可能にします。 Apache 2.0 は mod_dav が用意されていて、これは HTTP のDAV拡張を 理解するモジュールです。Subversion自身は mod_dav_svn をサポートして いますが、これは別の Apache モジュールで、mod_dav と協調して動作し、 (実際にはそのバックエンドとして)Subversion上での具体的な WebDAVと DeltaVの実装となっています。
HTTP越しにリポジトリと通信するとき、 RAローダライブラリは libsvn_ra_dav を
サーバプロセスモジュールとして選択します。Subversionクライアントは
一般的な RA インターフェースを呼び出し、 libsvn_ra_dav はこのような
呼び出しを(それはまだ大雑把なSubversionの動作を具体化します)を、
HTTP/WebDAV要求に変換します。Neon ライブラリを使って、libsvn_ra_dav
はこのような要求をApacheサーバに送信します。Aapche はこのような要求
を受け取り(Webブラウザがやるのとまったく同じ一般的なHTTP要求ですが)、
DAV管理の位置として設定されたURLに振り向け(
httpd.conf
ファイル中の
<Location>
命令を使います)、その要求を固有の
mod_davモジュールに渡します。適切に設定されていれば、mod_dav
は Apache 付属の一般的な mod_dav_fs ではなく、Subversionの
mod_dav_svn をファイルシステムに関連した要求に対して利用することを
知っています。それで、最後には、このクライアントは mod_dav_svn と
通信しますが、これは直接Subversionリポジトリ層に結び付いている
ものです。
これが実際に起こるやり取りの簡略化した説明です。たとえば、 SubversionリポジトリはApacheの認証命令によって保護されているかも知れません。 これによって、リポジトリと最初に通信しようとする試みが、認証付きApacheに よって失敗に終わるかも知れません。 この時点で、libsvn_ra_davはApacheから、不十分な 認証しか得られなかったのでクライアント層に更新された認証データを 取得するためにコールバックした、という通知を受けます。 もしこのデータが正しく取得できれば、ユーザは、許可された最初の操作 を実行する、libsvn_ra_davの次のアトミックな要求を探し、すべて がうまくいきます。もし十分な認証情報が与えられなければ要求は最終的に 失敗し、クライアントはユーザにその旨を報告します。
NeonとApacheを使って、Subversionはほかのいろいろな複雑な領域への 自由な機能を得ることもできます。たとえば、もしNeonがOpenSSLライブラリ を見つけた場合、それはSubversionクライアントにSSLで暗号化された 通信を、Apacheサーバとすることを認めます。 (その固有の mod_ssl は「その言語を話します」)。また、Neon自身と Apacheのmod_deflateは「deflate」アルゴリズムを理解できるので( PKZIPとgzipプログラムで利用されているのと同じものですが)、 要求はより小さな圧縮された塊として通信路を流れます。 Subversionが今後サポートしたいと思っているほかの複雑な機能 としては、自動的にサーバ側のリダイレクトを処理すること(たとえば、 リポジトリが別の新しいURLに移動したような場合) や、HTTPパイプライン の恩恵にあずかること、などです。
標準的なHTTP/WebDAV プロトコルに加えて, Subversionは固有の
プロトコルを使う RAの実装も用意しています。libsvn_ra_svn モジュールは
固有のネットワークソケット接続を実装し、リポジトリのあるスタンドアロンサーバ
と通信します—svnserve
です—
クライアントはsvn://
スキーマでリポジトリにアクセスで
きます。
この RA 実装は、前の節で触れたApacheの利点のほとんどを欠いています。
しかし、それはある種のシステム管理者を引きつけるかも知れません。
それは非常に簡単に設定し実行できます。svnserve
プロセスの設定は、ほとんど瞬間的に終わります。またそれはApacheよりも
(コード行数という意味で)ずっと小さく、セキュリティーや他の事情による
チェックもずっと容易です。さらにいくつかのシステム管理者は既に
SSH のセキュリティーインフラを持っていて、Subversionにもそれを使わせたい
と思っているかも知れません。ra_svn を使うクライアントは SSH を介して
プロトコルを簡単にトンネルすることができます。
Subversionリポジトリとのすべての通信が大きなサーバプロセスとネットワーク層
を必要とするわけではありません。ローカルディスク上のリポジトリにアクセス
したいだけのユーザにとっては、file:
を使うことができ、
libsvn_ra_localが提供する機能を使うことができます。
この RA モジュールは直接リポジトリとファイルシステムライブラリと
結びつくので、ネットワーク通信はまったく必要ありません。
Subversionはfile:
URLの一部として
localhost
か、空である
サーバ名称を含むことを要求し、ポート指定はありません。
言い方を変えると、URLは何か、
file://localhost/path/to/repos
か
file:///path/to/repos
のような形のものになります。
さらに、Subversionのfile:
URLは普通webブラウザが
file:
URLがやる方法では利用できないことに注意して
ください。通常のwebブラウザで file:
URLを閲覧しようと
いうとき、ファイルシステムを直接調べることでその場所にあるファイルの
内容を読み出して表示します。しかし、Subversionのリソースは仮想ファイル
システム中にあり、(リポジトリ層項参照)あなたのブラウザは
そのファイルシステムをどうやって読めば良いか理解できないでしょう。
さらに別のプロトコルを使ってSubversionのリポジトリにアクセスしたいと いう人にとってこそ、どうしてリポジトリアクセス層がモジュール化されている かという理由になります。開発者は片方で RA インターフェースを実装する 新しいライブラリを簡単に書くことができ、もう一方でそのリポジトリと 通信することができます。新しいライブラリは既に存在しているネットワーク プロトコルを利用することもできますし、自分で開発したものでも良いのです。 プロセス間通信(IPC)呼び出しを使うかも知れませんし—ちょっとおバカ かも知れませんが—メールベースのプロトコルを使うことだってできます。 SubversionはAPIを提供し、あなたは自分の想像性を提供する、と。
クライアント側から見ると、Subversionの作業コピーは すべての処理が起こる場所です。クライアント側ライブラリによって 実装される機能は、作業コピーの管理というただ一つの目的のために 存在します—ローカルな場所に何らかの形で提供される ファイルと他のサブディレクトリのあるディレクトリが、一つ以上の リポジトリ位置を「反映した」ものとし、リポジトリアクセス層との間の 変更を伝えたりします。
Subversionの作業コピーライブラリ、libsvn_wc は作業コピー中の
データの管理に直接の責任を負います。これをやるために、このライブラリ
は特別なサブディレクトリの中にそれぞれの作業コピーについての管理情報
を格納します。このサブディレクトリは.svn
という
名前ですが、どの作業コピー中にも存在し、管理に関係した動作を
するための状態を記録し、作業スペースを確保するためのさまざまな
ファイルやディレクトリを含んでいます。CVSになじみのある人なら、
この.svn
サブディレクトリは、その目的としては
CVSの作業コピーにある管理ディレクトリCVS
に
よく似ていることがわかると思います。.svn
管理領域についての詳細は、この章の
作業コピー管理領域の内部項を参照してください
Subversionクライアントライブラリ libsvn_client は広範囲の役目を
負います。その仕事は、作業コピーライブラリの機能と、リポジトリアクセス層
の機能を結びつけることで、一般的なリビジョン制御を実行したいと思う
すべてのアプリケーションに最上位のAPIを提供することです。たとえば
svn_client_checkout()
関数は引数としてURLを
とります。この関数は URLを RA層に渡し、特定のリポジトリに認証された
セッションを開きます。それからそのリポジトリに特定のツリーを指定し、
このツリーを作業コピーライブラリに送りますが、今度はそのライブラリが
作業コピー全体をディスクに書き込みます(.svn
ディレクトリを含むすべての情報)。
クライアントライブラリはどのようなアプリケーションからも利用できる ように設計されています。Subversionのソースコードは標準的なコマンド ラインクライアントを含んでいるので、そのクライアントライブラリの 上に好きなだけGUIクライアントを書くことができます。Subversionの 新しい GUI(あるいは実際には新しいクライアント)は、コマンドライン クライアントを含むダサいラッパである必要はありません。 —それは、libsvn_client API を通じてコマンドラインクライアント が使っているのと同じ機能、データ、コールバックの仕組みに完全にアクセス することができます。
[41] わたしたちは、時間は実際には第四の 次元である という印象をずっと持っていたSFファイルにショックを与えるということを 理解していますし、別の理論をわたしたちが宣言することによって生じる 心理的なトラウマについては謝らなくてはなりませんね。