1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
require "multi_json"
require "cgi"
require "flowdock"
require "flowdock/git/builder"
module Flowdock
class Git
class TokenError < StandardError; end
class << self
def post(ref, from, to, options = {})
Git.new(ref, from, to, options).post
end
def background_post(ref, from, to, options = {})
Git.new(ref, from, to, options).background_post
end
end
def initialize(ref, from, to, options = {})
@ref = ref
@from = from
@to = to
@options = options
@token = options[:token] || config["flowdock.token"] || raise(TokenError.new("Flowdock API token not found"))
@commit_url = options[:commit_url] || config["flowdock.commit-url-pattern"] || nil
@diff_url = options[:diff_url] || config["flowdock.diff-url-pattern"] || nil
@repo_url = options[:repo_url] || config["flowdock.repository-url"] || nil
@repo_name = options[:repo_name] || config["flowdock.repository-name"] || nil
@permanent_refs = options[:permanent_refs] ||
(config["flowdock.permanent-references"] || "refs/heads/master")
.split(",")
.map(&:strip)
.map {|exp| Regexp.new(exp) }
end
# Send git push notification to Flowdock
def post
messages.each do |message|
Flowdock::Client.new(flow_token: @token).post_to_thread(message)
end
end
# Create and post notification in background process. Avoid blocking the push notification.
def background_post
pid = Process.fork
if pid.nil?
Grit::Git.with_timeout(600) do
post
end
else
Process.detach(pid) # Parent
end
end
def repo
@repo ||= Grit::Repo.new(
@options[:repo] || Dir.pwd,
is_bare: @options[:is_bare] || false
)
end
private
def messages
Git::Builder.new(repo: @repo,
ref: @ref,
before: @from,
after: @to,
commit_url: @commit_url,
branch_url: @branch_url,
diff_url: @diff_url,
repo_url: @repo_url,
repo_name: @repo_name,
permanent_refs: @permanent_refs,
tags: tags
).to_hashes
end
# Flowdock tags attached to the push notification
def tags
if @options[:tags]
@options[:tags]
else
config["flowdock.tags"].to_s.split(",").map(&:strip)
end.map do |t|
CGI.escape(t)
end
end
def config
@config ||= Grit::Config.new(repo)
end
end
end
|