cvsを使って一番便利そうなのが、ローカルハックのパッチ当て作業の 労力軽減。ちょいとれんしうしてみよう。参考にしたのは、
ただし、以下の説明は間違ったり、「ふつーそんな風にはせんじゃろボケ」 な可能性が高い。ま、そんときはそんときだ。Webの恥は書き捨て。
たとえば、どっかで配っている foo というパッケージが便利で使っている。 ソースがついて来るので、自分でちょっと直して使っている。本家に取り込んで もらう類の修正ではない。fooはしばしばバージョンアップする。そのたびに、 パッチを整理して当てるのは結構手間が掛かる。
よし、じゃあ今日からcvsを使ってサードパーティソースの追っかけを しよう!
そんな場合の作業の始め方。cvsのリポジトリ格納場所としての CVSROOTはもう作ってあるものと仮定する。それ、ちょ簡単。 cvs覚え書きでも見ておくれ。そして、 そのCVSROOTを、環境変数CVSROOTに設定してあるものとする。
% export CVS_RSH=ssh % export CVSROOT my.cvs.server:/archive/cvsroot
てな具合ね。
foo-1.0 をもらう。いじる。しばらくしたら、foo-2.0 が出そう。という 状態だと、こんな作業になる。
foo-1.0.tar.gzを展開して、まるごとどっかん、リポジトリに入れよ う。ただ、その前に、man cvs して、import の所を読もう。
cvs import [-option] repository vendortag releasetag
とかある。ベンダタグと、リリースタグ。cvsの入門書、というか、自 分で自分のものを入れるときは、適当に決めちゃったけど、今回はちゃん と考えよう。あとで分かりやすいように、ベンダタグには、誰によるもの かってのが分かりやすい名前、リリースタグには、そのソフトのリリース 番号が分かりやすい名前をつけよう。てーことで、とあるソフトウェア fooを、"Foo Software Foundation" の人が作ってる、なんてーときは、 こんな風にして突っこもう。
% tar vzxpf foo-1.0.tar.gz % cd foo-1.0 % cvs import -ko -m 'FOO 1.0 Official Release Version' \ foo FOOsf foo-1-0
タグの名前にゃピリオドが使えないので、ハイフンとかに変えよう。
-ko
は、もともとあったRCSキーワードとかを、書き換えな
いようにするため。よっしゃ、これでimport完了。そしたら foo-1.0
消して桶。
自分がいじくる場合には、本流から枝分かれを作るってことになるの で、「ブランチタグ」をつける。自分用のhackだからブランチタグの名前 は、myhack-1 としよう。やり方は二通り。
ま、どちゃでもええがな。先にcoするなら
% cvs co foo # fooリポジトリをチェックアウト % cd foo % cvs tag -b myhack-1 # カレントディレクトリに対応するリポジトリに # myhack-1 ブランチタグがつく % cvs up -r myhack-1 # カレントディレクトリも myhack-1 にupdate
で、先にタグつけてからcoするなら、
% cvs rtag -b -r foo-1-0 myhack-1 foo # fooリポジトリの、foo-1-0 リリースタグのものに # myhack-1 ブランチタグをつける % cvs co -r myhack-1 foo # fooリポジトリの myhack-1 をチェックアウト % cd foo
いずれにしても、作業ディレクトリ(foo)のファイルに移動してから 中にあるファイルに myhack-1 タグがついているか確認する。
% cvs stat README
===================================================================
File: README Status: Up-to-date
Working revision: 1.1.1.1
Repository revision: 1.1.1.1 /cvsroot/foo/README,v
Sticky Tag: myhack-1 (branch: 1.1.1.1.2)
Sticky Date: (none)
Sticky Options: (none)
そしたら、自分なりにいじいじする。ソースファイルを足したら
% cvs add 足したファイル % cvs ci
などと忘れずに cvs add する。
がしがし cvs ci だ。Emacsからなら C-x v v しまくる。
出た!
またまたimport今度は、リリースタグを foo-2-0 にしてimportしよう。
% cvs import -ko -m 'FOO 2.0 Official Release Version' \
foo FOOsf foo-2-0
待ってました。これでパッチ当てが楽ちん!? 次のコマンドラインは、
「わしが、foo-1-0 から myhack-1 でやった作業を、foo-2-0 にまぜまぜ
するのだー」
という意味である。
% cvs co -j foo-1-0 -j myhack-1 -r foo-2-0 foo ちなみにリポジトリ foo しか指定してないとき 最新リリースが出てくるので % cvs co -j foo-1-0 -j myhack-1 -foo でも効果は同じ。ただし、-r foo-2-0 をつけるとそのタグがついた ソースツリーが出てくる点が違う。でもあとで自分用タグを うつので気にしなくてもええ。
そうすっっと、こんなんがでてくる。
cvs server: Updating foo
U foo/foo-1
RCS file: /cvsroot/foo/foo-1,v
retrieving revision 1.1.1.1
retrieving revision 1.1.1.1.2.1
Merging differences between 1.1.1.1 and 1.1.1.1.2.1 into foo-1
rcsmerge: warning: conflicts during merge
U foo/foo-2
U foo/localhack
Merging differences ...
ってところにちうもく。
これが、自分ぱっちと、本家修正をまぜまぜしたファイル。
ちゃんと全部目で見て確認。
今、まぜまぜしつつチェックアウトしたやつをそのままいじっちゃだ めよん。いじりたくなったら、ちゃんと、foo-1-0のときみたいに、「自 分用ブランチタグ」を打ってからね。さらに、打ったタグで作業ディレク トリを更新するのも忘れちゃだめね。
% cvs co -j foo-1-0 -j myhack-1 foo % cd foo % cvs tag -b myhack-2 # foo-2-0用の自分ブランチだ % cvs up -r myhack-2 # カレントディレクトリも myhack-2
いじる前には、cvs stat でタグ確認。
% cvs stat README
===================================================================
File: README Status: File had conflicts on merge
Working revision: 1.1.1.2
Repository revision: 1.1.1.2 /cvsroot/foo/README,v
Sticky Tag: myhack-2 (branch: 1.1.1.2.2)
Sticky Date: (none)
Sticky Options: (none)
いじる前には、タグ確認。1に確認タグ確認。何はなくとも タグ確認。
あとは、foo-3.0が出るのを待つのだ…(6)に戻る。
自分パッチの、「foo-X.Y.tar.gz
からの差分」とかを
ちょりっとまとめたいとき。そんなときは、もうわかるじゃろ、リリースタグと、
自分用ブランチタグの二つのバージョンのdiff取ればええ。ただ、
cvs diff だと、新規に足したファイルのdiffがどうしてもうまく取れない(謎)。
rdiffでやろう。
% cvs rdiff -u -r foo-2-0 -r myhack-2 foo
めでたしめでたし。ただ、ちゃんとconflict(パッチがうまく当たらなかった とこ)を解決してからじゃないとだめね。
いじょ。どっか間違ってたら、教えてけろ。っていっても大抵 おしえてくれない。ので、間違ってると思いたまへ。