class Danger::EnvironmentManager

Attributes

ci_source[RW]
danger_id[RW]
request_source[RW]
scm[RW]
ui[RW]

Public Class Methods

danger_base_branch() click to toggle source

@return [String] danger’s default base branch

# File lib/danger/danger_core/environment_manager.rb, line 26
def self.danger_base_branch
  "danger_base".freeze
end
danger_head_branch() click to toggle source

@return [String] danger’s default head branch

# File lib/danger/danger_core/environment_manager.rb, line 21
def self.danger_head_branch
  "danger_head".freeze
end
local_ci_source(env) click to toggle source

Finds a Danger::CI class based on the ENV

# File lib/danger/danger_core/environment_manager.rb, line 9
def self.local_ci_source(env)
  return Danger::LocalOnlyGitRepo if LocalOnlyGitRepo.validates_as_ci? env

  CI.available_ci_sources.find { |ci| ci.validates_as_ci? env }
end
new(env, ui = nil, danger_id = "danger") click to toggle source
# File lib/danger/danger_core/environment_manager.rb, line 30
def initialize(env, ui = nil, danger_id = "danger")
  ci_klass = self.class.local_ci_source(env)
  self.ci_source = ci_klass.new(env)
  self.ui = ui || Cork::Board.new(silent: false, verbose: false)
  self.danger_id = danger_id

  RequestSources::RequestSource.available_request_sources.each do |klass|
    next unless self.ci_source.supports?(klass)

    request_source = klass.new(self.ci_source, env)
    next unless request_source.validates_as_ci?
    next unless request_source.validates_as_api_source?

    self.request_source = request_source
  end

  raise_error_for_no_request_source(env, self.ui) unless self.request_source
  self.scm = self.request_source.scm
end
pr?(env) click to toggle source

Uses the current Danger::CI subclass, and sees if it is a PR

# File lib/danger/danger_core/environment_manager.rb, line 16
def self.pr?(env)
  local_ci_source(env).validates_as_pr?(env)
end

Public Instance Methods

clean_up() click to toggle source
# File lib/danger/danger_core/environment_manager.rb, line 64
def clean_up
  [EnvironmentManager.danger_base_branch, EnvironmentManager.danger_head_branch].each do |branch|
    scm.exec("branch -D #{branch}") unless scm.exec("rev-parse --quiet --verify #{branch}").empty?
  end
end
ensure_danger_branches_are_setup() click to toggle source
# File lib/danger/danger_core/environment_manager.rb, line 58
def ensure_danger_branches_are_setup
  clean_up

  self.request_source.setup_danger_branches
end
fill_environment_vars() click to toggle source
# File lib/danger/danger_core/environment_manager.rb, line 54
def fill_environment_vars
  request_source.fetch_details
end
meta_info_for_base() click to toggle source
# File lib/danger/danger_core/environment_manager.rb, line 74
def meta_info_for_base
  scm.exec("--no-pager log #{EnvironmentManager.danger_base_branch} -n1")
end
meta_info_for_head() click to toggle source
# File lib/danger/danger_core/environment_manager.rb, line 70
def meta_info_for_head
  scm.exec("--no-pager log #{EnvironmentManager.danger_head_branch} -n1")
end
pr?() click to toggle source
# File lib/danger/danger_core/environment_manager.rb, line 50
def pr?
  self.ci_source != nil
end
raise_error_for_no_request_source(env, ui) click to toggle source
# File lib/danger/danger_core/environment_manager.rb, line 78
def raise_error_for_no_request_source(env, ui)
  title, subtitle = extract_title_and_subtitle_from_source(ci_source.repo_url)
  subtitle += travis_note if env["TRAVIS_SECURE_ENV_VARS"] == "true"

  ui_display_no_request_source_error_message(ui, env, title, subtitle)

  exit(1)
end

Private Instance Methods

extract_title_and_subtitle_from_source(repo_url) click to toggle source
# File lib/danger/danger_core/environment_manager.rb, line 101
def extract_title_and_subtitle_from_source(repo_url)
  source = get_repo_source(repo_url)

  if source
    title = "For your #{source.source_name} repo, you need to expose: " + source.env_vars.join(", ").yellow
    subtitle = "You may also need: #{source.optional_env_vars.join(', ')}" if source.optional_env_vars.any?
  else
    title = "For Danger to run on this project, you need to expose a set of following the ENV vars:\n#{RequestSources::RequestSource.available_source_names_and_envs.join("\n")}"
  end

  [title, subtitle || ""]
end
get_repo_source(repo_url) click to toggle source
# File lib/danger/danger_core/environment_manager.rb, line 89
def get_repo_source(repo_url)
  if repo_url =~ /github/i
    RequestSources::GitHub
  elsif repo_url =~ /gitlab/i
    RequestSources::GitLab
  elsif repo_url =~ /bitbucket\.(org|com)/i
    RequestSources::BitbucketCloud
  elsif repo_url =~ /\.visualstudio\.com/i || repo_url =~ /dev\.azure\.com/i
    RequestSources::VSTS
  end
end
travis_note() click to toggle source
# File lib/danger/danger_core/environment_manager.rb, line 123
def travis_note
  "\nTravis note: If you have an open source project, you should ensure 'Display value in build log' enabled for these flags, so that PRs from forks work." \
  "\nThis also means that people can see this token, so this account should have no write access to repos."
end
ui_display_no_request_source_error_message(ui, env, title, subtitle) click to toggle source
# File lib/danger/danger_core/environment_manager.rb, line 114
def ui_display_no_request_source_error_message(ui, env, title, subtitle)
  ui.title "Could not set up API to Code Review site for Danger\n".freeze
  ui.puts title
  ui.puts subtitle
  ui.puts "\nFound these keys in your ENV: #{env.keys.join(', '.freeze)}."
  ui.puts "\nFailing the build, Danger cannot run without API access.".freeze
  ui.puts "You can see more information at https://danger.systems/guides/getting_started.html".freeze
end