PyCon APAC 2013 開催期間中に勢いで作成したMercurial関連のスライド

twitterでも流しましたが、勢いで作成したスライドです。PyCon APAC 2013 Sprintの成果ということで。 英語はリリースノートからのコピペとかです。

Mercurial Update 2012/08-2013/09 PyCon APAC 2013 Sprint

Short Introduction of Mercurial Evolve Extension

hg rebase が3-way mergeしてくれるという話

hg rebaseは3-way mergeします。 mercurialでhg graftは3-way mergeしてくれるのが売りだけど、hg rebaseはどうなんだっけ?という話がよく出るので。

以下、試したログ

% hg version | head -n1
Mercurial Distributed SCM (version 2.7.1)
% hg init rebase-3-way-merge-test
% cd rebase-3-way-merge-test
% cat <<END > README
heredoc> = README
heredoc>
heredoc> hogehoge
heredoc> END
% hg add README
% hg ci -m "add README"
% hg mv README README.md
% hg ci -m "rename"
% hg up 0
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
% cat <<END > LICENSE
heredoc> public domain
heredoc> END
% hg add LICENSE
% hg ci -m "add LICENSE"
created new head
% cat <<END > README
heredoc> = README
heredoc>
heredoc> foobar
heredoc> END
% hg ci -m "fix README"
% hg bookmark foo
% hg log -G --style compact
@  3[tip][foo]   e694dde31a4e   2013-09-27 11:37 +0900   trot
|    fix README
|
o  2:0   62de681e75d2   2013-09-27 11:36 +0900   trot
|    add LICENSE
|
| o  1   9268fbcaa618   2013-09-27 11:31 +0900   trot
|/     rename
|
o  0   43847b1e4bc1   2013-09-27 11:31 +0900   trot
     add README

% hg log -pr 3
changeset:   3:e694dde31a4e
user:        Takumi IINO <trot.thunder@gmail.com>
date:        Fri Sep 27 11:37:21 2013 +0900
summary:     fix README

diff --git a/README b/README
--- a/README
+++ b/README
@@ -1,3 +1,3 @@
 = README

-hogehoge
+foobar

% hg rebase --source 3 --dest 1 --keep
merging README.md and README to README.md
% hg log -G --style compact
@  4[tip][foo]:1   5bdfb661c56c   2013-09-27 11:37 +0900   trot
|    fix README
|
| o  3   e694dde31a4e   2013-09-27 11:37 +0900   trot
| |    fix README
| |
| o  2:0   62de681e75d2   2013-09-27 11:36 +0900   trot
| |    add LICENSE
| |
o |  1   9268fbcaa618   2013-09-27 11:31 +0900   trot
|/     rename
|
o  0   43847b1e4bc1   2013-09-27 11:31 +0900   trot
     add README
% hg log -pr 4
changeset:   4:5bdfb661c56c
bookmark:    foo
tag:         tip
parent:      1:9268fbcaa618
user:        Takumi IINO <trot.thunder@gmail.com>
date:        Fri Sep 27 11:37:21 2013 +0900
summary:     fix README

diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
 = README

-hogehoge
+foobar

%

mercurialでgit new-workdir

ローカルのリポジトリをコピーするための専用のコマンドはmercurialには無い。*1 単にcloneすればよい。

hg clone <repository> <new_workdir_path>

追記: git new-workdirは.git以下のファイル郡をsymlinkで共有しているので、元のリポジトリのコミットがnew_workdirでも参照できるが、hg cloneの場合は完全に別リポジトリということに注意。

速度

git new-workdirはsymlinkを使うことによってcpより早いよ、という話。 mercurialの場合、ローカルリポジトリのクローン時には(unix系OSでもwindowsでも)hard linkが利用されるため、cpより早い。

% hg version | head -n1
Mercurial Distributed SCM (version 2.7)

% time (hg clone rhodecode-enterprise rhodecode-enterprise-clone)
updating to branch default
1852 files updated, 0 files merged, 0 files removed, 0 files unresolved
( hg clone rhodecode-enterprise rhodecode-enterprise-clone; )  1.53s user 1.15s system 42% cpu 6.394 total
% time (cp -R rhodecode-enterprise rhodecode-enterprise-cp)
( cp -i -R rhodecode-enterprise rhodecode-enterprise-cp; )  0.13s user 2.46s system 16% cpu 15.331 total

この例では2.5倍くらいcloneの方が早い

ちなみに

hg clone だと作業領域が作られる(ファイルが展開される)ので、作りたくない場合は次のコマンドを利用しよう

% hg clone -U <src> <dest> # クローン時に作業領域を作らない
% hg update null # リポジトリの作業領域を消す

参考

*1:mercurialにbareリポジトリという概念無いので。

tmuxの設定ファイルを再読み込みする。もしくは複数のコマンドを実行するキーバインドを定義する。

tmux-1.8で確認しています。

ググったら、こういう設定たくさん出てくる。けど、この設定では(1.8では?)起動時に警告が表示される。

bind-key C-r source-file ~/.tmux.conf ; display-message "Reloaded."

正しくはこう。セミコロンをバックスラッシュでエスケープするのが正しいらしい。

bind-key C-r source-file ~/.tmux.conf \; display-message "Reloaded."

参考

TokyoMercurial#8 を開催しました。 #TokyoMercurial #mercurialjp

2013/06/23(日)にTokyoMercurial#8を開催しました。

やったこと

次回

次回は7,8月あたりの開催を考えています。

Mercurial-2.6でhgwebからイシュトラッカーにリンクを張る

前回のhgwebからイシュトラッカーにリンクを張るではInterhgExtensionを利用しました。が、InterhgExtensionはMercurial-2.6からobsoleteとなりました。

というのも、InterhgExtension相当の機能はwebsubテンプレートフィルターという形でhgwebに取り込まれたからです。

websubをつかう

公開しているリポジトリの.hg/hgrcに次の様な設定を追加します。

[websub]
# backlogの場合の例
backlog = s!(DORA-\d+)!<a href="https://demo.backlog.jp/view/\1">\1</a>!

InterhgExtensionから移行する場合はセクションの部分をinterhgからwebsubに変更するだけでOKのようです。

f:id:troter:20130504170434p:plain