以前、Understand 5.1でご紹介した、「UnderstandをGit連携して、2つのリビジョンを比較する」という記事に対してお客様より、「Understand 6.0でも同じようにこの機能を使えませんか?」という声をいただきました。
今回は、Understand 6.0でのGit連携機能を使用して、Gitリポジトリの2つのリビジョンを指定することで、各リビジョンを自動的に解析し、比較する方法をご案内します。
本手順により任意のSHA番号を2つ指定いただくだけで、簡単にリビジョン間の解析差分を確認いただくことが可能となります。また、Understand 6.0対応版では、JavaやC#の言語に関しても解析を行えるようになっており、より多くのお客様に利用いただけるようになっています。
本記事では、C/C++言語のオープンソース[cgit]を使ってご紹介いたします。C#、Javaに関してのサンプルについては本ブログ後半[その他言語]にまとめて記載していますのであわせてご参照ください。
Git連携機能は、例えば以下のようなユースケースでご利用いただくことが考えられます。
ユースケース
- 開発者のユースケース
ローカルリポジトリからdevelopブランチにコミットする前に、開発者自身が差分を確認する。その後プルリクエストを出す際に、自身の確認結果や確認したいポイントなどの補足として、CompareグラフをGithubなどのホスティングサービス上のコメント欄に張り付けて、レビュアーに共有する。 - レビュアーのユースケース
プルリクエスト時にレビュアーが該当差分をUnderstandを使用して確認する。
コードレビューの証跡や指摘事項の記録として、Compareグラフにペイントアプリ等で確認箇所、指摘箇所に○印を付け、コメントに張り付けることで記録を残す。
今回は分析するサンプルコードとして、
「C⾔語のオープンソースコード︓cgit」のリポジトリを使⽤することにします。
目次
- 前提条件
- 事前準備
- 本記事で使用するbatファイル・iniファイル一式
- 準備1:batファイルの配置
- 準備2:ユーザーツールの設定
- 準備3:Gitリポジトリの準備
- 準備4:比較するSHA番号の確認
- 実施手順:SHA番号を2つ指定し、リビジョンの比較を行う。
- 結果の確認
- 発展的な使い方の例
前提条件
- 動作確認済環境
- Windows 10 64bit
- Understand 6.0 (Build 1076)
- 有効なUnderstandライセンス(APIライセンスは不要)
- Gitインストール済
- 環境変数[Path]に以下が追加済(git及びUnderstandのインストール先に合わせて変えてください。)
- C:\Program Files\SciTools\bin\pc-win64
- C:\Program Files\Git\cmd
- 言語:C/C++(Fuzzy)
- 解析コード:cgit(オープンソース)
- リポジトリ:https://git.zx2c4.com/cgit
事前準備
本記事で使用するbat・iniファイル一式
Git連携をおこなうためのファイル一式です。ダウンロードのうえ、任意の場所に解凍ください。
※2021年11月02日更新
batファイルの配置
- Git連携用のワークスペースを作成します。Compareディレクトリを作成し、Compareディレクトリ直下にreposディレクトリを作成します。
○パスの例- C:\work\Compare
- C:\work\Compare\repos
2.ダウンロードした以下のbatファイルを、Compareディレクトリ直下に配置します。
(例:C:\work\Compare\CompareGitSHA.bat)
・ShowLog.bat
・CompareGitSHA.bat
・SetGitRepo.bat
ユーザーツールの設定
- UnderstandのGUIを起動し、[メニューバー]-[ツール]-[オプション]-[ユーザーツール]を選択します。
- [ユーザーツール]の[インポート]ボタンを押し、ダウンロードしたscitools.iniファイルを指定します。
- [ユーザーツールのインポート]画面において、[すべて]ボタンを押し、すべてのチェックボックスが選択された状態にして[インポート]ボタンを押します。
- ユーザーツール内で、環境に合わせて設定を変更します。
[git\log]の設定
- [コマンド(C)]:[batファイルの配置]項で配置した[ShowLog.bat]ファイルへの絶対パスを指定します。
(例:C:\work\Compare\ShowLog.bat) - [初期ディレクトリ]:Compareディレクトリ直下の[repos]ディレクトリ
[git\setRepo]の設定
- [コマンド(C)]:[batファイルの配置]項で配置した[SetGitRepo.bat]ファイルへの絶対パスを指定します。指定します。
(例:C:\work\Compare\SetGitRepo.bat) - [初期ディレクトリ]:Compareディレクトリ直下の[repos]ディレクトリを指定します。
(例:C:\work\Compare\repos)
[git\undCompare]の設定
- [コマンド(C)]:[batファイルの配置]項で配置した[CompareGitSHA.bat]ファイルへの絶対パスを指定します。
(例:C:\work\Comoare\CompareGitSHA.bat) - [パラメーター(P)]:defaultValueの文字列をお好みに合わせて変更頂くことでパラメーターのデフォルト値を設定できます。
- [初期ディレクトリ]:Compareディレクトリ直下の[repos]ディレクトリを指定します。
(例:C:\work\Compare\repos) - [OK]ボタンを押します。
これでユーザーツールの設定は完了です。
ユーザーツールの設定は、Understand設定ファイル(C:\Users\User\AppData\Roaming\SciTools)に保存されます。必要に応じて、[ユーザーツールのエクスポート]より設定内容をバックアップしておくことをお勧めします。
Gitリポジトリの準備
- Understand(GUI)を起動した状態にします。※あとでプロジェクトのオープンエラーが発生することを防ぐため、プロジェクトは開かないでください。
- メニューバーから[ツール]-[ユーザーツール]-[git]-[setRepo]を選択します。
- repoURL欄にgitの対象repositoryのURLを入力し、OKボタンを押します。
例:https://git.zx2c4.com/cgit
この手順により[repos]ディレクトリ直下にプロジェクトのディレクトリ(今回の例では[cgit]ディレクトリ)が作成され、その配下に.gitディレクトリやソースコード等がcloneの結果として生成されます。
(注意)「batファイルの配置」項で作成する”repos”ディレクトリが未作成の場合には、
[git\setRepo]実行時にgit cloneに失敗します。[コマンドウィンドウ]に”Cloning into ‘cgit’ …”と出ているにも関わらず、cloneに失敗する場合には”repos”ディレクトリが存在するか、一度ご確認ください。
(参考)ここでは、単一のGitリポジトリ内のリビジョン比較を行う手順を説明しています。異なる複数のGitレポジトリを扱う場合には、本記事末尾の「発展的な使い方の例」をご確認ください。
比較するSHA番号の確認
- Understand(GUI)を起動した状態にします。
※あとでプロジェクトのオープンエラーが発生することを防ぐため、プロジェクトは開かないでください。
- メニューバーから[ツール]-[ユーザーツール]-[git]-[log]を押します。
- ここでは[gitリポジトリの準備]で準備したプロジェクトのディレクトリ([.git]ディレクトリの親ディレクトリ)を.git_ParentDir欄に入力し、OKボタンを押します。
※.gitディレクトリは隠しディレクトリです。
(例).git_ParentDirに入力する値C:\work\Compare\repos\cgit
(参考).gitディレクトリのパスC:\work\Compare\repos\cgit\.git
- Understand上の[コマンドウィンドウ]にgit logの履歴が表示されます。 比較したいリビジョン2つのSHA番号を確認します。
実施手順
- Understand(GUI)を起動した状態にします。※あとでプロジェクトのオープンエラーが発生することを防ぐため、プロジェクトは開かないでください。
- メニューバーから[ツール]-[ユーザーツール]-[git]-[undCompare]を押します。
- 表示された画面にて各値を指定し、OKボタンを押します。
- .git_ParentDir:プロジェクトのディレクトリ([比較するSHA番号の確認]を参照)
- SHA_A:比較元(通常は新ver)
- SHA_B:比較先(通常は旧ver)
GitのSHA番号は、通常、先頭数文字(7文字程度)を指定するだけで十分です。
今回の例では、以下のSHA番号を指定します。
・SHA_A(新Rev.):5e49023
・SHA_B(旧Rev.):c4d23d0
※SHA_Bを先にチェックアウト後、SHA_Aをチェックアウトとなります。SHA_Bの解析の際に、ローカルのリビジョン(HEAD)が変更される場合があるため、SHA_Aを指定する際はご注意ください。
※HEADやHEAD~等のエイリアスを使用することも可能です。
- 以下のような実行ログが出力され、新しいUnderstandの画面が立ち上がり、その画面でA.undが自動的に開けば成功です。
結果の確認
Compare系グラフ
自動的に新しいUnderstandのGUIが起動し、生成された比較元プロジェクト(A.und)が開かれました。 このとき、A.undには「比較先プロジェクト」が自動設定されています(後述「比較先プロジェクト」も参照)。エンティティフィルターなどで関数を選び、Compare Butterflyグラフを確認していただくと、差分が表示されていることが分かります。「Compare Object References」や「Changed Entities」に関しても同様に、表示することが可能になっています。
ソースコードの比較
ツールバーの[比較]-[ファイル/フォルダの比較]から表示されるダイアログにおいて、Compareディレクトリ配下に自動作成された[A]ディレクトリと[B]ディレクトリを指定の上[比較]ボタンを押すと、2つのリビジョンのコード差分を確認いただくことも可能です。
比較先プロジェクトの確認
比較先プロジェクトメニューバーから[プロジェクト]-[プロジェクトの設定]-[比較]の[比較プロジェクト]欄をご確認いただくと、比較先プロジェクトとしてB.undが自動的に指定されている(相対パスにて指定済)ことをご確認いただけます。
ぜひお試しください。 以降は発展的な使い方の例となります。
発展的な使い方の例
ここでは本設定をより便利に使用するための例(多くはカスタマイズが必要)をご紹介いたします。
C/C++のStrictモードやその他の言語[C/C++のStrictモード]
- C/C++のStrictモード
以前とあるお客様と本稿の内容についてお話しをしたところ、Understandの解析モードとしてStrictモードを指定してのGit連携が可能かと、ご質問を頂きました。 実現するにはやや難易度が高い内容になりますが、 本ブログに記載しているCompareGitSHA.batファイルに関し、A.und及びB.undの分析時にanalyzeを実施する前に以下のような設定を加えていただくことで、Strictモードでの解析が可能となります。
インクルードパス等の設定はテキストファイルに記載しインポートすることが可能です。gitの各プロジェクトにてこのテキストファイルを一緒に管理いただく形での実現になるかと考えられます。
- (例)und settings -C++UseStrict on fastgrep.und
コマンドライン処理に関する詳細は[Understand 5 ユーザーズ ガイド & リファレンス マニュアル]第13章をご参照ください。※Understand 6.0ユーザーズガイドは開発元で準備中です。
(参考)連携ツールや連携処理の例
- Lattix
- UnderstandAPIを使用したスクリプト(APIライセンスが必要です。)
- コンパイルスクリプトの呼び出し及びテストスクリプトの呼び出し
- 特定のURLに対しPOSTするbatを作成し、チケット発行または発行画面をブラウザで開く処理を実行
例:wget (Redmineの新しいチケットを発行する画面のURLパラメータ込みのURL) - URLをwgetするbatによるJenkinsジョブの実行
その他の言語
また、C/C++以外のいくつかの主要言語(C#やJAVAを含む)についても差分比較を表示することが可能となっています。Java、C#でのGit連携の設定例を以下に示しますのでお試しください。
言語:Java解析コード:realm-java(オープンソース)
リポジトリ:https://github.com/realm/realm-java
SHA番号の指定例:
SHA_A(新Rev.):a52967
SHA_B(旧Rev.):e8eb14
言語:C#解析コード:Streamworks.NET(オープンソース)
リポジトリ:https://github.com/rlabrecque/Steamworks.NET
SHA番号の指定例:
SHA_A(新Rev.):bf853a
SHA_B(旧Rev.):de3043
カスタム例:ユーザーツールに”パラメータ”にプロンプト引数を追加して、bat側で言語別に処理を分ける。
→ユーザーツールのプロンプト引数に以下を追記(本記事では以下を採用しています)
[$PromptForSelect "Language=C++Fuzzy;JAVA;C#"]
2つ目以降のリポジトリ
開発者によっては、複数のプロジェクトにアサインされ、複数のリポジトリを並行して同じマシン環境で取り扱うことが必要な場合があるかと思います。複数のリポジトリを管理した場合には以下のようなディレクトリ構成になります。また、[gitリポジトリの準備]を再度行うことで2つ目以降のリポジトリをgit cloneし、該当リポジトリ内の2つのSHA番号について同様に取り扱うことが可能です。
(undCompare実行時は.git_ParentDirで選択するリポジトリを変更してください。)
- [リポジトリの位置関係]
[Compare]-[repos]-[cgit]-[.git]
[Compare]-[repos]-[realm-java]-[.git]
[Compare]-[repos]-[Steamworks.NET]-[.git]
他ツールとの連携やAPI利用
本稿の手順によりUnderstandでの解析結果(und)をSHA番号の指定のみで自動的に得ることが可能となっております。CompareGitSHA.batに追記していただく、もしくは本稿を参考に新たにユーザーツールを作成いただくことで、コマンドライン経由で他ツールとの連携が可能となります。 すなわちSHA番号を指定するだけでUnderstand以外のツールとの連携をした使い方が可能となります。