Simulinkモデルのバージョン管理(4)
Simulinkモデルのバージョン管理(3)からの続きです。今回はテキストファイルのバージョン管理を行います。
分散型バージョン管理システムとして、MercurialベースのKiln(FogCreek社)を採用しました。

やることは、次の5つです。
- リポジトリを作る
- リポジトリにファイルを保存する
- コードレビューする
- バージョンを戻したり、差分を見たりする
- 複数の人が別々に行った変更を、統合する
前回は上2つをやりましたので、今回は続きの2つをやります。
コードレビューする
Kilnには、コードレビュー機能があります。残念ながらSimulinkモデルのレビューはできません。しかし、m-fileや、S-Functionのソースコードなど、テキストファイルであればレビュー対象とする事が出来ます。
レビューを行うには、次の2つの条件が必要です。
- リポジトリが存在すること
- リポジトリに対し、HG Commit が行われていること
(他のレビューシステムをご存じの方へ: オープンソースのレビューシステムは、コミット前のパッチに対してレビューを行うものがほとんどです。一方このKilnは、コミット後のChangesetに対してレビューを行います。)
レビュー開始
(中央サーバーに、任意のマシンのWebブラウザでアクセス)
Kilnでは、リポジトリに対して行われた Commit 単位でレビューを実行します。レビュー開始は、New Review ボタンをクリックするだけです。

_リポジトリのHistoryページにある、New Review ボタン_
_対象となるCommit、およびレビューアを指定_
この結果、1つの「レビュー」が生成されました。
_生成されたレビュー_
左半分には、レビューアが記入したコメントが表示されます。右半分には、どのファイルがどう変更されたのか?が表示されます。
レビューコメント記入
(中央サーバーに、任意のマシンのWebブラウザでアクセス)
Kilnのレビュー画面では、各ファイルの変更箇所が色分けされて表示されます。
レビューアは、特定の行についてのコメントを記述することができます。そのためには、コメント入れしたい行を選択状態にします。
_行を選択すると、コメント入力欄がポップする_
ここで現れたコメント入力欄に、なにかコメントを入れましょう。コメントを入れた結果、次のようになります。
_入力したコメントが反映された_
レビューを終了する
(中央サーバーに、任意のマシンのWebブラウザでアクセス)
レビューを行ったら、結局これは良かったのか?悪かったのか?結論をださないといけません。
_レビューの結果を選択する_
レビュー結果は、以下の3つから選べるようになっています。
- Approved オッケーです。
- Rejected ダメです。修正しましょう。
- Won’t Review レビューしません。他の人に頼んで。。。
結果を選択すると、レビュー画面は次のようになります。
_終了したレビューの画面_
StatusとしてはClosedになっていますが、閲覧はいつでも出来ます。もしもRejectされた場合には、これを見ながら悪い点を修正していきます。
バージョンを戻したり、差分を見たりする
以前はちゃんと動いていたのに、いろいろ触ってたら動かなくなった!
こういう場合には、バージョンを戻してみたり、差分を見てみたり、いろいろしたくなる事でしょう。
分散型バージョン管理システムでは、リポジトリは開発PCに丸ごとコピーされます。ですから、これらの作業はすべて開発PCのみで行えます。車載試験のために中央サーバーと切り離されていても大丈夫です。
特定のバージョンを取り出す
(開発PCのみを使用する)
今つかっているフォルダから別のフォルダへ、特定のバージョンを取り出すことができます。以前動いていたのに・・・?という場合、その動いていた頃のバージョンを取り出して実験してみると良いでしょう。
_別のフォルダへ特定バージョンを取り出す_
まずは、どんなバージョンがあるか確認するため、TortoiseHGのHg Repository Explorerを起動します。

_Mercurialでは、バージョンを Changeset と呼ぶ_
1回Commitする度にChangesetというのが出来ます。これにはIDがついていて、これを指定することで特定バージョンを取り出せます。
試しに、バージョン0を取り出す場合、TortoiseHGのclone画面で次のような指定をします。
_TortoiseHGのcloneコマンド_
Source path には、今まで使っていたフォルダを指定します。
Destination pathには、新しく取り出すフォルダを指定します。
Advanced optionsの Clone to revisionにチェックを入れ、ここに先ほどのChangesetのIDを入力します。上図のように 0 と入力しても構いませんし、長いIDである23f584c1e1a0を指定しても構いません。
この作業を行った結果、あらたなフォルダに特定のバージョンを取り出すことができました。
_バージョン0を取り出した_
特定のバージョンとの差分を見る
(開発PCのみを使用する)
さて、特定のバージョンを取り出して動いていることを確認しました。でも、今のバージョンでは動きません。じゃあ、何が違うというのでしょうか?
こういった場合には、特定のバージョンと、現在のバージョンの違いを確認しましょう。
_特定のバージョンとの違いを見る_
そのためには、TortoiseHGのHg Repository Explorerを使用します。比べたいバージョンを選択して右クリックし、Diff to local を選択します。
_Diff to localコマンド_
すると、変更のあったファイル名の一覧が表示されます。
ためしに、my_mfile.mをダブルクリックしてみましょう。
その結果、次のようなdiffが表示されます。

_特定のバージョンとの違いが見られる_
この画面で、何がどう違っているかを確認できます。
ちなみに、今回はテキストの比較のみをあつかっています。次々回はSimulinkモデル同士をグラフィカルに比較する方法をご紹介します。
特定のバージョンに名前を付ける(=タグ)
(開発PCのみを使用する)
こまごまとした変更を加えていくと、履歴がいっぱいになります。とあるバージョンを出荷したのであれば、ぜひそのバージョンは覚えておきたいところです。その場合、タグを打つことで解決出来ます。
そのためには、TortoiseHGのHg Repository Explorerを使用します。タグを打ちたいバージョンを選択して右クリックし、Add / Remove Tagをクリックします。
_Add / Remove Tagコマンド_
ここでタグを打った結果、バージョン履歴は次のようになります。
_特定のバージョンに、タグがついた_
ここで付けたタグは、TortoiseHg でcloneする時に指定することができます。
まとめ
今回は、Kiln上でレビューをしたり、以前のバージョンと比較を行ったりしました。
一人で開発しているのであれば、ここまでの作業で十分です。しかし、複数人で作業をしていると、これだけではすみません。次回は、複数人で開発している場合に特有の問題を解決します。