class GitHubWebHooksReceiver::App

Private Instance Methods

extract_domain(repository_uri) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 191
def extract_domain(repository_uri)
  case repository_uri
  when /\Agit@/
    repository_uri[/@(.+):/, 1]
  when /\Ahttps:\/\//
    URI.parse(repository_uri).hostname
  else
    nil
  end
end
extract_owner_name(repository_uri, payload) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 202
def extract_owner_name(repository_uri, payload)
  owner_name = nil
  if payload.gitlab?
    case repository_uri
    when /\Agit@/
      owner_name = repository_uri[%r!git@.+:(.+)/.+(?:.git)?!, 1]
    when /\Ahttps:\/\//
      owner_name = URI.parse(repository_uri).path.sub(/\A\//, "")
    else
      return
    end
  else
    owner = payload["repository.owner"]
    return if owner.nil?

    owner_name = owner["name"] || owner["login"]
    return if owner_name.nil?
  end
  owner_name
end
github_event(request) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 50
def github_event(request)
  request.env["HTTP_X_GITHUB_EVENT"]
end
gitlab_event(request) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 54
def gitlab_event(request)
  request.env["HTTP_X_GITLAB_EVENT"]
end
process_gitlab_wiki_parameters(request, response, payload) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 277
def process_gitlab_wiki_parameters(request, response, payload)
  before = "HEAD~"
  after = "HEAD"
  reference = "refs/heads/master"
  [before, after, reference]
end
process_gitlab_wiki_payload(request, response, payload) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 74
def process_gitlab_wiki_payload(request, response, payload)
  repository = process_gitlab_wiki_repository(request, response, payload)
  return if repository.nil?
  change = process_gitlab_wiki_parameters(request, response, payload)
  return if change.nil?
  repository.process(*change)
end
process_gitlab_wiki_repository(request, response, payload) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 133
def process_gitlab_wiki_repository(request, response, payload)
  wiki = payload["wiki"]
  if wiki.nil?
    set_response(response, :bad_request,
                 "Wiki information is missing")
    return
  end

  unless wiki.is_a?(Hash)
    set_response(response, :bad_request,
                 "invalid Wiki information format: " +
                 "<#{wiki.inspect}>")
    return
  end

  repository_uri = wiki["git_ssh_url"]
  domain = extract_domain(repository_uri)
  if domain.nil?
    set_response(response, :bad_request,
                 "invalid repository URI: <#{wiki.inspect}>")
    return
  end

  project = payload["project"]
  if wiki.nil?
    set_response(response, :bad_request,
                 "Project information is missing")
    return
  end

  repository_name = project["name"]
  if repository_name.nil?
    set_response(response, :bad_request,
                 "repository name is missing: <#{project.inspect}>")
    return
  end

  owner_name = extract_owner_name(repository_uri, payload)
  if owner_name.nil?
    set_response(response, :bad_request,
                 "repository owner or owner name is missing: " +
                 "<#{project.inspect}>")
    return
  end

  options = repository_options(domain, owner_name, repository_name)
  repository = repository_class.new(domain, owner_name, repository_name,
                                    payload, options)
  unless repository.enabled?
    set_response(response, :accepted,
                 "ignore disabled repository: " +
                 "<#{owner_name.inspect}>:<#{repository_name.inspect}>")
    return
  end

  repository
end
process_gollum_parameters(request, response, payload) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 248
def process_gollum_parameters(request, response, payload)
  pages = payload["pages"]
  if pages.nil?
    set_response(response, :bad_request,
                 "pages are missing")
    return
  end
  if pages.empty?
    set_response(response, :bad_request,
                 "no pages")
    return
  end

  revisions = pages.collect do |page|
    page["sha"]
  end

  if revisions.size == 1
    after = revisions.first
    before = "#{after}^"
  else
    before = revisions.first
    after = revisions.last
  end

  reference = "refs/heads/master"
  [before, after, reference]
end
process_gollum_payload(request, response, payload) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 66
def process_gollum_payload(request, response, payload)
  repository = process_payload_repository(request, response, payload)
  return if repository.nil?
  change = process_gollum_parameters(request, response, payload)
  return if change.nil?
  repository.process(*change)
end
process_payload(request, response, raw_payload) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 28
def process_payload(request, response, raw_payload)
  metadata = {
    "x-github-event" => github_event(request),
    "x-gitlab-event" => gitlab_event(request),
  }
  payload = Payload.new(raw_payload, metadata)
  case payload.event_name
  when "ping"
    # Do nothing
  when "push"
    process_push_payload(request, response, payload)
  when "gollum"
    process_gollum_payload(request, response, payload)
  when "wiki_page"
    process_gitlab_wiki_payload(request, response, payload)
  else
    set_response(response,
                 :bad_request,
                 "Unsupported event: <#{payload.event_name}>")
  end
end
process_payload_repository(request, response, payload) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 82
def process_payload_repository(request, response, payload)
  repository = payload["repository"]
  if repository.nil?
    set_response(response, :bad_request,
                 "repository information is missing")
    return
  end

  unless repository.is_a?(Hash)
    set_response(response, :bad_request,
                 "invalid repository information format: " +
                 "<#{repository.inspect}>")
    return
  end

  repository_uri = repository["url"]
  domain = extract_domain(repository_uri)
  if domain.nil?
    set_response(response, :bad_request,
                 "invalid repository URI: <#{repository.inspect}>")
    return
  end

  repository_name = repository["name"]
  if repository_name.nil?
    set_response(response, :bad_request,
                 "repository name is missing: <#{repository.inspect}>")
    return
  end

  owner_name = extract_owner_name(repository_uri, payload)
  if owner_name.nil?
    set_response(response, :bad_request,
                 "repository owner or owner name is missing: " +
                 "<#{repository.inspect}>")
    return
  end

  options = repository_options(domain, owner_name, repository_name)
  repository = repository_class.new(domain, owner_name, repository_name,
                                    payload, options)
  unless repository.enabled?
    set_response(response, :accepted,
                 "ignore disabled repository: " +
                 "<#{owner_name.inspect}>:<#{repository_name.inspect}>")
    return
  end

  repository
end
process_push_parameters(request, response, payload) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 223
def process_push_parameters(request, response, payload)
  before = payload["before"]
  if before.nil?
    set_response(response, :bad_request,
                 "before commit ID is missing")
    return
  end

  after = payload["after"]
  if after.nil?
    set_response(response, :bad_request,
                 "after commit ID is missing")
    return
  end

  reference = payload["ref"]
  if reference.nil?
    set_response(response, :bad_request,
                 "reference is missing")
    return
  end

  [before, after, reference]
end
process_push_payload(request, response, payload) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 58
def process_push_payload(request, response, payload)
  repository = process_payload_repository(request, response, payload)
  return if repository.nil?
  change = process_push_parameters(request, response, payload)
  return if change.nil?
  repository.process(*change)
end
repository_class() click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 299
def repository_class
  @options[:repository_class] || Repository
end
repository_options(domain, owner_name, repository_name) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 303
def repository_options(domain, owner_name, repository_name)
  domain_options = (@options[:domains] || {})[domain] || {}
  domain_options = symbolize_options(domain_options)
  domain_owner_options = (domain_options[:owners] || {})[owner_name] || {}
  domain_owner_options = symbolize_options(domain_owner_options)
  domain_repository_options = (domain_owner_options[:repositories] || {})[repository_name] || {}
  domain_repository_options = symbolize_options(domain_repository_options)

  owner_options = (@options[:owners] || {})[owner_name] || {}
  owner_options = symbolize_options(owner_options)
  _repository_options = (owner_options[:repositories] || {})[repository_name] || {}
  _repository_options = symbolize_options(_repository_options)

  options = @options.merge(owner_options)
  options = options.merge(owner_options)
  options = options.merge(_repository_options)

  options = options.merge(domain_options)
  options = options.merge(domain_owner_options)
  options = options.merge(domain_repository_options)
  options
end
set_response(response, status_keyword, message) click to toggle source
# File lib/github-web-hooks-receiver/app.rb, line 284
def set_response(response, status_keyword, message)
  if File.directory?("log")
    begin
      require "pp"
      File.open("log/response.log", "w") do |log|
        PP.pp([status_keyword, message], log)
      end
    rescue SystemCallError
    end
  end
  response.status = status(status_keyword)
  response["Content-Type"] = "text/plain"
  response.write(message)
end