2011年8月29日月曜日

MercurialのリポジトリをGitのリポジトリに変換

hg-fast-exportというものを使えばできるらしい。

ただ変換後にちょっとエラーが起こったので対処法も含めてメモっておく。

MercurialのリポジトリをGitのリポジトリに変換

https://hoge.com/hoge/というMercurialのリポジトリを変換する例

$ git clone git://repo.or.cz/fast-export.git
$ hg clone https://hoge.com/hoge/
$ cd hoge
$ git init
$ ../hg-fast-export.sh -r .

ただ変換すると一部のコミットの日付がおかしいことになっており、pushしようとすると以下のエラーが出た。

error: object 64db85a4528218edf2fc9a08a34ff9b5e8ee69c6:invalid author/committer line - bad date

エラーが出ているコミットを見ると以下のようになっていた。

commit 64db85a4528218edf2fc9a08a34ff9b5e8ee69c6
Author: Shinichi <>
Date:   Thu Jan 1 00:00:00 1970 +0000

first commit

以下のようなシェルスクリプトを実行して日付を修正する。

git filter-branch --env-filter \
'if [ $GIT_COMMIT = 64db85a4528218edf2fc9a08a34ff9b5e8ee69c6 ]
then
export GIT_AUTHOR_DATE="Sun May 23 18:09:52 2010 +0900"
export GIT_COMMITTER_DATE="Sun May 23 18:09:52 2010 +0900"
fi'

これで無事にGitリポジトリに変換できてgithubにpushもできましたとさ。

libclangを使ってみる。

clangとは、LLVMをバックエンドとして使用するC、C++、Objective-Cのコンパイラです。

GCCとは何が違うかというと、コンパイルするだけではなくてIDEのように定義元にジャンプとか補完といった機能が作り易いように設計されています。

実際XCode 4にはこのclangが使われているらしい。

これらの機能はclangバイナリを直接実行することで使用できるが、そのままだと遅いのでlibclangという専用のライブラリが用意されている。

今回はこのlibclangをちょっと触ってみる。

まずはclangを下のページ見ながらインストール

http://clang.llvm.org/get_started.html

無事インストールできたら早速使ってみたいが、とにかくドキュメントがない。どうやら唯一のサンプルはllvm/tools/clang/tools/c-index-test.cだけみたいだ。後はPythonバインディングが用意されているのでそのサンプルが少しあるけど、できればRubyから使いたい。とりあえずc-index-testを実行して定義元にジャンプの機能を使ってみる。

$ clang -lclang c-index-test.c
$ ./c-index-test -cursor-at=/Users/shinichi/programming/llvm/tools/clang/tools/c-index-test/c-index-test.c:1840:14 c-index-test.c

上の例はc-index-test.cの1840行14列にカーソルがある状態で定義元にジャンプの機能を実行しろという意味になる。結果は以下のようになった。

MemberRefExpr=argc:1825:7 SingleRefName=[1840:15 - 1840:19] RefName=[1840:15 - 1840:19]

ちゃんとthread_info構造体のargcメンバの位置が結果として表示されている。素晴らしい!!

せっかくだからlibclang使ってRedcar用のC/C++/Objectve-Cプラグイン作ろうかな~。