bouzuya.hatenablog.com

ぼうずやのにっき

git2 crate で tag を操作してみた

bouzuya/rust-sandbox の tags/0.2.0 をつくった。

git を実行していたのを crates:git2 を使って直接ファイルを読むことで高速化した。日付などの検索条件をつけようかと思っていたけど当面はこれで良さそうだ。

いまのところ↓のような形になっている。

  • tag の reference を得る
  • 参照先の object を得る
  • tag object なら更にその先を得る
  • commit object なら Ok, そうでなければ Err
  • commit の日付を得る
  • commit の日付の昇順に tag name を並べる

ひとつ詰まったのは tag の target がいつも commit object とは限らないこと。間に tag object が挟まっていることがある。どうもメッセージなどのデータをつけたときは tag object が挟まるらしい。

Twitter で聞いてみたら返信をもらった。

git のtagは内部的には2種類あり.git/refs/tags配下にあるオブジェクト名を格納したファイル(ref)とオブジェクトDBに格納されるタグオブジェクトです。 アノテーションタグを作るとタグオブジェクトが作られ ref のタグはそのタグオブジェクトを指す一方、普通のタグはコミットを直接指します

https://twitter.com/ktateish/status/1415478933760270338

refの方のタグが指す先は実はオブジェクトなら何でもよく、blob (普通のファイルコンテンツ)や tree を指すこともできます。メンテナのGPG pubkeyをtagでソースツリーとは独立して格納しているプロジェクトもごくごく稀に見かけることがあります。

https://twitter.com/ktateish/status/1415479302657765377


今日のコミット。