GNU arch internal

せっかく GNU arch のソースコード本体について触れたので、ここ で GNU arch そのもののソースコードの編成について説明しようと思う。 ソースコードのディレクトリ構成はさまざまな理由で大きく変わる可能性 はある。ここでは tla-1.3 のツリー構成について説明する。興味のある 人はここでの説明を理解したら、次の節の方法で GNU arch の分岐を自分 のマシンに作っていつでもハックし始めることができる。

際上位ディレクトリは以下のような雰囲気になっている。

$ ls
=ARCH-USERS-README  =INSTALL  =RELEASE-ID  COPYING  configs  src  {arch}
$ 

ここはあまり見るべきものはない。configs の下にマルチツリープ ロジェクト構築に必要な情報があるだけでどうということはない。重要な のは src ディレクトリの下だ。降りてみる:

$ cd src
$ ls
COPYING      Maintfile	  PLUGIN       configure       docs-tla   links  {arch}
ChangeLog.d  Makefile.in  build-tools  docs-hackerlab  hackerlab  tla
$ 

すこし面白くなってくる。この階層は基本的には Tom Lord が自分 で作ったビルドシステムに関係している。./configure という名前のファ イルがあるが、これが実際に tla をコンパイルする時に走らせるシェル スクリプトだ。tla 本体をハックする場合に関係するディレクトリは hackerlab と tla だけだ。hackerlab は tla とは独立したライブラリ群 で、GNU の glibc のような感じのさまざまなルーチンが入っている。tla に降りてみる:

$ cd tla
$ ls
=THANKS		COPYING      Makefile.in  libawk      libneon  {arch}
=TODO		ChangeLog    PLUGIN	  libdate     tests
=gpg-check.awk	ChangeLog.d  libarch	  libfsutils  tla
$ 

だいぶ核心に近づいてきたが、まだごちゃごちゃしている。'='文 字で始まるファイルは、例によって深く考えなくても良い。この下の libarch。ここが tla の心臓になる:

$ cd libarch
$ ls
=scraps			 cmd-get-changeset.h	    cmd-sync-tree.h
Makefile.in		 cmd-get.c		    cmd-tag.c
PLUGIN			 cmd-get.h		    cmd-tag.h
ancestry.c		 cmd-grab.c		    cmd-tree-lint.c
ancestry.h		 cmd-grab.h		    cmd-tree-lint.h
apply-changeset.c	 cmd-help.c		    cmd-tree-root.c

…

cmd-file-find.c		 cmd-show-changeset.c	    undo.c
cmd-file-find.h		 cmd-show-changeset.h	    undo.h
cmd-find-pristine.c	 cmd-star-merge.c	    whats-new.c
cmd-find-pristine.h	 cmd-star-merge.h	    whats-new.h
cmd-get-changeset.c	 cmd-sync-tree.c
$ 

ここには非常にたくさんのソースファイルがそのまま並んでいる。 数が多いので詳細は省略した。大雑把に言うと、tla foo というコマンド に対応して、cmd-foo.c と cmd-foo.h という二つのソースファイルがほ ぼ必ず存在すると考えて良い。この cmd-foo.c に書ききれる程度の機能 でしかないコマンドの場合には cmd-foo.c のみで話が終る。一つのファ イルで記述するには規模が大きすぎたり、コマンド間で共通の機能として くくり出す場合には、他のファイルが関係していることもある。この場合、 cmd-foo.c の他に、foo.c のような名前になることが多い。たとえば少し 変則的だが、tla my-id に対応するソースコードは cmd-my-id.c であり、 他の my がつくコマンドとの共通部分のソースコードは my.c に存在する、 といった具合になる。cmd-my-id.c と my.c は、GNU arch のコマンドの、 スケルトンと言っても良いくらい単純なので、新しいコマンドを追加しよ うとする人は、まずはここから読み始めるのがおすすめだ。

各コマンドのディスパッチテーブルは cmds.c にある。cmd-xxx.c で作ったコマンドをここに登録すれば tla help などの一覧でも表示され るようになり、実際に呼び出すこともできるようになる。

以下、特に注目すべきファイルを挙げる

namespace.c

GNU arch で利用されるさまざまな名前がどのような形式であるかを決めるモ ジュール。ここを書き換えるとさまざまな名前の規則を変更すること ができる。ハックは容易だが名前空間の変更はアーカイブの互換性を 失わせる結果になることが多いので注意が必要である。

invent.c

ファイルの インベントリチェックや、グループ判別ロジックがある。あるファイ ルがどのグループに属し、ソースファイルである場合にはそのインベ ントリid は何であるかはここから inv-ids.c の関数を利用してで解 析される。

make-changeset.c

GNU diff のツリーへの拡張である mkpatch() 関数 のあるモジュール。

appply-changeset.c

GNU patch のツリーへの拡張である dopatch() 関 数のあるモジュール。make-changeset.c と合わせて、GNU arch の核 心をなしている。

star-merge.c

パッチ ログの履歴や、共通祖先などの状況を考慮した上で二つのツリーをで きる限り適切にマージする star merge の実装。tla の内部では最も 高いレイアにある部分。外部コマンドとして括り出しても良いくらい のモジュール。

archive-pfs.c

GNU arch のストーレージインターフェース用ファンクションディスパッ チテーブルのあるモジュール。

archive.h

GNU arch のアーカイブオペレーション用ファンクションディスパッチテーブル、 struct arch_archive_vtable の定義があるヘッダ。このディスパッ チテーブルの具体的な実装として現時点で存在しているのが pfs-dav.c, pfs-fs.c, pfs-ftp.c, pfs-sftp.c の四つで、それぞれ WebDAV、通常のファイルシステム、ftp、sftp の実装に対応している。

pfs.h

GNU arch のファ イルシステムオペレーション用ファンクションディスパッチテーブル、 struct arch_pfs_vtable の定義があるモジュール。GNU arch のストー レージインターフェースは arch_archive_vtable とこの arch_pfs_vtable の二つのテーブルで完全に抽象化されている。