capistrano_colors

capistrano_colors とは

Capistrano の実行結果を見やすいように色付けします。
例えば、以下のようになります。

インストール

capistrano_colors は RubyGems を使ってインストールできます。

$ gem install capistrano_colors
  (環境によっては以下のコマンドになるでしょう)
  $ sudo gem install capistrano_colors
  $ gem1.8 install capistrano_colors
  $ gem187 install capistrano_colors

インストールしただけでは、capistrano_colors は有効になります。なりません。(2009/02/20追記)
有効にするには、 ~/.caprc に以下を追記します。

require "capistrano_colors"

私は以下のコマンドで

$ echo 'require "capistrano_colors"' > ~/.caprc
  (すでに ~/.caprc ファイルが存在する場合は以下。)
  $ echo 'require "capistrano_colors"' >> ~/.caprc

特定の Capistrano の設定のみ capistrano_colors を有効にしたい場合は、config/deploy.rb に以下を追記します。

require "capistrano_colors"

設定

設定により capistrano_colors による色付けを変更できます。
以下は、capistrano_colors の README.rdoc にあるサンプルの設定にコメントを追加したものです。

require "capistrano_colors"

capistrano_color_matchers = [
  # "command finished" を含む行を隠す。(文字色として :hide に設定する)
  { :match => /command finished/, :color => :hide, :prio => 10 },

  # "executing command" を含む行の、文字色を青色とし、下線を引く。
  { :match => /executing command/, :color => :blue, :prio => 10,
    :attribute => :underscore },

  # "transaction: commit" の行の文字色をマゼンタ色とし、点滅させる。
  { :match => /^transaction: commit$/, :color => :magenta, :prio => 10,
    :attribute => :blink },

  # "git" を含む行の文字色を白色とし、反転表示する。
  { :match => /git/, :color => :white, :prio => 20, :attribute => :reverse },
]

# 上記の設定を反映する。
colorize( capistrano_color_matchers )

capistrano_colors の裏側

では、capistrano_colors はどのようにして Capistrano の実行結果を色付けしているのか見ていきます。
in lib/capistrano_colors.rb

puts "\n\e[36m    == capistrano_colors loaded ==\e[0m\n\n"

require したときに == capistrano_colors loaded == が出力されるのは、なぜかなと思ったら、トップレベルで puts しているようです。つまり、必ず出力されます。

# DEBUG
Capistrano::Logger.add_color_matcher({ :match => /executing `.*/,             :color => :green,   :level => 2, :prio => -10, :prepend => "== Currently " })
Capistrano::Logger.add_color_matcher({ :match => /.*/,                        :color => :yellow,  :level => 2, :prio => -20 })

# INFO
Capistrano::Logger.add_color_matcher({ :match => /.*out\] (fatal:|ERROR:).*/, :color => :red,     :level => 1, :prio => -10 })
Capistrano::Logger.add_color_matcher({ :match => /Permission denied/,         :color => :red,     :level => 1, :prio => -20 })
Capistrano::Logger.add_color_matcher({ :match => /sh: .+: command not found/, :color => :magenta, :level => 1, :prio => -30 })

# IMPORTANT
Capistrano::Logger.add_color_matcher({ :match => /^err ::/,                   :color => :red,     :level => 0, :prio => -10 })
Capistrano::Logger.add_color_matcher({ :match => /.*/,                        :color => :blue,    :level => 0, :prio => -20 })

デフォルトの条件は次のようなもの。上記をサンプルと同様に記述すると以下のようになります。

capistrano_color_matchers = [
  # DEBUG
  { :match => /executing `.*/, :color => :green, :level => 2, :prio => -10, 
    :prepend => "== Currently " },
  { :match => /.*/, :color => :yellow, :level => 2, :prio => -20 }

  # INFO
  { :match => /.*out\] (fatal:|ERROR:).*/, :color => :red, :level => 1, 
    :prio => -10 },
  { :match => /Permission denied/, :color => :red, :level => 1, :prio => -20 },
  { :match => /sh: .+: command not found/, :color => :magenta, :level => 1, 
    :prio => -30 },

  # IMPORTANT
  { :match => /^err ::/,  :color => :red, :level => 0, :prio => -10 },
  { :match => /.*/, :color => :blue, :level => 0, :prio => -20 },
]

ほう、prepend を指定すると、ログの前に指定した文字列を追加できるようです。

in lib/capistrano/configuration.rb

module Capistrano
  class Configuration

このライブラリも既存のクラスを上書きするのね。colorize を DSL のように使いたいからだろうけど、別に CapistranoColors.colorize でもいいような。

in lib/capistrano/logger.rb

    alias_method :org_log, :log

    def log(level, message, line_prefix=nil) #:nodoc:

上書きした Capistrano::Logger.log メソッドがこのライブラリのコアですね。条件にマッチした行に、ANSI エスケープシーケンスを追加している。

    def self.add_color_matcher( options ) #:nodoc:
      @@color_matchers.push( options )
    end 

追加は push だけど、あら、条件の削除はできないようですね。:prio の高い条件を追加してくださいといことでしょうね。