File: find-jh-branch.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (114 lines) | stat: -rwxr-xr-x 2,735 bytes parent folder | download
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/usr/bin/env ruby
# frozen_string_literal: true

# We need to take some precautions when using the `gitlab` gem in this project.
#
# See https://docs.gitlab.com/ee/development/pipelines/internals.html#using-the-gitlab-ruby-gem-in-the-canonical-project.
#
# In spec/scripts/setup/find_jh_branch_spec.rb we completely stub it
if Object.const_defined?(:RSpec)
  # Ok, we're testing, we know we're going to stub `Gitlab`, so we just ignore
else
  require 'gitlab'

  if Gitlab.singleton_class.method_defined?(:com?)
    abort 'lib/gitlab.rb is loaded, and this means we can no longer load the client and we cannot proceed'
  end
end

require_relative '../api/default_options'

class FindJhBranch
  JH_DEFAULT_BRANCH = 'main-jh'
  JH_PROJECT_PATH = 'gitlab-org/gitlab-jh-mirrors/gitlab'
  BranchNotFound = Class.new(RuntimeError)

  def run
    return JH_DEFAULT_BRANCH unless merge_request?

    jh_merge_request_ref_name ||
      default_branch_merge_request_ref_name ||
      stable_branch_merge_request_ref_name ||
      default_branch_for_non_stable
  end

  private

  def merge_request?
    !!merge_request_id
  end

  def jh_merge_request_ref_name
    branch_exist?(JH_PROJECT_PATH, jh_ref_name) && jh_ref_name
  end

  def default_branch_merge_request_ref_name
    target_default_branch? && JH_DEFAULT_BRANCH
  end

  def stable_branch_merge_request_ref_name
    target_stable_branch? && begin
      jh_stable_branch_name = merge_request.target_branch.sub(/\-ee\z/, '-jh')

      branch_exist?(JH_PROJECT_PATH, jh_stable_branch_name) &&
        jh_stable_branch_name
    end
  end

  def default_branch_for_non_stable
    if target_stable_branch?
      raise(BranchNotFound, "Cannot find a suitable JH branch")
    else
      JH_DEFAULT_BRANCH
    end
  end

  def branch_exist?(project_path, branch_name)
    !!gitlab.branch(project_path, branch_name)
  rescue Gitlab::Error::NotFound
    false
  end

  def target_default_branch?
    merge_request.target_branch == default_branch
  end

  def target_stable_branch?
    merge_request.target_branch.match?(/\A(?:\d+\-)+\d+\-stable\-ee\z/)
  end

  def ref_name
    ENV['CI_COMMIT_REF_NAME']
  end

  def default_branch
    ENV['CI_DEFAULT_BRANCH']
  end

  def merge_request_project_id
    ENV['CI_MERGE_REQUEST_PROJECT_ID']
  end

  def merge_request_id
    ENV['CI_MERGE_REQUEST_IID']
  end

  def jh_ref_name
    "#{ref_name}-jh"
  end

  def merge_request
    @merge_request ||= gitlab.merge_request(merge_request_project_id, merge_request_id)
  end

  def gitlab
    @gitlab ||= Gitlab.client(
      endpoint: API::DEFAULT_OPTIONS[:endpoint],
      private_token: ENV['ADD_JH_FILES_TOKEN'] || ''
    )
  end
end

if $PROGRAM_NAME == __FILE__
  puts FindJhBranch.new.run
end