bin/rails app:update の diff を vim で見る方法

  • 9
    いいね
  • 0
    コメント

まとめ

vim じゃなくてもよい。以下では vimdiff を指定しているが、vimdiff 部分を好みの diff ツールに置き換えれば使える。

$ THOR_DIFF=vimdiff bin/rails app:update
# Rails 5 より前
$ THOR_DIFF=vimdiff rake rails:update

イントロ

Rails のバージョンアップ時に bin/rails app:update を実行して config 周りのファイルをアップデートしますが、対象ファイルがコンフリクトした場合に以下の画面が表示されます。

    conflict  config/routes.rb
Overwrite /sample_app/config/routes.rb? (enter "h" for help) [Ynaqdh]

この状態で d を押すと差分確認を行うことができますが、このとき diff ツールとしてdiff -uコマンドが起動されます。差分確認するだけであればこれで十分なのですが、個人的には確認と同時に編集もしたいです。調べたところ diff ツールを指定できるようなので、その方法を載せます。

環境変数THOR_DIFFを指定する

例えば以下のようにTHOR_DIFFを指定すると、diff ツールとして vimdiff を使うことができます。

$ THOR_DIFF=vimdiff bin/rails app:update

THOR_DIFF には別の diff ツールを使用することもできますので、好みのものを指定することができます。

これで bin/rails app:update 時に差分確認しつつ必要な箇所だけのマージもできるので作業効率が上がりました。

THOR_DIFFはどこから来た?

コンフリクト時にOverwrite /sample_app/config/routes.rb? (enter "h" for help) [Ynaqdh]と聞いてくるのは実は Thor の機能です。これは Rails のコマンドラインツールに Thor を使っているところがあるためです。

そのため Thor 側のコードを追います。diff ツールを指定している箇所はどうも ここ のようです。同一行に ENV["THOR_DIFF"] とあるので、環境変数 THOR_DIFF を指定すれば任意の diff ツールを起動できるということを意味しています。ということで THOR_DIFF は thor のコードから来ています。

RAILS_DIFF というのも見えますが、とりあえずここでは THOR_DIFF を使ってみました。ちなみにどちらもドキュメントには載っていないようなのですが何ででしょうね?

参考リンク

Thor
diff 起動箇所のコード