| 
									
										
										
										
											2024-03-21 17:29:01 -07:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2020-03-22 13:12:48 +11:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 17:29:01 -07:00
										 |  |  | require "abstract_command" | 
					
						
							| 
									
										
										
										
											2020-03-22 13:12:48 +11:00
										 |  |  | require "utils/github" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2024-03-21 17:29:01 -07:00
										 |  |  |   module DevCmd | 
					
						
							|  |  |  |     class PrPublish < AbstractCommand | 
					
						
							|  |  |  |       cmd_args do | 
					
						
							|  |  |  |         description <<~EOS | 
					
						
							|  |  |  |           Publish bottles for a pull request with GitHub Actions. | 
					
						
							|  |  |  |           Requires write access to the repository. | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |         switch "--autosquash", | 
					
						
							|  |  |  |                description: "If supported on the target tap, automatically reformat and reword commits " \ | 
					
						
							|  |  |  |                             "to our preferred format." | 
					
						
							|  |  |  |         switch "--large-runner", | 
					
						
							|  |  |  |                description: "Run the upload job on a large runner." | 
					
						
							|  |  |  |         flag   "--branch=", | 
					
						
							|  |  |  |                description: "Branch to use the workflow from (default: `master`)." | 
					
						
							|  |  |  |         flag   "--message=", | 
					
						
							|  |  |  |                depends_on:  "--autosquash", | 
					
						
							|  |  |  |                description: "Message to include when autosquashing revision bumps, deletions and rebuilds." | 
					
						
							|  |  |  |         flag   "--tap=", | 
					
						
							|  |  |  |                description: "Target tap repository (default: `homebrew/core`)." | 
					
						
							|  |  |  |         flag   "--workflow=", | 
					
						
							|  |  |  |                description: "Target workflow filename (default: `publish-commit-bottles.yml`)." | 
					
						
							| 
									
										
										
										
											2020-03-22 13:12:48 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 17:29:01 -07:00
										 |  |  |         named_args :pull_request, min: 1
 | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-07-30 18:40:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 17:29:01 -07:00
										 |  |  |       sig { override.void } | 
					
						
							|  |  |  |       def run | 
					
						
							|  |  |  |         tap = Tap.fetch(args.tap || CoreTap.instance.name) | 
					
						
							|  |  |  |         workflow = args.workflow || "publish-commit-bottles.yml" | 
					
						
							|  |  |  |         ref = args.branch || "master" | 
					
						
							| 
									
										
										
										
											2020-03-22 13:12:48 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 17:29:01 -07:00
										 |  |  |         inputs = { | 
					
						
							|  |  |  |           autosquash:   args.autosquash?, | 
					
						
							|  |  |  |           large_runner: args.large_runner?, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         inputs[:message] = args.message if args.message.presence | 
					
						
							| 
									
										
										
										
											2020-03-22 13:12:48 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 17:29:01 -07:00
										 |  |  |         args.named.uniq.each do |arg| | 
					
						
							|  |  |  |           arg = "#{tap.default_remote}/pull/#{arg}" if arg.to_i.positive? | 
					
						
							|  |  |  |           url_match = arg.match HOMEBREW_PULL_OR_COMMIT_URL_REGEX | 
					
						
							|  |  |  |           _, user, repo, issue = *url_match | 
					
						
							|  |  |  |           odie "Not a GitHub pull request: #{arg}" unless issue | 
					
						
							| 
									
										
										
										
											2020-03-31 10:02:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 17:29:01 -07:00
										 |  |  |           inputs[:pull_request] = issue | 
					
						
							| 
									
										
										
										
											2020-10-03 16:35:48 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 17:29:01 -07:00
										 |  |  |           pr_labels = GitHub.pull_request_labels(user, repo, issue) | 
					
						
							|  |  |  |           if pr_labels.include?("autosquash") | 
					
						
							|  |  |  |             oh1 "Found `autosquash` label on ##{issue}. Requesting autosquash." | 
					
						
							|  |  |  |             inputs[:autosquash] = true | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |           if pr_labels.include?("large-bottle-upload") | 
					
						
							|  |  |  |             oh1 "Found `large-bottle-upload` label on ##{issue}. Requesting upload on large runner." | 
					
						
							|  |  |  |             inputs[:large_runner] = true | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-03-28 21:58:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 17:29:01 -07:00
										 |  |  |           if args.tap.present? && !T.must("#{user}/#{repo}".casecmp(tap.full_name)).zero? | 
					
						
							|  |  |  |             odie "Pull request URL is for #{user}/#{repo} but `--tap=#{tap.full_name}` was specified!" | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-03-28 21:58:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 17:29:01 -07:00
										 |  |  |           ohai "Dispatching #{tap} pull request ##{issue}" | 
					
						
							|  |  |  |           GitHub.workflow_dispatch_event(user, repo, workflow, ref, **inputs) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-06-27 20:06:35 +08:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-03-22 13:12:48 +11:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |