きりかノート 3冊め

おあそびプログラミング

svk patch まとめ

「svk patch って?」 の続き。cpanSVK::Command::PatchSVK::Command::SmergeSVK::Command::Push あたりを読んでるうちにようやく理解できた。

概要

svk patch は、以下の2種類のファイル群の差異をパッチとして管理することができる。差異をとる対象として、次の2種類がある。

前者のパッチの作成では svk smerge (または push) コマンドを利用し、後者では svk commit コマンドを利用する。

こうして svk リポジトリ内に作成したパッチは、パッチに関するメタデータを持っている。それにより、--regenerate や --update オプションを利用してパッチ内容の更新を行うことができることが最大の特徴。ただし、ローカル側が作業コピーのときは、--regenerate は実行できないことに注意。

実演

以下の環境で試した。

作業用の depot をつくる。

 % export SVKROOT=$HOME/tmp/.svk
% svk depotmap /svkpatch_test $SVKROOT

検証の作業環境を作成。

 % mkdir test
% gseq 10 > test/numbers
% svk import -m "initial import" test //local/test
% rm -rf test
% svk co //local/test test
Syncing //local/test(/local/test) in /Users/kimuraw/test to 2.
A test/numbers
% cd test
% cat numbers
1
2
3
4
5
6
7
8
9
10
%

テキストを変更して、パッチをつくる

 % vi numbers
% svk diff
=== numbers
==================================================================
--- numbers (revision 2)
+++ numbers (local)
@@ -1,5 +1,5 @@
1
-2
+two
3
4
5
% svk ci -m "2 -> tow(en)" -P num2en
Patch num2en created.
% svk stat
M numbers

パッチを commit コマンドで作成しても、パッチのみがリポジトリに作成され、変更はコミットされない。

パッチが作成されたことを確認。

 % svk patch --list
num2en@1:
% svk patch --cat num2en
==== Patch <num2en> level 1
Source: [No source]
Target: f920d2e2-3b84-41a3-8411-0dd0c30360b6:/local/test:2 [local]
Log:
2 -> tow(en)
=== numbers
==================================================================
--- numbers (revision 2)
+++ numbers (patch num2en level 1)
@@ -1,5 +1,5 @@
1
-2
+two
3
4
5
% ls $SVKROOT/patch
num2en.patch

作業コピーを編集して、パッチを再作成する。

 % vi numbers
% svk diff
=== numbers
==================================================================
--- numbers (revision 2)
+++ numbers (local)
@@ -1,7 +1,7 @@
1
-2
-3
-4
+two
+three
+four
5
6
7
% svk patch --regen num2en
Source of patch num2en not updated or not local, no need to regen patch.

むむ。ローカルがリポジトリじゃないと --regen はできないようだ。

リポジトリを変更して、パッチを更新する。

 % svk revert -R 
Reverted numbers
% vi numbers
% svk diff
=== numbers
==================================================================
--- numbers (revision 2)
+++ numbers (local)
@@ -1,3 +1,4 @@
+0
1
2
3
% svk ci -m "add zero"
Committed revision 3.
% svk patch --update num2en
G numbers
% svk patch --cat num2en
==== Patch <num2en> level 1
Source: [No source]
Target: f920d2e2-3b84-41a3-8411-0dd0c30360b6:/local/test:3 [local]
Log:
2 -> tow(en)
=== numbers
==================================================================
--- numbers (revision 3)
+++ numbers (patch num2en level 1)
@@ -1,6 +1,6 @@
0
1
-2
+two
3
4
5

パッチの内容も更新されている。作業コピーはここではリポジトリと差がないのだが、それは関係ない。内容的には、現在のupstreamリポジトリとパッチ作成時の作業コピーの差分がパッチとして更新されることになる。

ここで利用したコマンドのまとめ

  • svk commit -P : パッチを作成する
  • svk patch
    • --list : パッチの一覧を表示する
    • --cat (--view) : パッチの内容を表示する
    • --regenerate : ローカルの変更を作成済みのパッチに反映する
    • --update : リポジトリ(upstream) の変更を作成済みのパッチに反映する

じゃ残りのコマンド

 % svk patch --apply num2en
U numbers
% svk diff
=== numbers
==================================================================
--- numbers (revision 3)
+++ numbers (local)
@@ -1,6 +1,6 @@
0
1
-2
+two
3
4
5
% svk patch --rm num2en
% svk patch --list
%

パッチは $SVKROOT/patch に作成されるんだけど、これだとプロジェクト共通になってしまう。階層化できるか試してみよう。

 % svk ci -m "2 -> tow(en)" -P test/num2en
Illegal patch name: test/num2en.

うーむ。残念。

まとめというか感想

開発スタイルとして以下の2つのタイプがある。

  • svk commit -P: trunk を開発主体とし、作業コピーとのパッチをつくる
  • svk smerge -P: 修正ごとのブランチを作成し、trunk へのパッチをつくる

もちろん、両方を併用しても問題はない。大きな変更でブランチを作らないのは冒険でしかないわけだし。

簡単な修正のためにブランチをつくるのはわずらわしい、でもパッチはリポジトリに保存しておきたいっていうときに便利だと思う。

機能的にちょっと足らないかなあと思うところがなくもないけど、あとは実際の開発で使ってみての評価をするってことで。