compare_linker_wraper (v1.0.2)のコードリーディングをしました。

使い方はこんな感じで使います。第一引数がGemfile.lockのファイルパス、baseが比較元のブランチ、formatterは出力のフォーマッタです。

exe/compare-linker-wrapperはCompareLinkerWrapper::CLI.startを呼び出します。

Thorで作られており、default_commandがcompareになっています。compareでは引数を調整しつつ、CompareLinkerWrapper::Linker#linkを呼びだして、戻り値をputsで標準出力に吐き出します。

CompareLinkerWrapper::Linker#linkは比較元と比較先のGemfile.lockをパースして比較します。Gemfile.lockはgitのgemを使って取得しています。

parseはBundler::LockfileParserのインスタンスを生成します。LockfileParserはその名の通りGemfile.lockをパースしてオブジェクト化したものです。

CompareLinker#compareではGemfile.lockのspecsのバージョンやリビジョンが異なっていれば、specの情報をupdated_gemsに格納します。

updated_gemsのループ内の処理は以下のようになっています。

ownerがnilの場合=gitではなくrubygemsなどから取得した場合はGithubLinkerFinerでホームページURIやソースコードURIからgithub.comにマッチするものを取得し、そこからリポジトリ名とオーナー名を取得します。

リポジトリ名が取得できたらさらにGithubTagFinderによって対象のバージョンのタグを取得します。

このようにしてgem_infoのハッシュをハンドリングしてCompareLinker::Formatter::XXX#formatで文字列にフォーマットします。Markdownの場合は以下の通りです。