Original: http://red-bean.com/pipermail/changesets/2003-April/000250.html

Date: Sat, 19 Apr 2003 17:08:14 -0600
From: David Waite 
To: changesets@red-bean.com
Subject: (Potential) goals document

This is a multi-part message in MIME format.
--------------060001040909050402090507
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

Holding true on my threats, here is an document of the goals from the
various interests represented by this list, as well as some basic
glossary definitions. Please, please feel free to comment on this.

-David Waite


チェンジセットの目標

* 導入

 伝統的な diff プログラムにはいくつもの問題があり、それは共同作業
をする開発者によって利用される場合に障害となってきました。問題の
一番有名な例では、ツリーの再構成を表現したり、テキスト以外のファイル
の変更を表現するための能力を持っていないことがあげられます。


また、そのほかにも、diff の形式を拡張することができるようなさまざまな
余地があり、それは、標準化された方法で編集者や変更点の記述を追加し、
変更のまとまりを特定したり、変更のなかったファイルの全体を特定する
こと、などがあります。



* 数学的な定義

しかしながら、チェンジセットと伝統的な diff との間の基本的な目的は
同じです。与えられたファイルセット ORIG と結果としてのファイルセット
NEW 、そしてチェンジセット MOD は、以下のような 'mkchangeset'関数と
して形式化することができます。
 
    mkchangeset(ORIG, NEW) = MOD

与えれた'applychangeset"関数によって、MOD と ORIG から、NEW を再構成
することができます。

    applychangeset(ORIG, MOD) = NEW


与えられた'invchangeset'関数によって、NEW と MOD から ORIG を再構成
することができます。

    applychangeset(NEW, invchangeset(MOD)) = ORIG

ORIGとは異なる TARGETというファイルセットが与えられたとき、

    applychangeset(TARGET, MOD) は TARGET と等しいかも知れないし、そうでは
ないかも知れません。ここで TARGET は ORIG と NEW の間の変更と含んで
いて、さらに TARGET と、TARGET と ORIG の間で共通の BASE ファイルセット
との間の変更も含んでいるようなものです。(???)

    applychangeset(TARGET, MOD) may or may not equal TARGET', a fileset
containing both the changes between ORIG and NEW, as well as the changes
between TARGET and any common BASE fileset between TARGET and ORIG.

* 目標

 1. チェンジセットは POSIX の diff 形式とでき限り下位互換性のある形で
表現される能力を持っていなくてはなりません。つまり、チェンジセットは
POSIX のパッチプログラムによって部分的に適用できなくてはならないという
ことです。そのような下位互換性のあるチェンジセットは POSIX の diff ファイル
で表現されるような変更を適用できなくてはならず、 POSIX の diff ファイル
で表現できないような変更を無視しなくてはなりません。

 2. チェンジセットは最終的には下位互換性を持たないような形式で表現
されるかも知れません。それはチェンジセットの作成者や、チェンジセット
を扱うツールの判断になります。

 3. 変更はバイナリファイルの内容の変更を表現できなくてはなりません。
これは、変更は、二つのファイルタイプに対する内容の変更を最低でもサポート
しなくてはならないことを意味します - テキストファイルに対してはPOSIX 
の diff 、バイナリファイルに対してはバイナリ diff です。変更は、今後
実装されるかも知れない別の変更表現形式を指定する仕組みをサポートすべき
です。チェンジセットは POSIX の diff 出力の特定の形式に制限されるかも
知れません - おそらくそれは unified diff ということになるでしょう。

 4. チェンジセットはファイルセットのツリー構造の変更を表現できなくては
なりません。ディレクトリ中のノードの作成、削除、コピー、移動のような
動作、あるいは、ファイルセット中にある別のディレクトリに対するそのような
操作を表現できなくてはなりません。

 5. 変更はノードまたはファイルセットに結びつた任意のメタデータを表現
できなくてはなりません。それはファイルのパーミッションや、mime タイプ、
ソース制御情報、一意的な識別子/位置の情報に制約されるものではありません。

 6. 任意の二つのファイルツリー ORIG と NEW の間のチェンジセットを
生成することが可能でなくてはなりません。チェンジセットは作成や削除の
ような変更で表現されるような 'move' や 'copy' のツリー構造に対する
操作を(patch と互換性のある形で)認めなくてはなりませんが、付加的に
その変更が 'move' や 'copy' を表現していることを示すかも知れません。(???)
チェンジセットツールはファイルセット ORIG と NEW に対する 'move' や
'copy' の変更を表現すべきですが、これは他のツールの可能性を広げるものに
なるでしょう。

 7. チェンジセットは、チェンジセットを生成するために利用されたオリジ
ナルなツリー(ORIG)にたいして適用される場合には、'applychangeset' で
失敗することなる適用できなくてはなりません。チェンジセットは、失敗
する可能性があるにせよ、ORIG とは異なるファイルセットTARGETに対しても
適用する能力を持っていなくてはなりません。これは、ORIG と TARGET
の間の共通の祖先が知られているかどうかにかかわらず、その能力を持たな
くてはなりません。

 8. チェンジセットは共通の祖先のファイルセットに関する情報、ORIG と
TARGET の間の変更に関する情報、そして、共通の祖先 BASE に関する情報
に基づいて TARGET に適用されるばあいには、追加の能力を持つかも知れま
せん。

 9. チェンジセットはツールによって(変更ごとに)部分的な適用をする能力
を持っていなくてはなりません。

 10. チェンジセット(と、それゆえ、変更)は、逆向きに適用する能力を持って
いなくてはなりません。

 11. スマートパッチは POSIX の diff ユーティリティーで適用できるかも
知れませんが、もし複数の拡散した(ブランチ化された)変更が起きた場合には
失敗しなくてはなりません。

 12. スマートパッチ、チェンジセット、そして変更はメタデータで拡張する
ことができなくてはなりません。これはチェンジセットの一意性を示す識別子
や、最初の場所に関する情報を含まなくてはなりませんが、それに制限される
ものではありません。

 13. スマートパッチはブランチとマージの概念を表現する力を持っていなく
てはなりません。

* 概念的な構造
                  __________
                 |          |
                .|,         |
            0..* v          |
   *--------------------*   |
   |                    |/\_|
   |    Smart Patch     |\/
   *--------------------*
             /\
             \/
             |
            .|,
             v 1..*
   *--------------------*
   |                    |
   |      ChangeSet     |
   *--------------------*
             /\
             \/
             |
            .|,
             v 1..*
   *--------------------*
   |                    |
   |       Change       |
   *--------------------*

* 用語

 変更(Changes):

  ファイルセット中のあるファイルに対するひとつの変更。
  変更の種類としては、

   * ファイルの内容の変更
   * ファイルのメタデータの変更
   * ファイルセットツリー中の名前や位置の変更
   * ファイルの生成、削除

  があります。

 チェンジセット(Changeset):

  ファイルセット中のノードに対して行われる、独立した変更のあつまり。

 文脈(Context):

  変更と結びついた情報。それは共通の祖先となるファイルセットが不明な
  場合に、チェンジセットアプリケーションで衝突を示すために利用される
  かも知れません。

 スマートパッチ:

  (おそらく独立した)チェンジセットの階層的なグループのこと。

 ファイルセット:

  チェンジセットによって作成されたノードの階層的なツリーのこと。

 ノード:

  ファイルまたはディレクトリのこと。