[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12. キーワード置換

作業ファイルを編集している間は、 いつでも `cvs status' や `cvs log' を使って そのファイルの状態を調べることができます。 しかし開発環境から取り出した場合は、 各ファイルのリビジョンを識別するのが難しくなります。

CVS は、キーワード置換 (keyword substitution) (もしくはキーワード展開 (keyword expansion)) と呼ばれる機構により、ファイルの識別を補助します。 ファイル中に $keyword$, $keyword:...$ といった書式で 埋め込まれた文字列を、ファイルを取り出すときに $keyword:value$ といった書式の文字列に置き換えます。

12.1 キーワード一覧  キーワード
12.2 キーワードの使用  
12.3 置換を止めるには  
12.4 置換モード  
12.5 キーワード $Log$ の問題点  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.1 キーワード一覧

これはキーワードの利用の一覧です:

$Author$
そのリビジョンを格納したユーザのログイン名。

$Date$
そのリビジョンを格納した日付と時間 (UTC)。

$Header$
標準のヘッダは、RCS ファイルのフルパス名, リビジョン番号, 日付 (UTC), 最終変更者, ファイル状態, (ロックされているならば) ロックしている人物という情報で 構成されます。 CVS を使用する場合、普通ファイルはロックされません。

$Id$
RCS ファイル名がフルパスでないことを除けば、 $Header$ と同じです。

$Name$
このファイルを取り出すときに使用したタグ名。キーワードは明示的なタグ名 で取り出したときにのみ展開されます。例えば、コマンド cvs co -r first を実行すると、キーワードを `Name: first' に展開します。

$Locker$
そのリビジョンをロックしている人物のログイン名。 (ロックされていなければ空で、cvs admin -l が使われていなければ それが普通です。)

$Log$
RCS ファイル名, リビジョン番号, 最終変更者, 日付 (UTC) から構成されるヘッダ行に続けて、 格納時のログ・メッセージを挿入します。 以前に挿入されたログ・メッセージを置き換えるのではなく、 新しいメッセージを $Log:...$ の次の行に挿入します。 それぞれの新しい行には $Log キーワードの前にあるものと 同じ文字列が付きます。例えば、ファイルが以下のようになっているとします。

 
  /* Here is what people have been up to:
   *
   * $Log: frob.c,v $
   * Revision 1.1  1997/01/03 14:23:51  joe
   * Add the superfrobnicate option
   *
   */

そうすると、$Log を展開するときに追加される行はその前に ` * ' が付きます。以前のバージョンの CVS、RCS と違って、 RCS ファイル の 註釈符 (comment leader) は使用されま せん。 $Log キーワードは、 ソース・ファイルに全てのログを残したい場合には便利ですが、 問題点も幾つかあります (see section 12.5 キーワード $Log$ の問題点)。

$RCSfile$
パスを含まない RCS ファイル名。

$Revision$
そのリビジョンを表わすリビジョン番号。

$Source$
RCS ファイルのフルパス名。

$State$
そのリビジョンの状態。 各リビジョンの状態は、`cvs admin -s' で割り当てることができます--- A.6.1 admin のオプション 参照。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2 キーワードの使用

キーワードを使いたい場合は、$Id$ などの適当な文字列を ファイルに記述してから格納するだけです。 CVS は格納操作の一環として自動的に (正確には commit の後に自動的に実行される update の一環として) 文字列を展開します。

$Id$ 文字列をソースファイルに入れて、生成されるファイル にそれが渡されるようにするのはよくあることです。例えば、コンピュータプ ログラムのソースコードを管理していれば、その文字列を含むように初期化さ れている変数を入れるでしょう。またバイナリ中に直接文章を埋め込むために #pragma ident 命令が使用できるコンパイラもあります。もしくは、 文書管理システムが生成されたファイルに文字列を渡す方法を提供するかもし れません。

ident コマンド (RCS パッケージの一部) を使用して、 ファイルからキーワードとその値を抜き出すことができます。 もちろんテキスト・ファイルにも使えますが、 バイナリ・ファイルからキーワードを抜き出したいときに非常に便利です。

 
$ ident samp.c
samp.c:
     $Id: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $
$ gcc samp.c
$ ident a.out
a.out:
     $Id: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $

別のリビジョン管理システムとして有名なものに SCCS があります。 SCCS には、ident と非常によく似た 同じ用途のコマンド what が含まれます。 RCS を持たないサイトの多くは SCCS を使っています。 what コマンドは @(#) という文字列を探すため、 両方のコマンドに対応するキーワードを含めるのは簡単です。 キーワードの前に、 簡単な SCCS の魔法の呪文を唱えるだけで良いのです:

 
static char *id="@(#) $Id: ab.c,v 1.5 1993/10/19 14:57:32 ceder Exp $";


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.3 置換を止めるには

キーワード置換にも欠点があります。 ファイル中に表われる文字列 `$'Author$ は、 RCS によってキーワードと見倣されます。 この文字列を `$'Author: ceder $ などと解釈させずに、 そのまま使いたい事があるでしょう。

不幸なことに、選択的にキーワード置換を止めることはできません。 `-ko' によって完全にキーワード置換を止めることができます (see section 12.4 置換モード)。

RCS キーワードが最終製品に現われるとしても、 ソース・ファイル中には使いたくない場合が多くあります。 例えばこのマニュアルのソースには `$'Author$ ではなく、 `$@i{'{}Author$} と記述しています。 nrofftroff であれば、 ヌル文字である \& をキーワード中に埋め込めば 同様の効果を発揮します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.4 置換モード

各ファイルには既定の置換モードが設定されており、 作業ディレクトリの各ファイルの置換モードも別々に設定できます。 前者は cvs addcvs admin に オプション `-k' を付けて設定します。 後者は cvs checkoutcvs update に オプション `-k' や `-A' を付けて設定します。 cvs diff にも `-k' オプションがあります。 例が幾つかありますので、9. バイナリ・ファイルの扱い5.10 マージとキーワード 参照。

利用できるモードを以下に示します:

`-kkv'
既定形式でキーワード文字列を生成します。 例えば、キーワード Revision に対して $Revision: 5.7 $ が生成されます。

`-kkvl'
`-kkv' とほぼ同様ですが、 指定されたリビジョンがロックされていれば、 ロックしている人物の名前を挿入します。 ロックしている人物名は cvs admin -l が使用されているときだけ関 係があります。

`-kk'
キーワード文字列からキーワードのみを生成し、その値は省略されます。 例えば、キーワード Revision に対して、 $Revision: 5.7 $ ではなく、 $Revision$ が生成されます。 このオプションは、リビジョン間の違いを比較する時、 キーワードによる違いを無視するのに便利です (see section 5.10 マージとキーワード)。

`-ko'
そのファイルが格納される前の、 古いキーワード文字列を生成します。 例えば、キーワード Revision に対して、 $Revision: 5.7 $ ではなく、 ファイルが格納された時の文字列である $Revision: 1.1 $ が生成されます。

`-kb'
`-ko' と同様ですが、 リポジトリに格納される標準的な行末形式 (ラインフィードのみ) を、 クライアント側のオペレーティングシステムに適した形式へ変換しません。 行端にラインフィードのみが使用されるシステム (unix 等) では、 このオプションは `-ko' と同じです。 バイナリ・ファイルの詳細情報は 9. バイナリ・ファイルの扱い 参照。

`-kv'
キーワードの値のみを生成します。 例えば、キーワード Revision に対して、 $Revision: 5.7 $ ではなく、 5.7 が生成されます。 これは、$Revision: $ といった、 キーワード識別子を除くのが困難な プログラミング言語のファイルを生成する時に便利です。 しかし、キーワード名が削除されてしまうために、 これ以後はキーワード置換を行うことができません。 従って使用には注意が必要です。

オプション `-kv' は、cvs export で使用される事が 多くあります---see section A.11 export--CVS からソースを取り出す, checkout に類似。 しかしモジュールがバイナリ・ファイルを含む場合は、 うまく処理できないので使用しない方が賢明です。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.5 キーワード $Log$ の問題点

キーワード $Log$ にはちょっと問題があります。 開発環境で作業をしているならば、 キーワード $Log$ を使用しなくても、 cvs log を使えば同じ情報が簡単に手に入ります。 いずれにしても出荷用のファイルに履歴情報は必要ないでしょう。

さらに重要な問題は、枝を幹にマージするときに、 RCS が $Log$ の項目をうまく扱えないことです。 このマージ操作の結果、衝突が起きることがよくあります。

またファイル中のログ・メッセージは、修復される傾向にあります。 (綴の間違いやほんとの間違い等)。 しかしこの結果、 cvs log の情報とファイルの中身が一致しないことになります。 これも問題といえば問題でしょう。

どうしてもキーワード $Log$ を使うのならば、 ファイルの先頭ではなく、 ファイルの 最後 に挿入することを推奨します。 この方法ならば、 長い変更メッセージを毎日眺めなくて済みます。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Yoshiki Hayashi on October, 13 2004 using texi2html