Module: Carson::Runtime::Deliver
- Included in:
- Carson::Runtime
- Defined in:
- lib/carson/runtime/deliver.rb
Instance Method Summary collapse
-
#deliver!(merge: false, title: nil, body_file: nil, json_output: false) ⇒ Object
Entry point for ‘carson deliver`.
Instance Method Details
#deliver!(merge: false, title: nil, body_file: nil, json_output: false) ⇒ Object
Entry point for ‘carson deliver`. Pushes current branch, creates a PR if needed, reports the PR URL. With merge: true, also merges if CI passes and cleans up.
12 13 14 15 16 17 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 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/carson/runtime/deliver.rb', line 12 def deliver!( merge: false, title: nil, body_file: nil, json_output: false ) branch = current_branch main = config.main_branch remote = config.git_remote result = { command: "deliver", branch: branch } # Guard: cannot deliver from main. if branch == main result[ :error ] = "cannot deliver from #{main}" result[ :recovery ] = "git checkout -b <branch-name>" return deliver_finish( result: result, exit_code: EXIT_ERROR, json_output: json_output ) end # Step 1: push the branch. push_exit = push_branch!( branch: branch, remote: remote, result: result ) return deliver_finish( result: result, exit_code: push_exit, json_output: json_output ) unless push_exit == EXIT_OK # Step 2: find or create the PR. pr_number, pr_url = find_or_create_pr!( branch: branch, title: title, body_file: body_file, result: result ) if pr_number.nil? return deliver_finish( result: result, exit_code: EXIT_ERROR, json_output: json_output ) end result[ :pr_number ] = pr_number result[ :pr_url ] = pr_url # Record PR in session state. update_session( pr: { number: pr_number, url: pr_url } ) # Without --merge, we are done. unless merge return deliver_finish( result: result, exit_code: EXIT_OK, json_output: json_output ) end # Step 3: check CI status. ci_status = check_pr_ci( number: pr_number ) result[ :ci ] = ci_status.to_s case ci_status when :pass # Continue to review gate. when :pending result[ :recovery ] = "gh pr checks #{pr_number} --watch && carson deliver --merge" return deliver_finish( result: result, exit_code: EXIT_OK, json_output: json_output ) when :fail result[ :recovery ] = "gh pr checks #{pr_number} — fix failures, push, then `carson deliver --merge`" return deliver_finish( result: result, exit_code: EXIT_BLOCK, json_output: json_output ) else result[ :recovery ] = "gh pr checks #{pr_number}" return deliver_finish( result: result, exit_code: EXIT_OK, json_output: json_output ) end # Step 4: check review gate — block if changes are requested. review = check_pr_review( number: pr_number ) result[ :review ] = review.to_s if review == :changes_requested result[ :error ] = "review changes requested on PR ##{pr_number}" result[ :recovery ] = "address review comments, push, then `carson deliver --merge`" return deliver_finish( result: result, exit_code: EXIT_BLOCK, json_output: json_output ) end # Step 5: merge. merge_exit = merge_pr!( number: pr_number, result: result ) return deliver_finish( result: result, exit_code: merge_exit, json_output: json_output ) unless merge_exit == EXIT_OK result[ :merged ] = true # Step 6: mark worktree done in session state. update_session( worktree: :clear ) # Step 7: sync main in the main worktree. sync_after_merge!( remote: remote, main: main, result: result ) deliver_finish( result: result, exit_code: EXIT_OK, json_output: json_output ) end |