class Gitlab::Release::Changelog::Generator

This class generates the changelog entries

Public Class Methods

new(options = {}) click to toggle source

@option [String] endpoint Optional. The API endpoint URL. Default: ENV and falls back to ENV @option [String] private_token Optional. User's private token or OAuth2 access token. Default: ENV @option [Integer] max_loops_merge_requests Optional. The limit of the loop to fetch merge requests. Default: 2000 @option [Integer] max_loop_issues Optional. The limit of the loop to fetch issues. Default: 2000

Calls superclass method Gitlab::Release::ApiClient::new
# File lib/gitlab/release/changelog/generator.rb, line 19
def initialize(options = {})
  @max_loops_merge_requests = options[:max_loops_merge_requests] || 2000
  @max_loop_issues = options[:max_loop_issues] || 2000
  super(options)
end

Public Instance Methods

changelog(version_name, options = {}) click to toggle source

Generate the changelog.

@param [String] version_name Required. The name of the version. (ex: 1.0) @option [String or Integer] project_id Optional. The id of this project, given from GitLab. Default ENV @option [Boolean] include_mrs Optional. Should the generator include merge requests? Default: true @option [Boolean] include_issues Optional. Should the generator include issues? Default false @option [Array] filtering_labels Optional. A general list of labels to filter items. Default: [] @option [Array] filtering_mrs_labels Optional. A specific list of labels to filter merge requests. Default: [] @option [Array] filtering_issues_labels Optional. A specific list of labels to filter issues. Default: [] @return [Entries]

# File lib/gitlab/release/changelog/generator.rb, line 37
def changelog(version_name, options = {})
  project_id = options[:project_id] || ENV["CI_PROJECT_ID"]
  include_mrs = options[:include_mrs] || true
  include_issues = options[:include_issues] || false
  filtering_mrs_labels = options[:filtering_mrs_labels] || options[:filtering_labels] || []
  filtering_issue_labels = options[:filtering_issues_labels] || options[:filtering_labels] || []

  entries = Entries.new
  if include_mrs
    changelog_from_merge_requests(entries,
                                  project_id,
                                  version_name,
                                  filtering_mrs_labels)
  end
  if include_issues
    changelog_from_issues(entries,
                          project_id,
                          version_name,
                          filtering_issue_labels)
  end
  entries
end

Private Instance Methods

changelog_from_issues(entries, project_id, version_name, filtering_labels) click to toggle source

@param [Entries] entries @param [String or Integer] project_id @param [String] version_name @param [Array] filtering_labels

# File lib/gitlab/release/changelog/generator.rb, line 95
        def changelog_from_issues(entries, project_id, version_name, filtering_labels)
  select_milestones(project_id, version_name).each do |milestone|
    i = 1
    all = false

    while i < @max_loop_issues and !all
      issues = @client.milestone_issues(project_id, milestone.id, {page: i})
      all = issues.empty?

      issues.each do |issue|
        if check_issue(issue, filtering_labels)
          entries.push(Issue.new(issue.id, issue.title))
        end
      end

      i += 1
    end
  end
end
changelog_from_merge_requests(entries, project_id, version_name, filtering_labels) click to toggle source

@param [Entries] entries @param [String or Integer] project_id @param [String] version_name @param [Array] filtering_labels

# File lib/gitlab/release/changelog/generator.rb, line 64
        def changelog_from_merge_requests(entries, project_id, version_name, filtering_labels)
  select_milestones(project_id, version_name).each do |milestone|
    i = 1
    all = false

    while i < @max_loops_merge_requests and !all
      merge_requests = @client.milestone_merge_requests(project_id, milestone.id, {page: i})
      all = merge_requests.empty?

      merge_requests.each do |mr|
        if check_mr(mr, filtering_labels)
          entries.push(MergeRequest.new(mr.iid, mr.title))
        end
      end

      i += 1
    end
  end
end
check_issue(issue, filtering_labels) click to toggle source

@param [Gitlab::ObjectifiedHash] issue @param [Array] filtering_labels @return [Boolean]

# File lib/gitlab/release/changelog/generator.rb, line 118
        def check_issue(issue, filtering_labels)
  issue.state == 'closed' and (filtering_labels - issue.labels).empty?
end
check_mr(mr, filtering_labels) click to toggle source

@param [Gitlab::ObjectifiedHash] mr @param [Array] filtering_labels @return [Boolean]

# File lib/gitlab/release/changelog/generator.rb, line 87
        def check_mr(mr, filtering_labels)
  mr.state == 'merged' and (filtering_labels - mr.labels).empty?
end