Source

my / doc / mercurial_queues_slideshow.rst

第一回 Mercurial 勉強会 2009/03/12

Mercurial Queues

株式会社アクセンス・テクロノジー

遠藤 隆尚

id:MiCHiLU

djmchl@gmail.com


Mercurial Queues


tinyurl.com/

mercurial-queues


http://bitbucket.org/ MiCHiLU/my/src/tip/doc/ mercurial_queues_slideshow.rst



アジェンダ

MQ って何?

MQのサブコマンド

チュートリアル

Bitbucket.org

MQ って何?

  • まーきゅりある きゅー
  • パッチ管理システム
  • Mercurialの拡張機能
  • バンドルされてる

MQ の機能

  • パッチを スタックとして 操作できる
  • パッチを リビジョン管理 できる

MQを設定する

.hgrc:

[extensions]
hgext.mq =

MQのサブコマンド群

$ hg help mq
...
qapplied qclone qcommit qdelete qdiff qfinish qfold qgoto qguard qheader qimport qinit qnew qnext qpop qprev qpush qrefresh qrename qrestore qsave qselect qseries qtop qunapplied strip

よく使うMQの サブコマンド


MQリポジトリを初期化する

$ hg qinit [-c]

-c  create queue
    repository

新しいパッチをスタックに追加する

$ hg qnew [-e] [-m TEXT]
  [-f] PATCH [FILE]...

-e  edit commit message
-m  use <text> as commit
    message
-f  import uncommitted
    changes into patch

編集中のパッチを更新する

$ hg qrefresh [-e]
  [-m TEXT] [FILE]...

-e  edit commit message
-m  use <text> as commit
    message

パッチのスタックに追加する

$ hg qpush [-a] [-f]

-a  apply all patches
-f  apply if the patch
    has rejects

パッチのスタックから取り除く

$ hg qpop [-a] [-f]

-a  pop all patches
-f  forget any local
    changes

パッチの一覧を表示する

$ hg qseries [-s]

-s  print first line of
    patch header

現在適用中のパッチの一覧を表示する

$ hg qapplied [-s]

-s  print first line of
    patch header

Mercurial Queues Tutorial


チュートリアルの流れ

  1. 新しいパッチリポジトリを 作る
  2. 新しいパッチを 作る
  3. 既にある変更から 新しいパッチを 作る
  4. 2つのパッチを統合して 1つのパッチを 作る
  5. パッチをリポジトリに コミットする

パッチスタックの状態遷移

  1. [<no-changes>]
  2. [<no-changes>, <patch A>]
  3. [<no-changes>, <patch A>, <patch B>]
  4. [<no-changes>, <patch A+B>]
  5. [<changeset A+B>]

リポジトリを初期化する

$ hg init     [1]_
$ hg qinit    [2]_
  • [1] Mercurial リポジトリの 初期化
  • [2] MQリポジトリの 初期化

MQパッチを作る#1

$ hg qnew patch-A     [3]_
$ echo patch-A >>foo
$ hg add foo
$ hg status
 A foo
$ hg qrefresh         [4]_
$ hg status -A
 C foo
  • [3] 新しいMQパッチを作成
  • [4] 現在の変更を カレントのパッチに反映

MQパッチを作る#1

$ hg qdiff            [5]_
 diff -r 000000000000 foo
 --- /dev/null
 +++ b/foo
 @@ -0,0 +1,1 @@
 +patch-A
$ hg id
 d0cdd6a9a3c3 qtip/qbase/tip/patch-A
  • [5] MQパッチの内容を見る

MQパッチを作る#2

$ echo patch-B >>foo
$ hg status
 M foo
$ hg qnew -f patch-B    [6]_
  • [6] 現在の変更から 新しいMQパッチを作成

MQパッチを作る#2

$ hg qapplied           [7]_
 patch-A
 patch-B
$ hg annotate foo
 0: patch-A
 1: patch-B
  • [7] 適用中のMQパッチを表示

MQパッチスタックを操作する

$ hg qpop -a      [8]_
 Patch queue now empty
$ hg log
$ hg status -A
  • [8] 適用中のMQパッチを すべて外す

MQパッチスタックを操作する

$ hg qpush        [9]_
 applying patch-A
 Now at: patch-A
$ hg status -A
 C foo
  • [9] MQパッチスタックに 一つ積む

MQパッチスタックを操作する

$ hg qunapplied   [10]_
 patch-B
$ hg qseries      [11]_
 patch-A
 patch-B
  • [10] 適用していない MQパッチを表示
  • [11] すべてのMQパッチを 表示

MQパッチをまとめる

$ hg qfold patch-B    [12]_
$ hg qapplied
 patch-A
$ hg qseries
 patch-A
  • [12] patch-Aにpatch-Bを 取り込む

MQパッチをまとめる

$ hg qdiff --git
 diff --git a/foo b/foo
 new file mode 100644
 --- /dev/null
 +++ b/foo
 @@ -0,0 +1,2 @@
 +patch-A
 +patch-B

MQパッチをコミットする

$ hg id
 f31016b63d13 qtip/qbase/tip/patch-A
$ hg qrefresh -m "some patches"
$ hg qfinish -a           [13]_
$ hg qseries
  • [13] 適用中のMQパッチを リポジトリにコミット

MQパッチをコミットする

$ hg id
 f31016b63d13 tip
$ hg log
 changeset:   0:f31016b63d13
 tag:         tip
 summary:     some patches

Mercurial Queues

use case


機能拡張の 作業途中に バグを 見つけて しまった。バグを 直さないと 機能拡張が 終わらないし、 中途半端な 状態で コミットすると 怒る人が 居るし、ロールバック するのが めんどくさいよ。。


$ hg qnew -f
$ hg qpop

てか、 いまの ガチガチの プロジェクトで 使ってるのは SVN なんだよね。 関係ないな 分散リポジトリ なんて。 実際、 役に立つ シチュエーション なんて 稀なんじゃ ないの?


MQ with SVN


Mercurial Queues and Bitbucket


bitbucket.org

slideshow/img/bitbucket.png

bitbucket.org

  • Mercurialのホスティング
  • 公開リポジトリ
  • プライベートリポジトリ
  • 共同作業

共同作業 - bitbucket.org

  • ACL:

    Readers, Writers, Administrators

  • pull request

  • fork:

    ブランチ

  • patch queue


patch queue - Bitbucket.org

使い方

  • パッチのレビュー
  • 実験的な機能を試用する
  • カスタマイズ用のパッチ

patch queue - Bitbucket.org

ダメな使い方

  • Long-running branches
  • Group development

patch queue - Bitbucket.org

slideshow/img/mercurial-ja-workshop.png

patch queue - Bitbucket.org

slideshow/img/mercurial-ja-workshop-hack.png

patch queue - Bitbucket.org

slideshow/img/mercurial-ja-workshop-patches.png

patch queue - Bitbucket.org

http://bitbucket.org/ help/PatchQueues


Mercurial Queues まとめ

  • MQはとっても簡単
  • ちょっとしたパッチ操作が すごく助かる
  • 他のSCMと組み合わせて 使える
  • Bitbucket.orgも 対応してるよ

ありがとう ございました


tinyurl.com/

mercurial-queues

http://bitbucket.org/ MiCHiLU/my/src/tip/doc/ mercurial_queues_slideshow.rst