| 
									
										
										
										
											2020-11-25 17:03:23 +01:00
										 |  |  | # typed: true | 
					
						
							| 
									
										
										
										
											2020-07-06 22:19:17 +02:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require "cli/parser" | 
					
						
							|  |  |  | require "utils/github" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   extend T::Sig | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 22:19:17 +02:00
										 |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   sig { returns(CLI::Parser) } | 
					
						
							| 
									
										
										
										
											2020-07-06 22:19:17 +02:00
										 |  |  |   def dispatch_build_bottle_args | 
					
						
							|  |  |  |     Homebrew::CLI::Parser.new do | 
					
						
							| 
									
										
										
										
											2021-01-15 15:04:02 -05:00
										 |  |  |       description <<~EOS | 
					
						
							| 
									
										
										
										
											2020-07-06 22:19:17 +02:00
										 |  |  |         Build bottles for these formulae with GitHub Actions. | 
					
						
							|  |  |  |       EOS | 
					
						
							|  |  |  |       flag   "--tap=", | 
					
						
							|  |  |  |              description: "Target tap repository (default: `homebrew/core`)." | 
					
						
							|  |  |  |       flag   "--issue=", | 
					
						
							|  |  |  |              description: "If specified, post a comment to this issue number if the job fails." | 
					
						
							|  |  |  |       flag   "--macos=", | 
					
						
							|  |  |  |              description: "Version of macOS the bottle should be built for." | 
					
						
							|  |  |  |       flag   "--workflow=", | 
					
						
							|  |  |  |              description: "Dispatch specified workflow (default: `dispatch-build-bottle.yml`)." | 
					
						
							|  |  |  |       switch "--upload", | 
					
						
							|  |  |  |              description: "Upload built bottles to Bintray." | 
					
						
							| 
									
										
										
										
											2021-03-03 15:55:47 +01:00
										 |  |  |       switch "--linux", | 
					
						
							|  |  |  |              description: "Dispatch bottle for Linux (using GitHub runners)." | 
					
						
							| 
									
										
										
										
											2020-11-12 10:40:41 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-03 15:55:47 +01:00
										 |  |  |       conflicts "--macos", "--linux" | 
					
						
							| 
									
										
										
										
											2021-01-10 14:26:40 -05:00
										 |  |  |       named_args :formula, min: 1
 | 
					
						
							| 
									
										
										
										
											2020-07-06 22:19:17 +02:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def dispatch_build_bottle | 
					
						
							|  |  |  |     args = dispatch_build_bottle_args.parse | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-03 15:55:47 +01:00
										 |  |  |     tap = Tap.fetch(args.tap || CoreTap.instance.name) | 
					
						
							|  |  |  |     user, repo = tap.full_name.split("/") | 
					
						
							|  |  |  |     ref = "master" | 
					
						
							|  |  |  |     workflow = args.workflow || "dispatch-build-bottle.yml" | 
					
						
							| 
									
										
										
										
											2020-12-07 13:20:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-03 15:55:47 +01:00
										 |  |  |     # Ensure we dispatch the bottle in homebrew/homebrew-core | 
					
						
							|  |  |  |     # TODO: remove when core taps are merged | 
					
						
							|  |  |  |     repo.gsub!("linux", "home") unless args.tap | 
					
						
							| 
									
										
										
										
											2020-07-06 22:19:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-03 15:55:47 +01:00
										 |  |  |     if (macos = args.macos) | 
					
						
							| 
									
										
										
										
											2021-04-08 13:45:15 +01:00
										 |  |  |       # We accept runner name syntax (11-arm64) or bottle syntax (arm64_big_sur) | 
					
						
							|  |  |  |       os, arch = macos.yield_self do |s| | 
					
						
							|  |  |  |         tag = Utils::Bottles::Tag.from_symbol(s.to_sym) | 
					
						
							|  |  |  |         [tag.to_macos_version, tag.arch] | 
					
						
							|  |  |  |       rescue ArgumentError, MacOSVersionError | 
					
						
							|  |  |  |         os, arch = s.split("-", 2) | 
					
						
							|  |  |  |         [MacOS::Version.new(os), arch&.to_sym] | 
					
						
							| 
									
										
										
										
											2021-03-03 15:55:47 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-11-29 22:36:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-08 13:45:15 +01:00
										 |  |  |       # TODO: fix label name to be 11-arm64 instead. | 
					
						
							|  |  |  |       arch = :arm if arch == :arm64 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       macos_label = if arch.present? && arch != :x86_64 | 
					
						
							|  |  |  |         "#{os}-#{arch}" | 
					
						
							| 
									
										
										
										
											2021-03-03 15:55:47 +01:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2021-04-08 13:45:15 +01:00
										 |  |  |         os.to_s | 
					
						
							| 
									
										
										
										
											2021-03-03 15:55:47 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-07-06 22:19:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-08 13:45:15 +01:00
										 |  |  |       # TODO: fix label name to be 11 instead. | 
					
						
							|  |  |  |       macos_label = "11.0" if macos_label == "11" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       dispatching_for = "macOS #{macos_label}" | 
					
						
							| 
									
										
										
										
											2021-03-03 15:55:47 +01:00
										 |  |  |     elsif T.unsafe(args).linux? | 
					
						
							|  |  |  |       workflow = args.workflow || "linux-#{workflow}" | 
					
						
							|  |  |  |       dispatching_for = "Linux" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       raise UsageError, "Must specify --macos or --linux option" | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-07-06 22:19:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     args.named.to_resolved_formulae.each do |formula| | 
					
						
							|  |  |  |       # Required inputs | 
					
						
							|  |  |  |       inputs = { | 
					
						
							|  |  |  |         formula: formula.name, | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Optional inputs | 
					
						
							|  |  |  |       # These cannot be passed as nil to GitHub API | 
					
						
							| 
									
										
										
										
											2021-03-03 15:55:47 +01:00
										 |  |  |       inputs[:macos] = macos_label if args.macos | 
					
						
							| 
									
										
										
										
											2020-07-06 22:19:17 +02:00
										 |  |  |       inputs[:issue] = args.issue if args.issue | 
					
						
							|  |  |  |       inputs[:upload] = args.upload?.to_s if args.upload? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-03 15:55:47 +01:00
										 |  |  |       ohai "Dispatching #{tap} bottling request of formula \"#{formula.name}\" for #{dispatching_for}" | 
					
						
							| 
									
										
										
										
											2020-07-06 22:19:17 +02:00
										 |  |  |       GitHub.workflow_dispatch_event(user, repo, workflow, ref, inputs) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |