class GitlabAwesomeRelease::Project

Constants

PER_PAGE

Public Class Methods

new(api_endpoint:, private_token:, project_name:, allow_tag_format:, merge_request_commit_format:, logger:) click to toggle source

@param api_endpoint [String] @param private_token [String] @param project_name [String] @param allow_tag_format [Regexp] @param merge_request_commit_format [Regexp]

# File lib/gitlab_awesome_release/project.rb, line 15
def initialize(api_endpoint:, private_token:, project_name:, allow_tag_format:, merge_request_commit_format:, logger:)
  Gitlab.configure do |config|
    config.endpoint      = api_endpoint
    config.private_token = private_token
  end
  @project_name = project_name
  @allow_tag_format = allow_tag_format
  @merge_request_commit_format = merge_request_commit_format
  @logger = logger
end

Public Instance Methods

add_merge_request_label(mr, label) click to toggle source
# File lib/gitlab_awesome_release/project.rb, line 130
def add_merge_request_label(mr, label)
  labels = mr.labels
  labels << label

  Gitlab.update_merge_request(@project_name, mr.iid, labels: labels.uniq.join(","))
  @logger.info "Add [#{label}] to !#{mr.iid} #{mr.title}"
end
all_tag_names() click to toggle source

all tag names order by author date @return [Array<String>]

# File lib/gitlab_awesome_release/project.rb, line 32
def all_tag_names
  return @all_tag_names if @all_tag_names

  @logger.info "fetch git tags"
  repo_tags =
    with_paging do |params|
      Gitlab.repo_tags(@project_name, params)
    end

  # avoid SEGV on ruby 2.6.0
  # https://bugs.ruby-lang.org/issues/15489
  @all_tag_names = repo_tags.sort_by {|tag| tag.commit.authored_date }.map {|tag| tag.name }
end
generate_change_log(oldest_tag, newest_tag) click to toggle source

@param oldest_tag [String] @param newest_tag [String] @return [String]

# File lib/gitlab_awesome_release/project.rb, line 54
    def generate_change_log(oldest_tag, newest_tag)
      release_notes = []
      release_notes << generate_heading(oldest_tag) if oldest_tag == release_tag_names.first
      release_tag_names.within(oldest_tag, newest_tag).each_cons(2) do |from, to|
        release_notes << generate_release_note(from, to)
      end
      release_notes << generate_release_note(newest_tag, "HEAD", title: "Unreleased") if newest_tag == release_tag_names.last

      changelog =
        release_notes.reverse.each_with_object("") do |release_note, str|
          str << release_note
          str << "\n"
        end

      changelog << <<-MARKDOWN
*This Change Log was automatically generated by [gitlab_awesome_release](https://gitlab.com/sue445/gitlab_awesome_release)*
      MARKDOWN

      changelog
    end
generate_heading(title) click to toggle source
# File lib/gitlab_awesome_release/project.rb, line 95
def generate_heading(title)
  "## #{title}\n"
end
generate_release_note(from, to, title: nil) click to toggle source

generate release note between from…to @param from [String] @param to [String] @param title [String] @return [String]

# File lib/gitlab_awesome_release/project.rb, line 80
    def generate_release_note(from, to, title: nil)
      @logger.info "generate release note (#{from}...#{to})"

      title ||= to
      summary = merge_requests_summary_between(from, to)

      header = generate_heading(title)
      header << <<-MARKDOWN
[full changelog](#{web_url}/compare/#{from}...#{to})

      MARKDOWN

      header + summary
    end
merge_request(iid) click to toggle source

find MergeRequest with iid

# File lib/gitlab_awesome_release/project.rb, line 126
def merge_request(iid)
  Gitlab.merge_request(@project_name, iid)
end
merge_request_iids_between(from, to) click to toggle source

find merge requests between from…to @param from [String] @param to [String] @return [Array<Integer>] MergeRequest iids

# File lib/gitlab_awesome_release/project.rb, line 103
def merge_request_iids_between(from, to)
  commits = Gitlab.repo_compare(@project_name, from, to).commits

  merge_request_iids =
    commits.map do |commit|
      commit["message"] =~ @merge_request_commit_format
      Regexp.last_match(1)
    end

  merge_request_iids.compact.map(&:to_i)
end
merge_request_summary(iid) click to toggle source

@param iid [Integer] MergeRequest iid @return [String] markdown text

# File lib/gitlab_awesome_release/project.rb, line 117
def merge_request_summary(iid)
  mr = merge_request(iid)
  return nil unless mr

  mr_url = "#{web_url}/merge_requests/#{iid}"
  "* #{mr.title} [!#{iid}](#{mr_url}) *@#{mr.author.username}*"
end
merge_requests_summary_between(from, to) click to toggle source
# File lib/gitlab_awesome_release/project.rb, line 138
def merge_requests_summary_between(from, to)
  mr_iids = merge_request_iids_between(from, to)
  mr_iids.each_with_object("") do |iid, str|
    begin
      str << merge_request_summary(iid) + "\n"
    rescue Gitlab::Error::NotFound
      # NOTE: suppress error (e.g. other repo's iid)
    end
  end
end
release_tag_names() click to toggle source

@return [Array<String>]

# File lib/gitlab_awesome_release/project.rb, line 47
def release_tag_names
  all_tag_names.find_all {|tag| tag =~ @allow_tag_format }
end
web_url() click to toggle source
# File lib/gitlab_awesome_release/project.rb, line 26
def web_url
  @web_url ||= Gitlab.project(@project_name).web_url
end

Private Instance Methods

with_paging() { |page: page, per_page: PER_PAGE| ... } click to toggle source

@yield [params] paging block @yieldparam params [Hash] paging params for GitLab API (page: current page, per_page) @yieldreturn response in all pages

# File lib/gitlab_awesome_release/project.rb, line 154
def with_paging
  all_response = []
  page = 1
  loop do
    response = yield(page: page, per_page: PER_PAGE)
    all_response += response
    return all_response if response.size < PER_PAGE
    page += 1
  end
end