September 30, 2009

Grit についてざっくり調べてみた

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__)) ...

で、これを何に使おうかなぁ。

No Comments »

Leave a comment

※上の項目は入力してもしなくてもよいです。