半空洞男女関係

思ったこととかプログラミングしてるときのメモとか色々かいてます。メールはidそのままgmail

Gollumが編集されたらHook受けてSlackに通知する

config.rbに書く

結構雑だけど…あとで直します

require 'net/http'
require 'uri'
require 'json'

GOLLUM_HOST = "GOLLUMを置いているルートのURL"
SLACK_API_URL = "SlackのIncoming WebHooksのURL"

Gollum::Hook.register(:post_commit, :hook_id) do |committer, sha1|
  f = lambda { |h| h[h.keys.first].is_a?(Hash) ? "#{h.keys.first}/#{f.call(h[h.keys.first])}" : h.keys.first }
  path = f.call(committer.index.tree).gsub(/\.\w+$/, "")
  msg = "#{committer.options[:name]} edited <#{GOLLUM_HOST}/#{path}|#{path}>: #{committer.options[:message]}"

  uri = URI.parse(SLACK_API_URL)
  https = Net::HTTP.new(uri.host, uri.port)

  https.use_ssl = true
  req = Net::HTTP::Post.new(uri.request_uri)

  payload = {
      "text" => msg,
      "username" => "gollum",
  }.to_json
  req.body = payload
  https.request(req)
end

GollumのHookからWikiページのパスを取ってくるのが大変だった。どこかに入ってないものかと思ったんだけどうまく取れないっぽくて、結局index.treeを取ってきて自前でゴリゴリ作るしか無いっぽかった。 ComitterのObjectを見て、fileがcreate modeかedit modeかとかを見ればもっと詳細なものを通知できるのではないかと思う。