Bazaarでcommit --amend

Bazaar Advent Calendar用に書きかけてて、結局出番のなかった「プラグインを作ってみる」というネタがあって、仕上げてアップしようかと思っていたら、ちょうど@hikaruworldさんのブログに同じテーマのエントリが掲載されました。

僕が書こうと思っていたこともほぼ網羅されているので、プラグインの作り方について特に書くことはなくなったんですが、せっかくなので説明用のサンプルとして作ったプラグインをさらしておきます。

プラグインの機能

recommitコマンドを追加します。Gitのcommit --amendのように、直前のコミットをやりなおすコマンドです。

Purpose: Edit last commit information.
Usage:   bzr recommit [LOCATION]

Options:
  -v, --verbose         Display more information.
  -q, --quiet           Only display errors and warnings.
  --usage               Show usage message and options.
  -x ARG, --exclude=ARG
                        files or directories excluded from the commit.
  -m ARG, --message=ARG
                        new commit message to be applied to the new commit
  -i ARG, --include=ARG
                        files or directories appended to the commit
  -h, --help            Show help message.

Description:
  This command allow you to add or remove files from last commit,
  or edit message of last commit.

From:     plugin "recommit"
See also: plugins/recommit

所詮サンプルなので、大したことをしてるわけではありません。
基本的には、uncommitとcommitを続けて呼んでいるだけです。

使い方

コミットメッセージの書き換え

"-m"を指定することで、コミットメッセージを書き換えることができます

$ bzr recommit -m "新しいメッセージ"
関係ないファイルを間違えて一緒にコミットしてしまった場合などは、"-x"でコミットからそのファイルを除外することができます
# testsフォルダ配下を除外する
$ bzr recommit -x tests
逆に、追加忘れがあった場合は、"-i"でコミットにファイルを追加することができます。
# lib/web_ui.pyを追加する
$ bzr recommit -i lib/web_ui.py
uncommit前に作業ツリーの変更内容をshelveするのは敢えてしていません。
なので、コミットしたファイルに少し修正を加えて、recommitで差し替えることもできます。
$ bzr commit foo.txt -m "first"
# foo.txtを修正
$ vim foo.txt
# 修正した内容で差し替え
$ bzr recommit

制限事項

  • "--fixes"を指定したコミットに対してrecommitを実行したときに、ちゃんとBugIDが残るかどうかはまだテストしていません。 テストしたらやっぱりダメだったので修正しました。
  • 途中でエラーが発生した場合は、手動で元に戻す必要があります。uncommitと同じように、コンソールに以下のようなメッセージが表示されるので、このコマンドを実行してください。

You can restore the old tip by running:
bzr pull . --overwrite -r revid:xxxxx

ソース

ソースはLaunchpadに上げてあります。
lp:~hid-iwata/+junk/bzr-recommit
(https://code.launchpad.net/~hid-iwata/+junk/bzr-recommit)