| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  | # typed: true | 
					
						
							|  |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require "cli/parser" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							|  |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(CLI::Parser) } | 
					
						
							|  |  |  |   def release_args | 
					
						
							|  |  |  |     Homebrew::CLI::Parser.new do | 
					
						
							|  |  |  |       description <<~EOS | 
					
						
							|  |  |  |         Create a new draft Homebrew/brew release with the appropriate version number and release notes. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         By default, `brew release` will bump the patch version number. Pass | 
					
						
							|  |  |  |         `--major` or `--minor` to bump the major or minor version numbers, respectively. | 
					
						
							|  |  |  |         The command will fail if the previous major or minor release was made less than | 
					
						
							|  |  |  |         one month ago. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-09 12:09:38 -04:00
										 |  |  |         *Note:* Requires write access to the Homebrew/brew repository. | 
					
						
							| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  |       EOS | 
					
						
							|  |  |  |       switch "--major", | 
					
						
							|  |  |  |              description: "Create a major release." | 
					
						
							|  |  |  |       switch "--minor", | 
					
						
							|  |  |  |              description: "Create a minor release." | 
					
						
							|  |  |  |       conflicts "--major", "--minor" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       named_args :none | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def release | 
					
						
							|  |  |  |     args = release_args.parse | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     safe_system "git", "-C", HOMEBREW_REPOSITORY, "fetch", "origin" if Homebrew::EnvConfig.no_auto_update? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     begin | 
					
						
							|  |  |  |       latest_release = GitHub.get_latest_release "Homebrew", "brew" | 
					
						
							| 
									
										
										
										
											2021-02-15 21:48:21 +05:30
										 |  |  |     rescue GitHub::API::HTTPNotFoundError | 
					
						
							| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  |       odie "No existing releases found!" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     latest_version = Version.new latest_release["tag_name"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if args.major? || args.minor? | 
					
						
							|  |  |  |       one_month_ago = Date.today << 1
 | 
					
						
							|  |  |  |       latest_major_minor_release = begin | 
					
						
							|  |  |  |         GitHub.get_release "Homebrew", "brew", "#{latest_version.major_minor}.0" | 
					
						
							| 
									
										
										
										
											2021-02-15 21:48:21 +05:30
										 |  |  |       rescue GitHub::API::HTTPNotFoundError | 
					
						
							| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  |         nil | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if latest_major_minor_release.blank? | 
					
						
							|  |  |  |         opoo "Unable to determine the release date of the latest major/minor release." | 
					
						
							|  |  |  |       elsif Date.parse(latest_major_minor_release["published_at"]) > one_month_ago | 
					
						
							|  |  |  |         odie "The latest major/minor release was less than one month ago." | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     new_version = if args.major? | 
					
						
							| 
									
										
										
										
											2021-01-21 17:43:52 -05:00
										 |  |  |       Version.new "#{latest_version.major.to_i + 1}.0.0" | 
					
						
							| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  |     elsif args.minor? | 
					
						
							| 
									
										
										
										
											2021-01-21 17:43:52 -05:00
										 |  |  |       Version.new "#{latest_version.major}.#{latest_version.minor.to_i + 1}.0" | 
					
						
							| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2021-01-21 17:43:52 -05:00
										 |  |  |       Version.new "#{latest_version.major}.#{latest_version.minor}.#{latest_version.patch.to_i + 1}" | 
					
						
							| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  |     end.to_s | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-03 10:06:10 +00:00
										 |  |  |     if args.major? || args.minor? | 
					
						
							|  |  |  |       latest_major_minor_version = "#{latest_version.major}.#{latest_version.minor.to_i}.0" | 
					
						
							|  |  |  |       ohai "Release notes since #{latest_major_minor_version} for #{new_version} blog post:" | 
					
						
							| 
									
										
										
										
											2021-10-04 17:43:35 -04:00
										 |  |  |       # release notes without usernames, new contributors, or extra lines | 
					
						
							|  |  |  |       blog_post_notes = GitHub.generate_release_notes("Homebrew", "brew", new_version, | 
					
						
							|  |  |  |                                                       previous_tag: latest_major_minor_version)["body"] | 
					
						
							|  |  |  |       blog_post_notes = blog_post_notes.lines.map do |line| | 
					
						
							|  |  |  |         next unless (match = line.match(/^\* (.*) by @[\w-]+ in (.*)$/)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         "- [#{match[1]}](#{match[2]})" | 
					
						
							|  |  |  |       end.compact.sort | 
					
						
							|  |  |  |       puts blog_post_notes | 
					
						
							| 
									
										
										
										
											2021-02-03 10:06:10 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  |     ohai "Creating draft release for version #{new_version}" | 
					
						
							| 
									
										
										
										
											2021-01-21 17:43:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  |     release_notes = if args.major? || args.minor? | 
					
						
							| 
									
										
										
										
											2021-01-21 17:43:52 -05:00
										 |  |  |       "Release notes for this release can be found on the [Homebrew blog](https://brew.sh/blog/#{new_version}).\n" | 
					
						
							| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2021-01-21 17:43:52 -05:00
										 |  |  |       "" | 
					
						
							| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2021-10-04 17:43:35 -04:00
										 |  |  |     release_notes += GitHub.generate_release_notes("Homebrew", "brew", new_version, | 
					
						
							|  |  |  |                                                    previous_tag: latest_version)["body"] | 
					
						
							| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     begin | 
					
						
							| 
									
										
										
										
											2021-01-21 17:43:52 -05:00
										 |  |  |       release = GitHub.create_or_update_release "Homebrew", "brew", new_version, body: release_notes, draft: true | 
					
						
							| 
									
										
										
										
											2021-02-17 23:22:26 +05:30
										 |  |  |     rescue *GitHub::API::ERRORS => e | 
					
						
							| 
									
										
										
										
											2021-01-20 01:26:12 -05:00
										 |  |  |       odie "Unable to create release: #{e.message}!" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     puts release["html_url"] | 
					
						
							|  |  |  |     exec_browser release["html_url"] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |