Module: Carson::Runtime::Review
- Includes:
- DataAccess, GateSupport, QueryText, SweepSupport, Utility
- Included in:
- Carson::Runtime
- Defined in:
- lib/carson/runtime/review.rb,
lib/carson/runtime/review/utility.rb,
lib/carson/runtime/review/query_text.rb,
lib/carson/runtime/review/data_access.rb,
lib/carson/runtime/review/gate_support.rb,
lib/carson/runtime/review/sweep_support.rb
Overview
PR review gate and sweep workflow.
Defined Under Namespace
Modules: DataAccess, GateSupport, QueryText, SweepSupport, Utility
Instance Method Summary collapse
- #review_gate! ⇒ Object
-
#review_sweep! ⇒ Object
Scheduled sweep for late actionable review activity across recent pull requests.
Instance Method Details
#review_gate! ⇒ Object
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/carson/runtime/review.rb', line 18 def review_gate! fingerprint_status = block_if_outsider_fingerprints! return fingerprint_status unless fingerprint_status.nil? puts_verbose "" puts_verbose "[Review Gate]" unless verbose? puts_line "Review Gate" end unless gh_available? puts_line "gh CLI not found in PATH — install it to use review commands." return EXIT_ERROR end owner, repo = repository_coordinates branch = current_branch pr_number_override = carson_pr_number_override pr_summary = if pr_number_override.nil? current_pull_request_for_branch( branch_name: branch ) else details = pull_request_details( owner: owner, repo: repo, pr_number: pr_number_override ) { number: details.fetch( :number ), title: details.fetch( :title ), url: details.fetch( :url ), state: details.fetch( :state ) } end if pr_summary.nil? puts_line "No pull request found for branch #{branch}." report = review_gate_report_for_missing_pr( branch_name: branch ) write_review_gate_report( report: report ) return EXIT_BLOCK end report = review_gate_report_for_pr( owner: owner, repo: repo, pr_number: pr_summary.fetch( :number ), branch_name: branch, pr_summary: pr_summary ) write_review_gate_report( report: report ) unless verbose? poll_attempts = report.fetch( :poll_attempts, 0 ) puts_line "Polling... (converged after #{poll_attempts} attempt#{plural_suffix( count: poll_attempts )})" end block_reasons = report.fetch( :block_reasons ) if block_reasons.empty? puts_line "OK: review gate passed." return EXIT_OK end block_reasons.each { |reason| puts_line reason } EXIT_BLOCK rescue JSON::ParserError => exception puts_line "Unexpected response from gh (#{exception.})." EXIT_ERROR rescue StandardError => exception puts_line exception. EXIT_ERROR end |
#review_sweep! ⇒ Object
Scheduled sweep for late actionable review activity across recent pull requests.
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/carson/runtime/review.rb', line 81 def review_sweep! fingerprint_status = block_if_outsider_fingerprints! return fingerprint_status unless fingerprint_status.nil? puts_verbose "" puts_verbose "[Review Sweep]" unless gh_available? puts_line "gh CLI not found in PATH — install it to use review commands." return EXIT_ERROR end owner, repo = repository_coordinates cutoff_time = Time.now.utc - ( config.review_sweep_window_days * 86_400 ) pull_requests = recent_pull_requests_for_sweep( owner: owner, repo: repo, cutoff_time: cutoff_time ) puts_verbose "window_days: #{config.review_sweep_window_days}" puts_verbose "candidate_prs: #{pull_requests.count}" findings = [] pull_requests.each do |entry| next unless config.review_sweep_states.include?( sweep_state_for( pr_state: entry.fetch( :state ) ) ) details = pull_request_details( owner: owner, repo: repo, pr_number: entry.fetch( :number ) ) findings.concat( sweep_findings_for_pull_request( details: details ) ) end findings.sort_by! { |item| [ item.fetch( :pr_number ), item.fetch( :created_at ).to_s, item.fetch( :url ) ] } issue_result = upsert_review_sweep_tracking_issue( owner: owner, repo: repo, findings: findings ) report = { generated_at: Time.now.utc.iso8601, status: findings.empty? ? "ok" : "block", window_days: config.review_sweep_window_days, states: config.review_sweep_states, cutoff_time: cutoff_time.utc.iso8601, candidate_count: pull_requests.count, finding_count: findings.count, findings: findings, tracking_issue: issue_result } write_review_sweep_report( report: report ) puts_line "finding_count: #{findings.count}" if findings.empty? puts_line "OK: no actionable late review activity detected." return EXIT_OK end puts_line "Late review activity needs attention." EXIT_BLOCK rescue JSON::ParserError => exception puts_line "Unexpected response from gh (#{exception.})." EXIT_ERROR rescue StandardError => exception puts_line exception. EXIT_ERROR end |