diff --git a/Library/Homebrew/dev-cmd/vendor-gems.rb b/Library/Homebrew/dev-cmd/vendor-gems.rb index 65b810ac9f..063fb9242e 100644 --- a/Library/Homebrew/dev-cmd/vendor-gems.rb +++ b/Library/Homebrew/dev-cmd/vendor-gems.rb @@ -1,94 +1,92 @@ # typed: true # frozen_string_literal: true +require "abstract_command" require "cli/parser" module Homebrew - module_function + module DevCmd + class VendorGems < AbstractCommand + cmd_args do + description <<~EOS + Install and commit Homebrew's vendored gems. + EOS - sig { returns(CLI::Parser) } - def vendor_gems_args - Homebrew::CLI::Parser.new do - description <<~EOS - Install and commit Homebrew's vendored gems. - EOS + comma_array "--update", + description: "Update the specified list of vendored gems to the latest version." + switch "--no-commit", + description: "Do not generate a new commit upon completion." + switch "--non-bundler-gems", + description: "Update vendored gems that aren't using Bundler.", + hidden: true - comma_array "--update", - description: "Update the specified list of vendored gems to the latest version." - switch "--no-commit", - description: "Do not generate a new commit upon completion." - switch "--non-bundler-gems", - description: "Update vendored gems that aren't using Bundler.", - hidden: true - - named_args :none - end - end - - sig { void } - def vendor_gems - args = vendor_gems_args.parse - - Homebrew.install_bundler! - - ENV["BUNDLE_WITH"] = Homebrew.valid_gem_groups.join(":") - - ohai "cd #{HOMEBREW_LIBRARY_PATH}" - HOMEBREW_LIBRARY_PATH.cd do - if args.update - ohai "bundle update" - safe_system "bundle", "update", *args.update - - unless args.no_commit? - ohai "git add Gemfile.lock" - system "git", "add", "Gemfile.lock" - end + named_args :none end - ohai "bundle install --standalone" - safe_system "bundle", "install", "--standalone" + sig { override.void } + def run + Homebrew.install_bundler! - ohai "bundle pristine" - safe_system "bundle", "pristine" + ENV["BUNDLE_WITH"] = Homebrew.valid_gem_groups.join(":") - # Workaround Bundler 2.4.21 issue where platforms may be removed. - # Although we don't use 2.4.21, Dependabot does as it currently ignores your lockfile version. - # https://github.com/rubygems/rubygems/issues/7169 - safe_system "bundle", "lock", "--add-platform", "aarch64-linux", "arm-linux" - system "git", "add", "Gemfile.lock" unless args.no_commit? + ohai "cd #{HOMEBREW_LIBRARY_PATH}" + HOMEBREW_LIBRARY_PATH.cd do + if args.update + ohai "bundle update" + safe_system "bundle", "update", *args.update - if args.non_bundler_gems? - %w[ - mechanize - ].each do |gem| - (HOMEBREW_LIBRARY_PATH/"vendor/gems").cd do - Pathname.glob("#{gem}-*/").each { |path| FileUtils.rm_r(path) } + unless args.no_commit? + ohai "git add Gemfile.lock" + system "git", "add", "Gemfile.lock" + end end - ohai "gem install #{gem}" - safe_system "gem", "install", gem, "--install-dir", "vendor", - "--no-document", "--no-wrappers", "--ignore-dependencies", "--force" - (HOMEBREW_LIBRARY_PATH/"vendor/gems").cd do - source = Pathname.glob("#{gem}-*/").first - next if source.blank? - # We cannot use `#ln_sf` here because that has unintended consequences when - # the symlink we want to create exists and points to an existing directory. - FileUtils.rm_f gem - FileUtils.ln_s source, gem + ohai "bundle install --standalone" + safe_system "bundle", "install", "--standalone" + + ohai "bundle pristine" + safe_system "bundle", "pristine" + + # Workaround Bundler 2.4.21 issue where platforms may be removed. + # Although we don't use 2.4.21, Dependabot does as it currently ignores your lockfile version. + # https://github.com/rubygems/rubygems/issues/7169 + safe_system "bundle", "lock", "--add-platform", "aarch64-linux", "arm-linux" + system "git", "add", "Gemfile.lock" unless args.no_commit? + + if args.non_bundler_gems? + %w[ + mechanize + ].each do |gem| + (HOMEBREW_LIBRARY_PATH/"vendor/gems").cd do + Pathname.glob("#{gem}-*/").each { |path| FileUtils.rm_r(path) } + end + ohai "gem install #{gem}" + safe_system "gem", "install", gem, "--install-dir", "vendor", + "--no-document", "--no-wrappers", "--ignore-dependencies", "--force" + (HOMEBREW_LIBRARY_PATH/"vendor/gems").cd do + source = Pathname.glob("#{gem}-*/").first + next if source.blank? + + # We cannot use `#ln_sf` here because that has unintended consequences when + # the symlink we want to create exists and points to an existing directory. + FileUtils.rm_f gem + FileUtils.ln_s source, gem + end + end + end + + unless args.no_commit? + ohai "git add vendor" + system "git", "add", "vendor" + + Utils::Git.set_name_email! + Utils::Git.setup_gpg! + + ohai "git commit" + system "git", "commit", "--message", "brew vendor-gems: commit updates." end end end - - unless args.no_commit? - ohai "git add vendor" - system "git", "add", "vendor" - - Utils::Git.set_name_email! - Utils::Git.setup_gpg! - - ohai "git commit" - system "git", "commit", "--message", "brew vendor-gems: commit updates." - end end end end diff --git a/Library/Homebrew/test/dev-cmd/vendor-gems_spec.rb b/Library/Homebrew/test/dev-cmd/vendor-gems_spec.rb index c9ef4c4fd3..f2183c524e 100644 --- a/Library/Homebrew/test/dev-cmd/vendor-gems_spec.rb +++ b/Library/Homebrew/test/dev-cmd/vendor-gems_spec.rb @@ -1,7 +1,8 @@ # frozen_string_literal: true require "cmd/shared_examples/args_parse" +require "dev-cmd/vendor-gems" -RSpec.describe "brew vendor-gems" do +RSpec.describe Homebrew::DevCmd::VendorGems do it_behaves_like "parseable arguments" end