GNU arch

分散リポジトリを実現する revision control system の新鋭、GNU arch/tla のページ。

バージョン 1.2 が正式リリースされました。

バージョン 1.1 が正式リリースされました。

前書き

CVS を使い始めたころからの懸案だった分散リポジトリの問題を解消する revision control system の新鋭。いくつかある実装のうち、一番利用者が多い (と思われる) tla を使っています。

大いに気に入ったので、これまでの CVS リポジトリを移行して、Linux と Mac OS X で本格的に使い始めました。

CVS, Subversion を使ったことがあると、その経験が邪魔をするかもしれません。しかし、覚えやすさでは Gnu arch/tla に分があるというのが僕の感想です。そして、版管理だけではなく、diff や patch を賢くしたような道具が揃っているのも魅力的。

努力はしていますが、意図しない嘘偽りがまぎれている可能性があります。また、古いバージョンの記述が残っている可能性もあります。

メモ

アーカイブ名

  • globally unique でなければならないので、foo@bar.net--archive が慣例。
  • ある期間ごとに新しいアーカイブを作る慣習もある。2003 などの年号がそれ。

アーカイブの利用事例 (Archives use cases)

replay と update

suppose we have P=parent, US=our working copy, OTHER=some other change. "arch update" applies diff(P,US) to OTHER and writes the result into US. "arch replay" applies diff(P,OTHER) to US. as near as I can tell "star-merge" does a 3-way merge using the fact that US and OTHER share P as a parent.

手元の変更を優先するなら `tla replay'、しないなら `tla update'

最近またこの話題が ML で持ち上がったようで、そのまとめGnu Arch Wiki にできた。

set-tree-version 後の update と replay の違い

$ tla tree-version
foo@bar.net--2003/project--mainline--1.0
$ tla set-tree-version project--mainline--2.0
$ tla update
update: tree has no common history with version
    tree: /home/foo/work/project-main
    version: foo@bar.net--2003/project--mainline--2.0
$ tla replay
* patching for revision foo@bar.net--2003/project--mainline--2.0--base-0
A   {arch}/project/project--mainline/project--mainline--2.0/foo@bar.net--2003/patch-log/base-0

star-merge

よその project-tree (project--mainline--1.0) から自分の (project--ttm--1.0) へ patch を当てる

$ tla star-merge foo@bar.net--2003/project--mainline--1.0
$ tla make-log
$ tla log-for-merge >> ++log.project--ttm--1.0--ttm@hoge.jp--project
$ vi ./++log.project--ttm--1.0--ttm@hoge.jp--project
$ tla commit

この目的には update/replay も使えそうだが、lord@emf.net--2003b/tla--devo--1.1--patch-171 で --three-way オプションが使えるようになり、CVS などで見慣れた conflict marker が衝突時につけられるようになったので、積極的に star-merge を使う理由ができた(?)。

共通の祖先 (common ancestor) をもつ branch 間の star-merge

project--mainline--0.1 を共通の祖先に持つ branch-1 と branch-2 で、 branch-1 を branch-2 へ star-merge

$ pwd
/home/foo/work/project-b2
$ tla tree-version
foo@bar.net--2003/project--branch-2--0.1
$ tla star-merge -t --reference project--mainline--0.1 project--branch-1--0.1
star-merge: unable to merge unrelated trees.

と、--reference をつけて共通の祖先を指定しても失敗。

$ tla join-branch project--branch-1--0.1
* patching for revision foo@bar.net--2003/project--branch-1--0.1--base-0
A   {arch}/project/project--branch-1/project--branch-1--0.1/foo@bar.net--2003/patch-log/base-0

こうすると、branch-1 も同じ祖先を持つ branch だと認識するので、star-merge の準備ができたことになる。

$ tla star-merge -t project--branch-1--0.1
* star-merge by delta(foo@bar.net--2003/project--branch-1--0.1--base-0,foo@bar.net--2003/project--branch-1--0.1--patch-3)[/home/foo/work/project-b2]
* build reference tree for foo@bar.net--2003/project--branch-1--0.1--base-0
* from archive cached: foo@bar.net--2003/project--mainline--0.1--patch-38
* patching for revision: foo@bar.net--2003/project--branch-1--0.1--base-0
* applying changeset
[...]

上記『共通の祖先』は "most recent common ancestor" にはあたらないようである

以下 http://mail.gnu.org/archive/html/gnu-arch-users/2003-12/msg00295.html より抜粋

  • Common ancestor is a revision that is part of both targets.
  • Maximal common ancestor is a common ancestor, that is not part of any other ancestor.
  • Most recent common ancestor is the maximal common ancestor if and only if there is only one. If there is more than one, there is no most recent ancestor.
  • If you can find the common ancestor, pass it to star-merge as --reference and things will work.

バージョンの乗換

正しい用語がわからないが、要は 1.0 系列 (project--mainline--1.0) から、例えば 1.1 系列に移るということ。

$ tla set-tree-version foo@bar.net--2003/project--mainline--1.1
$ tla replay

tag (branch)

$ tla archive-setup foo@bar.net--test/test--branch--0.1
$ tla tag foo@bar.net--test/test--mainline--0.1 foo@bar.net--test/test--branch--0.1

seal, fix

move/rename

($ tla move oldfile newfile (or subdir/newfile))
$ tla mv oldfile newfile (or subdir/)
$ tla changes
=> .arch-ids/oldfile.id        .arch-ids/newfile.id
=> oldfile     newfile
$ tla make-log
$ tla commit --summary "rename test.txt to testnew.txt"
$ tla changelog

2003-09-24 05:36:27 GMT Arch User <foo@bar.net> patch-2

    Summary:
      rename test.txt to testnew.txt
    Revision:
      test--main--0.1--patch-2


    renamed files:
     .arch-ids/test.txt.id
       ==> .arch-ids/testnew.txt.id
     test.txt
       ==> testnew.txt

[...]

$ tla file-diff testnew.txt foo@bar.net--test/test--main--0.1--base-0
--- orig/test.txt
+++ mod/testnew.txt
@@ -1 +1 @@
-This is arch test.
+This was arch test.
$ tla file-diff testnew.txt foo@bar.net--test/test--main--0.1--patch-1
[no differences, no output]
  • 最近の版では tla move は不要
  • renamed files の項は modified files の場合同様、自動生成される
  • 名前が変わっても、ちゃんと変更をたどってくれる
  • 最後の diff は名前を変えただけなので、diff については出力なし

revision library

  • remote にある repo の src tree について、local かつ offline で diff を見たりするのに必要
  • 状況に応じて、--sparse を使うとよい
    • 後述の library-config で sparse に設定すると、いちいち指定しなくてよい
$ mkdir /path/to/revision_library
$ tla my-revision-library /path/to/revision_library
$ tla library-add <archive>/<category>--<branch>--<version>--<revision>

tla library-config

lord@emf.net--2003b/tla--devo--1.1--patch-255 で使えるようになった。

  • search path と add path を用いる
    • add path は lib に rev を add するときに優先的に使用
    • add path を設定していないと、自動で追加されない?
  • 追加時、tla library-config で greedy/sparse によって違う動作
    • 当面、greedy and sparse を選択
    • 必要なときには追加されるが、必ずしも各 rev を追加しない?
  • まず tla library-add <rev> しておかないと、以上は無効

Cached revs, Libraries, Pristine trees

http://mail.gnu.org/archive/html/gnu-arch-users/2003-08/msg00056.html

mirror

offline で get ができる。diff などには役立たない。

remote to local

$ tla make-archive --mirror foo@bar.net--2003 foo@baz.net--2003-bar /home/foo/gnuarch/bar
$ tla archive-mirror foo@baz.net--2003-bar

開発の途中で ChangeLog を自動化

  1. 古い ChangeLog の id を削除、現ツリーの changelog を生成、id を付与
       $ tla delete ChangeLog
       $ tla changelog > ChangeLog
       $ tla add ChangeLog
    
  2. 結果として、古い方は tla が見失ってしまうので delete されるが、同時に新しいファイルとして add される。rename にはならない。
  3. commit すれば、今後は自動化される。

この自動化された ChangeLog は tag を打って branch を作っても、それに追従しない。その branch で tagline と id は要修正。

最新の commit 済の版に戻す

$ cp -a `tla file-find foo` ./foo

ML でよく質問が出るにもかかわらず、なぜか未だにこれを簡単に行うコマンドは実装されていない。

誤 commit 後、アーカイブを直接編集して元に戻す (archive surgery)

  1. tla undo <rev to which you want to get back>
  2. mv <repo>/patch-7/++revision-lock <repo>/patch-6
  3. 本来行いたかった修正を tree で行う
  4. tla commit
  • 重大な副作用が現れる可能性があるので、注意して自己責任で行うこと
  • pristine tree に古いものが残ることがあるので、手で消す

.arch-inventory の使い方

lord@emf.net--2003b/tla--devo--1.1--patch-217 で使えるようになった

これ以前の revision の tla で import したアーカイブでは、{arch}/=tagging-method に .arch-inventory を追加する必要がある。

exclude ^(.arch-ids|\{arch\}|\.arch-inventory)$

今いるツリーとそのツリーの別の revision との間の patch を作る

今いるツリーの revision を patch-8、別のツリーを patch-5 として、foo.txt のパッチを ++patch に作る。

$ tla get project--main--1.0--patch-5 ++tmp
$ tla mkpatch ++tmp . ++patch foo.txt
  • foo.txt を指定しなければ、ツリー全体のパッチを作成する。
  • ++tmp, ++patch のように ++ を名前につけたのは、tla がデフォルトでこれらを precious カテゴリとみなすからである。precious は勝手に消されることはない一方、commit 時には無視される (アーカイブされない)。

cscvs

http://mail.gnu.org/archive/html/gnu-arch-users/2003-09/msg00864.html

  1. category, branch, version を作る。
       $ tla archive-setup category--branch--version
    
  2. arch の project tree となるディレクトリを作り、
       $ mkdir test_arch; cd test_arch
    

    空のまま、

       $ tla init-tree category--branch--version
    

    を実行。{arch} ディレクトリができる。

  3. CVS 管理下にあるディレクトリ test_cvs で、
       $ cscvs cache -b
    
  4. 必要なら cscvs log -P<BRANCH> で log を見てみる。
  5. $ cscvs totla -i <BRANCH>.1 /path/to/test_arch
    • -d オプションはエラーになってしまう。
    • -S を使うと、元の log によっては見映えが悪い。
  6. $ cscvs totla -c <BRANCH>.1:: /path/to/test_arch
  7. cache のアップデートは -u オプション。

zsh 補完

アーカイブ
bclg@iup.edu--2003 http://complex.dyndns.org:8000/~jason/bclg@iup.edu--2003

Some "How Do I" questions

http://mail.gnu.org/archive/html/gnu-arch-users/2003-08/msg00131.html

an IRC introduction to arch

http://mail.gnu.org/archive/html/gnu-arch-users/2003-09/msg00034.html

arch-tag には uuidgen を用いる手もある

インストール

Arch はいくつかの project tree の集合体であるメタプロジェクトなので、dists を get したのち、build-config でその他の必要なソースを取ってくる。

ファイル =RELEASE-ID を更新するには、tla build-config 時に --release-id/-r オプションをつけて実行。しかし、build-config は project tree を再取得するので非効率的のような...。ソースの更新は tla replay/update で行って、=RELEASE-ID の更新だけを別に行う方法はないのだろうか。

Mac OS X

ソースを取ってきて、以下のようにした。gcc3 を使用。シェルによっては = の前に \ をつけて、エスケープする必要があるかも。zsh ではそう。

$ tla get lord@emf.net--2003b/dists--devo tla
$ cd tla
$ mkdir =build; cd =build
$ ../src/configure --prefix=/opt/local
$ env CFLAGS=-no-cpp-precomp make
$ env CFLAGS=-no-cpp-precomp make test
$ sudo make install

Debian

当初は unstable パッケージを woody 上で dpkg-buildpackage して使っていたが、今は upstream の更新を追いかけてパッケージを作っている。

$ tla get lord@emf.net--2003b/dists--devo tla
$ cd tla
$ tla build-config --release-id emf.net/devo.tla
$ cd ..
$ tar cfz tla-1.X.tgz tla
$ cd tla-OLD_VERSION
$ uupdate ../tla-1.X.tgz tla-1.X.archYYYYMMDD-0.1local
$ cd ../tla-1.X.archYYYYMMDD-0.1local
($ cp -a ../tla-1.X/=RELEASE-ID .)
$ dpkg-buildpackage -rfakeroot -us -uc

メタプロジェクトの更新

build-config を使う他に、次のような手もある。ただし、上述のように =RELEASE-ID を更新できない。

tlaup () {
        tla update
        for category in `tla cat-config emf.net/devo.tla | awk '{print $1}'` ; do
                tla update --dir ${category} ;
        done
}

古いメモ (バージョン < 1.1)

Firewall 越え

sftp を使うのだが、例えばこのようにポートを自由に指定することはできず、22 番だけが使える。一方、ポート 22 をポート 22 に転送するのは root でないとだめ。

そこで、libarch/pfs-sftp.c の arch_pfs_sftp_connect をいじって、環境変数でポートを指定できるようにした。これでポート転送で壁を越え、リモートマシンのリポジトリとやり取りができる。

C に自信があれば、arch の特徴を活かして公開するところだけど、それはやめておく。コード見れば、見よう見真似で誰でもできるし。

2003-10-11(Sat) 追記

開発版 (lord@emf.net--2003b/tla--devo--1.1--patch-193) では URI 中でのポート指定ができるようになった。

リンク

公式・準公式ページ

ユーザのページ

このページについて

リンク元

architect ttm on the web

うつろい

Last modified: 2004-10-03 17:27:18

175c175
< $ tla file-diffs testnew.txt foo@bar.net--test/test--main--0.1--base-0
---
> $ tla file-diff testnew.txt foo@bar.net--test/test--main--0.1--base-0
181c181
< $ tla file-diffs testnew.txt foo@bar.net--test/test--main--0.1--patch-1
---
> $ tla file-diff testnew.txt foo@bar.net--test/test--main--0.1--patch-1
415,416c415,416
< - [http://gnuarch.org/ Arch Revision Control System] (User community Wiki)
<   ユーザによって運営されている(いた) Wiki。上に引越し中。
---
> - [http://gnuarch.org/ Tom Lord's Software]
>   tla の開発者、Tom Lord のサイト。
430c430
< - [http://repose.cx/ArchPrimer.html A brief introduction to Arch - Using arch on a single-developer project]
---
> - [http://park8.wakwak.com/~a-tanglement/arch/ArchPrimer.ja.html Arch を簡潔に紹介する - 独りのプロジェクトで arch を使う]
431a432,433
> - [http://repose.cx/ArchPrimer.html A brief introduction to Arch - Using arch on a single-developer project]
>   上の英語版原本。
433c435
<   ここと違い、よくまとまったメモ。
---
>   拙著ページと違い、よくまとまったメモ。

さがしもの

Google search: