PageRenderTime 30ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/danger/danger_core/environment_manager.rb

https://gitlab.com/JuanitoFatas/danger
Ruby | 122 lines | 92 code | 26 blank | 4 comment | 9 complexity | d732452e2b2aebb6e7df9705d725cdbd MD5 | raw file
  1. require "danger/ci_source/ci_source"
  2. require "danger/request_sources/request_source"
  3. module Danger
  4. class EnvironmentManager
  5. attr_accessor :ci_source, :request_source, :scm, :ui
  6. # Finds a Danger::CI class based on the ENV
  7. def self.local_ci_source(env)
  8. CI.available_ci_sources.find { |ci| ci.validates_as_ci? env }
  9. end
  10. # Uses the current Danger::CI subclass, and sees if it is a PR
  11. def self.pr?(env)
  12. local_ci_source(env).validates_as_pr?(env)
  13. end
  14. # @return [String] danger's default head branch
  15. def self.danger_head_branch
  16. "danger_head".freeze
  17. end
  18. # @return [String] danger's default base branch
  19. def self.danger_base_branch
  20. "danger_base".freeze
  21. end
  22. def initialize(env, ui = nil)
  23. ci_klass = self.class.local_ci_source(env)
  24. self.ci_source = ci_klass.new(env)
  25. self.ui = ui || Cork::Board.new(silent: false, verbose: false)
  26. RequestSources::RequestSource.available_request_sources.each do |klass|
  27. next unless self.ci_source.supports?(klass)
  28. request_source = klass.new(self.ci_source, env)
  29. next unless request_source.validates_as_ci?
  30. next unless request_source.validates_as_api_source?
  31. self.request_source = request_source
  32. end
  33. raise_error_for_no_request_source(env, ui) unless self.request_source
  34. self.scm = self.request_source.scm
  35. end
  36. def pr?
  37. self.ci_source != nil
  38. end
  39. def fill_environment_vars
  40. request_source.fetch_details
  41. end
  42. def ensure_danger_branches_are_setup
  43. clean_up
  44. self.request_source.setup_danger_branches
  45. end
  46. def clean_up
  47. [EnvironmentManager.danger_base_branch, EnvironmentManager.danger_head_branch].each do |branch|
  48. scm.exec("branch -D #{branch}") unless scm.exec("rev-parse --quiet --verify #{branch}").empty?
  49. end
  50. end
  51. def meta_info_for_head
  52. scm.exec("--no-pager log #{EnvironmentManager.danger_head_branch} -n1")
  53. end
  54. def meta_info_for_base
  55. scm.exec("--no-pager log #{EnvironmentManager.danger_base_branch} -n1")
  56. end
  57. def raise_error_for_no_request_source(env, ui)
  58. title, subtitle = extract_title_and_subtitle_from_source(ci_source.repo_url)
  59. subtitle += travis_note if env["TRAVIS_SECURE_ENV_VARS"] == "true"
  60. ui_display_no_request_source_error_message(ui, env, title, subtitle)
  61. exit(1)
  62. end
  63. private
  64. def get_repo_source(repo_url)
  65. if repo_url =~ /github/i
  66. RequestSources::GitHub
  67. elsif repo_url =~ /gitlab/i
  68. RequestSources::GitLab
  69. elsif repo_url =~ /bitbucket\.(org|com)/i
  70. RequestSources::BitbucketCloud
  71. end
  72. end
  73. def extract_title_and_subtitle_from_source(repo_url)
  74. source = get_repo_source(repo_url)
  75. if source
  76. title = "For your #{source.source_name} repo, you need to expose: " + source.env_vars.join(", ").yellow
  77. subtitle = "You may also need: #{source.optional_env_vars.join(', ')}" if source.optional_env_vars.any?
  78. else
  79. 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")}"
  80. end
  81. [title, (subtitle || "")]
  82. end
  83. def ui_display_no_request_source_error_message(ui, env, title, subtitle)
  84. ui.title "Could not set up API to Code Review site for Danger\n".freeze
  85. ui.puts title
  86. ui.puts subtitle
  87. ui.puts "\nFound these keys in your ENV: #{env.keys.join(', '.freeze)}."
  88. ui.puts "\nFailing the build, Danger cannot run without API access.".freeze
  89. ui.puts "You can see more information at http://danger.systems/guides/getting_started.html".freeze
  90. end
  91. def travis_note
  92. "\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." \
  93. "\nThis also means that people can see this token, so this account should have no write access to repos."
  94. end
  95. end
  96. end