rcsview のページ

これは何?

RCS ファイルをながめるためのツールです。 C で記述されたバックエンドと、 emacs lisp によるフロントエンドから構成されます。

バックエンドプログラムは単独で起動することも可能で、 RCS ファイルに対して "cvs annotate" 相当の内容を出力する 機能をおまけとして持っています。

emacs 上で動作するフロントエンドは、バッファ中での「ドット」位置を 保存したまま、リビジョンを前後に移動する機能があります。 というか、それだけで、今のところ実用性はありません。 もう少し機能を加えると多少使いものになるかもしれません。 emacs 上のスクリーンダンプ例 黄色の部分は、そのリビジョンで新規に追加された行を意味しています。


配布とライセンス

tar ball をダウンロードして下さい。 ちなみに、フロントエンドのソースコードと、 バックエンドのソースコードも置いてありますが、 tar ball 中に入っています。 (google キャッシュによる分散バックアップ期待)

ライセンスは次の通りです(修正BSDライセンス)。

Copyright (c) 2002 Atsushi Furuta.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

ただし、配布の都合上、将来のバージョンについては別のライセンス (自由に利用可能であって、再配布が自由なもの)を付与したものも公開する 可能性があります。 しかしながら今後、少くとも修正BSDライセンスのものはリリース を続けるつもりではあります。

もしこの配布方針に賛成できなければ、 どうかパッチを送ってこないでください。


コンパイルとインストール

tar ball を展開して、自力でコンパイルしてください。

バックエンド

バックエンドは ANSI-C 準拠で書いてあるつもりでいます。 大抵の UNIX 系 OS では、修正なしでそのまま cc で コンパイルできると期待しています。 Makefile を添付してあるので、*BSD 系の OS であれば make だけでバックエンドバイナリを生成してくれるかもしれません。

フロントエンド

フロントエンドは、ファイルの先頭の

(defvar *rcsview-backend-command* "~/work/rcs/rcsview")
の行をバックエンドのパス名に書換えてから、 emacs を手で起動して M-x byte-compile-file して下さい。 バイトコンパイルせずに load しても動作してくれるとは思います。

この説明でワカランという人は、とりあえず諦めてください。


環境

NetBSD-current (1.5X) + emacs-20.7 という環境で開発しています。 OS 依存性はあまりないと思いますが、emacs のバージョンが違えば 動かない可能性が高いです。

フロントエンドは、バックエンドの他に rlog を必要としていますので、 rcs がインストールされている必要があります。


使い方

バックエンド

    rcsview -u <rcsfile>
    rcsview -a <revision> <rcsfile>
    rcsview [-p] <revision> <rcsfile>

フロントエンド

  M-x rcsview-rcs-file
で、適当な RCS ファイルを指定してやると、RCS-Log バッファと RCS-Text バッファという二つのバッファがウィンドウ上に生成されます。 どちらのバッファでも "p" でリビジョンを遡り、"n" でリビジョンを下ります。

RCS-Text バッファで "a" を打つと、annotation header の表示を ON/OFF できます。(これはかなり重いみたいです)


バグ

バックエンド

引数に指定する RCS ファイルは、"*,v" ファイルそのものへのパス名を明 示しなくてはなりません。対応する作業ファイル名で指定したり、"RCS" ディ レクトリを省略したりできません。

引数に指定する リビジョン は、タグ等 symbolic なものは使えず、digit と "." だけで表記した リビジョン 番号だけしか使えません。 日付指定もできません。

(RCS 5.7 の rcsfile(5) に記述された) RCS ファイル以外のフォーマットの ファイルを指定した場合、動作は未定義です。一応、構文エラーを検出して 終了するようにはしようとしているみたいですが、多分不完全でしょう。

コメントの英語はきっとダメダメです。

フロントエンド

使いものになりません。

変な動きをします。重要なファイルを編集中の emacs で、セーブせずに フロントエンドを使うのは、きっと自殺行為です。

目標の割に圧倒的に機能が足りていません。

コメントの英語はきっとダメダメです。


プログラムの実装について

適当な RCS ファイルを指定して、-u オプション付きでバックエンドを起動 してみると、バックエンドの出力形式を見ることができます。

この出力には、 RCS ファイル中のある リビジョン で一度でも存在したことがある行全てが 入っています。加えて、各々の行の「生存範囲」を示す情報も入っています。 一部抜き出すと

1 1.1,1.2  ………(1)
rcs_revision_create(char *rev)
1 1.2      ………(2)
rcsnum_create(char *rev)
45 1.1     ………(3)
{
   : 以下続く

ブランチ のある場合、3つ以上の リビジョン が並ぶこともあります。"," で 区切られた最初の リビジョン が、その行が出現した リビジョン で、以降の リビジョン はその行が削除された リビジョン です。

これらは、ファイル中での出現順序で並んでいます。この出力を頭から読 んで、ある リビジョン で生存している行だけを出力すれば、その リビジョン の内容がそのまま得られるようになっています。

フロントエンドでは emacs の overlay 機能を使って、生存していない行 に invisible overlay を設定することで、バッファの内容を変更せずに特 定の リビジョン の内容を表示しています。

バックエンド

-u 出力を得るためにちょっと構造を工夫している以外は、とりたてて言う ところはありません。独立したツールとするために、自前で RCS のパーザー とレキシカルアナライザーを実装しています。

RCS ファイルは、メイントランク の最新版の内容と、メイントランク 上の逆方向 の差分情報、ブランチ上の正方向の差分情報を保持しています。特定の リビジョン の内容を得るには、メイントランク 最新版から開始して、次々と差 分を適用することになります。差分は、その時点での「行番号」ベースで の行挿入操作、と行削除操作で表現されています。そのため、行単位での (穴あき)配列構造を作成して、次々と挿入、削除操作を行えば目的の リビジョン が得られます。

バックエンドでは、-u 出力を得るために、この「行」構造を穴あき配列で 編集するだけではなく、行構造をリストで結んでいます。差分適用前は 穴あき配列とリストは同じ行の列です。編集操作で削除が行われると、 穴あき配列からその行は削除されますが、リストからは削除されません。 編集操作で挿入が行われると、穴あき配列への挿入と同時に、挿入位置で リストへも連結されます。

この編集操作を特定の リビジョン を得るべく行うのではなく、全ての差分 についてリビジョン 木に従って適用してやると、全ての出現行のリストが得 られることになります。と同時に、全ての行についてその出現 リビジョン と削除 リビジョン (もし削除されていれば)が確定します。その情報を出力 しています。

-a 出力は、特定の リビジョン にの行 + その行の出現 リビジョン から構成 されています。これは、上記の -u の操作のサブセット(必要な差分しか適 用しない)によって簡単に得られます。

フロントエンド

作者は emacs lisp に関して万年ど素人であるというか、どうもダメダメ なコードあると思っているようです。

設計しなおして再度書いた方がいいものが書けるような気もしますが、ど うも根性が足りてないので、いまのところこれ以上ドキュメントを書くこ ともないでしょう。


TODO

作者はへたれているので、今のところ TODO はありません。

反応(称賛、罵倒、おごり、などなど)があると、増えるかもしれません。


Copyright(C) 2002 Atsushi Furuta <furuta@bsdclub.org> All rights reserved.