cvsを使った local hack のれんしう

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 が出そう。という 状態だと、こんな作業になる。

  1. foo-1.0 をリポジトリに入れる(import)
  2. 自分でhackするために、ブランチタグをつける("cvs tag" or "cvs rtag")
  3. そーすをいじくる
  4. いじくったら checkin てなことを繰り返す………
  5. ………
  6. foo-2.0 が出るのをまつ
  7. Zzz...
  8. foo-2.0 をリポジトリに入れる(import)
  9. 差分をマージしながら checkout!(co -j...)
  10. ああらくちん(となるといいね ^^;)

じゃ やってみようか

  1. foo-1.0 をリポジトリに入れる(import)

    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 消して桶。

  2. ブランチタグをつける("cvs tag" or "cvs rtag")

    自分がいじくる場合には、本流から枝分かれを作るってことになるの で、「ブランチタグ」をつける。自分用の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)
    
  3. そーすをいじくる

    そしたら、自分なりにいじいじする。ソースファイルを足したら

    % cvs add 足したファイル
    % cvs ci
    

    などと忘れずに cvs add する。

  4. いじくったら checkin てなことを繰り返す………

    がしがし cvs ci だ。Emacsからなら C-x v v しまくる。

  5. foo-2.0 が出るのをまつ
  6. Zzz...

    出た!

  7. foo-2.0 をリポジトリに入れる(import)

    またまたimport今度は、リリースタグを foo-2-0 にしてimportしよう。

    % cvs import -ko -m 'FOO 2.0 Official Release Version' \
    	foo FOOsf foo-2-0
    
  8. 差分をマージしながら checkout!(co -j...)

    待ってました。これでパッチ当てが楽ちん!? 次のコマンドラインは、
    「わしが、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 ... ってところにちうもく。 これが、自分ぱっちと、本家修正をまぜまぜしたファイル。 ちゃんと全部目で見て確認。

  9. さらにタグ打ちを忘れるな!

    今、まぜまぜしつつチェックアウトしたやつをそのままいじっちゃだ めよん。いじりたくなったら、ちゃんと、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(パッチがうまく当たらなかった とこ)を解決してからじゃないとだめね。


いじょ。どっか間違ってたら、教えてけろ。っていっても大抵 おしえてくれない。ので、間違ってると思いたまへ。


Generated with mkdiary.rb
yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]