Grit についてざっくり調べてみました(README 読んだだけだけど。。)。
Grit とは
http://github.com/mojombo/grit
Grit gives you object oriented read/write access to Git repositories via Ruby.
The main goals are stability and performance.
Grit を使うと Ruby からオブジェクト指向的に git リポジトリにアクセスできます。
安定性とパフォーマンスに主眼を置いています。
とのこと。
インストール
gem install grit
もしくは、
gem sources -a http://gems.github.com/
gem install mojombo-grit
README を見ながら irb で実験してみました。
Repo
以下のようにして初期化します。
> require 'grit'
> include Grit
> repo = Repo.new("./termtter")
=> #<Grit::Repo "/foo/bar/termtter/.git">
簡単ですね。
Commit
コミットのリストを取得してみます。
> repo.commits
=> [#<Grit::Commit "bc790bb863dd65d8bfe93de0c0cfc898e636ba4f">, #<Grit::Commit "2eb01622ce42b70b6d3783c0b38f1fdd0abff518">, ...]
うん。非常に簡単。
特定のブランチのコミットのリストを取得したりも当然できます。
> repo.commits('completion')
=> [#<Grit::Commit "bfc91876f8f351c5117b2f9d35a8e474bc78bf1a">, #<Grit::Commit "4f3235dabfe3e2138fe20c5530a568265d205c59">, ...]
以下のようにすればブランチのリストを取得することができます。
> repo.branches
=> [#<Grit::Head "completion">, #<Grit::Head "master">, #<Grit::Head "rb-readline">]
Tree
git では、ディレクトリ階層は tree と呼ばれるオブジェクトとして格納されます。
ファイルのデータにアクセスするには tree をたどっていきます。
以下のようにして HEAD のコミットが参照している tree からディレクトリ階層をたどれます。
> head = repo.commits.first
=> #<Grit::Commit "bc790bb863dd65d8bfe93de0c0cfc898e636ba4f">
> head.tree
=> #<Grit::Tree "c9d38d24de850cd3a84d64fd4f37724b1df8c606">
> head.tree.contents
=> [#<Grit::Blob "185df518579384e0fad605a152af021c2067fc0d">, ... #<Grit::Tree "10c07f6b2b6d874905c0273c7d7c4268e110295f">]
任意のディレクトリに対応する tree オブジェクトを取得するための以下のような便利メソッドがあります。
> head.tree / 'lib'
=> #<Grit::Tree "dd19474c13801cc034b687f2bfcb754a065d8dc5">
こりゃ便利。
Blob
git では、ファイルは blob というオブジェクトとして格納されます。
以下のようにして tree から blob を取得することができます。
> blob = head.tree / 'lib/termtter.rb'
=> #<Grit::Blob "02586fb2150de14c0dff3db0324a0df16ee4d66f">
ファイルの情報を取得するには以下のようにします。
> blob.name
=> "termtter.rb"
> blob.data
=> "# -*- coding: utf-8 -*-\n\n$KCODE = \"u\" unless Object.const_defined? :Encoding\n\n$:.unshift(File.dirname(__FILE__)) ...
で、これを何に使おうかなぁ。
