Class: Ace::Git::Molecules::GithubIssueSync
- Inherits:
-
Object
- Object
- Ace::Git::Molecules::GithubIssueSync
- 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
- .sync_task(task_id:, task_title:, task_status:, task_path:, issue_ids:, reason:, previous: nil, current_issue_ids: nil) ⇒ Object
- .validate_link!(issue_id:, task_id:, previous_task_id: nil, lines: nil) ⇒ Object
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
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 |