Module: Gitlab::Triage::Linear::Migrator::IssueExtension

Defined in:
lib/gitlab/triage/linear/migrator/issue_extension.rb

Overview

Extending Gitlab::Triage::Resource::Issue with functions required for Linear migration.

Constant Summary collapse

LABEL_MIGRATION_FAILED =

@todo: make these configurable

'/label ~"Linear::Migration Failed"\n/remove_label ~"Linear::To Migrate"'
LABEL_MIGRATED =
'/label ~"Linear::Migrated"\n/remove_label ~"Linear::Migration Failed" ~"Linear::To Migrate"'
CLOSE_ACTON =
"/close"

Instance Method Summary collapse

Instance Method Details

#create_issue_in_linear(set_state: false, prepend_project_name: false, team_label_prefix: "Team") ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/gitlab/triage/linear/migrator/issue_extension.rb', line 71

def create_issue_in_linear(set_state: false, prepend_project_name: false, team_label_prefix: "Team")
  connector = setup_linear_connector
  connector.team_label_prefix = team_label_prefix
  project_name = if prepend_project_name
                   fetch_project_name
                 end.to_s

  begin
    log_processing_issue
    issue = connector.import_issue(self, set_state:, project_name:)
  rescue StandardError => e
    handle_error(e.message, project_name)
    return
  end

  return unless issue

  construct_output(issue)
end

#discussionsObject



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/gitlab/triage/linear/migrator/issue_extension.rb', line 11

def discussions
  # Epic discussions GET endpoint weirdly has id instead of iid as param.
  url = if self.class.name.demodulize.underscore.pluralize == "epics"
          build_url(
            options: {
              params: { system: false },
              resource_id: resource["id"],
              sub_resource_type: "discussions"
            }
          )
        else
          resource_url(sub_resource_type: "discussions")
        end
  network.query_api_cached(url)
end

#extract_issue_id(text) ⇒ Object



33
34
35
36
37
38
39
40
41
42
# File 'lib/gitlab/triage/linear/migrator/issue_extension.rb', line 33

def extract_issue_id(text)
  # Use a regular expression to match the issue ID pattern within the fixed text
  issue_id_pattern = /Linear issue ID: ([a-f0-9-]{36})/

  # Extract the issue ID using the pattern
  match = text.match(issue_id_pattern)

  # Return the issue ID if found, otherwise return nil
  match ? match[1] : nil
end

#find_linear_id_in_gitlabObject



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/gitlab/triage/linear/migrator/issue_extension.rb', line 44

def find_linear_id_in_gitlab
  return if resource[:epic].empty?

  url = build_url(params: {},
                  options: { source: "groups", resource_type: "epics", resource_id: resource[:epic][:id],
                             source_id: resource[:epic][:group_id], sub_resource_type: "notes" })
  comments = network.query_api_cached(url)
  comments.each do |comment|
    if (issue_id = process_comment(comment["body"]))
      puts "Parent epic found: #{issue_id}"
      return issue_id
    end
  end
  nil
end

#human_discussionsObject



27
28
29
30
31
# File 'lib/gitlab/triage/linear/migrator/issue_extension.rb', line 27

def human_discussions
  discussions.reject do |discussion_item|
    discussion_item["individual_note"] == true && discussion_item["notes"].first["system"] == true
  end
end

#process_comment(comment_body) ⇒ Object



60
61
62
63
64
# File 'lib/gitlab/triage/linear/migrator/issue_extension.rb', line 60

def process_comment(comment_body)
  return unless comment_body.start_with?("Issue created in Linear:")

  extract_issue_id(comment_body)
end