Class: Ace::Git::Molecules::GithubIssueSync

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/git/molecules/github_issue_sync.rb

Overview

Synchronize ACE task linkage metadata to GitHub issues.

Defined Under Namespace

Classes: OwnershipConflict

Constant Summary collapse

STICKY_MARKER =
"<!-- ace-task:tracked -->"
TRACKED_LABEL =
"ace:tracked"
TERMINAL_STATUSES =
%w[done completed shipped closed cancelled skipped archived].freeze

Class Method Summary collapse

Class Method Details

.sync_task(task_id:, task_title:, task_status:, task_path:, issue_ids:, reason:, previous: nil, current_issue_ids: nil) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/ace/git/molecules/github_issue_sync.rb', line 17

def self.sync_task(task_id:, task_title:, task_status:, task_path:, issue_ids:, reason:, previous: nil,
  current_issue_ids: nil)
  current_ids = if current_issue_ids.nil?
    Array(issue_ids).map(&:to_i).uniq
  else
    Array(current_issue_ids).map(&:to_i).uniq
  end

  issue_ids.each do |issue_id|
    sync_issue(
      issue_id: issue_id.to_i,
      task_id: task_id,
      task_title: task_title,
      task_status: task_status,
      task_path: task_path,
      reason: reason,
      previous: previous,
      currently_linked: current_ids.include?(issue_id.to_i)
    )
  end

  {success: true, synced: issue_ids.length, issues: issue_ids}
end

.validate_link!(issue_id:, task_id:, previous_task_id: nil, lines: nil) ⇒ Object

Raises:



176
177
178
179
180
181
182
183
184
185
186
# File 'lib/ace/git/molecules/github_issue_sync.rb', line 176

def self.validate_link!(issue_id:, task_id:, previous_task_id: nil, lines: nil)
  issue = fetch_issue(issue_id)
  sticky = find_sticky_comment(issue["comments"] || [])
  lines ||= tracked_lines(sticky&.dig("body"))
  owners = lines.map { |line| extract_task_id(line) }.compact.uniq
  return true if owners.empty?
  return true if owners == [task_id.to_s]
  return true if previous_task_id && owners == [previous_task_id.to_s]

  raise OwnershipConflict, "GitHub issue ##{issue_id} is already owned by task #{owners.first}"
end