From 1436b06e906c93b153cc7e116f5abb6430fc5c7b Mon Sep 17 00:00:00 2001 From: Douglas Eichelberger Date: Thu, 21 Mar 2024 21:41:54 -0700 Subject: [PATCH] Port Homebrew::DevCmd::Sh --- Library/Homebrew/dev-cmd/ruby.rb | 59 +++++----- Library/Homebrew/dev-cmd/sh.rb | 119 ++++++++++----------- Library/Homebrew/test/dev-cmd/ruby_spec.rb | 3 +- Library/Homebrew/test/dev-cmd/sh_spec.rb | 3 +- 4 files changed, 92 insertions(+), 92 deletions(-) diff --git a/Library/Homebrew/dev-cmd/ruby.rb b/Library/Homebrew/dev-cmd/ruby.rb index 9cdfe64d1e..db071c75a6 100644 --- a/Library/Homebrew/dev-cmd/ruby.rb +++ b/Library/Homebrew/dev-cmd/ruby.rb @@ -1,41 +1,40 @@ -# typed: true +# typed: strict # frozen_string_literal: true +require "abstract_command" require "cli/parser" module Homebrew - module_function + module DevCmd + class Ruby < AbstractCommand + cmd_args do + usage_banner "`ruby` [] (`-e` |)" + description <<~EOS + Run a Ruby instance with Homebrew's libraries loaded. For example, + `brew ruby -e "puts :gcc.f.deps"` or `brew ruby script.rb`. - sig { returns(CLI::Parser) } - def ruby_args - Homebrew::CLI::Parser.new do - usage_banner "`ruby` [] (`-e` |)" - description <<~EOS - Run a Ruby instance with Homebrew's libraries loaded. For example, - `brew ruby -e "puts :gcc.f.deps"` or `brew ruby script.rb`. + Run e.g. `brew ruby -- --version` to pass arbitrary arguments to `ruby`. + EOS + flag "-r=", + description: "Load a library using `require`." + flag "-e=", + description: "Execute the given text string as a script." - Run e.g. `brew ruby -- --version` to pass arbitrary arguments to `ruby`. - EOS - flag "-r=", - description: "Load a library using `require`." - flag "-e=", - description: "Execute the given text string as a script." + named_args :file + end - named_args :file + sig { override.void } + def run + ruby_sys_args = [] + ruby_sys_args << "-r#{args.r}" if args.r + ruby_sys_args << "-e #{args.e}" if args.e + ruby_sys_args += args.named + + exec(*HOMEBREW_RUBY_EXEC_ARGS, + "-I", $LOAD_PATH.join(File::PATH_SEPARATOR), + "-rglobal", "-rdev-cmd/irb", + *ruby_sys_args) + end end end - - def ruby - args = ruby_args.parse - - ruby_sys_args = [] - ruby_sys_args << "-r#{args.r}" if args.r - ruby_sys_args << "-e #{args.e}" if args.e - ruby_sys_args += args.named - - exec(*HOMEBREW_RUBY_EXEC_ARGS, - "-I", $LOAD_PATH.join(File::PATH_SEPARATOR), - "-rglobal", "-rdev-cmd/irb", - *ruby_sys_args) - end end diff --git a/Library/Homebrew/dev-cmd/sh.rb b/Library/Homebrew/dev-cmd/sh.rb index 7ac99cb5fa..6b295dfd93 100644 --- a/Library/Homebrew/dev-cmd/sh.rb +++ b/Library/Homebrew/dev-cmd/sh.rb @@ -1,72 +1,71 @@ -# typed: true +# typed: strict # frozen_string_literal: true +require "abstract_command" require "extend/ENV" require "formula" require "cli/parser" module Homebrew - module_function + module DevCmd + class Sh < AbstractCommand + cmd_args do + description <<~EOS + Enter an interactive shell for Homebrew's build environment. Use years-battle-hardened + build logic to help your `./configure && make && make install` + and even your `gem install` succeed. Especially handy if you run Homebrew + in an Xcode-only configuration since it adds tools like `make` to your `PATH` + which build systems would not find otherwise. + EOS + flag "--env=", + description: "Use the standard `PATH` instead of superenv's when `std` is passed." + flag "-c=", "--cmd=", + description: "Execute commands in a non-interactive shell." - sig { returns(CLI::Parser) } - def sh_args - Homebrew::CLI::Parser.new do - description <<~EOS - Enter an interactive shell for Homebrew's build environment. Use years-battle-hardened - build logic to help your `./configure && make && make install` - and even your `gem install` succeed. Especially handy if you run Homebrew - in an Xcode-only configuration since it adds tools like `make` to your `PATH` - which build systems would not find otherwise. - EOS - flag "--env=", - description: "Use the standard `PATH` instead of superenv's when `std` is passed." - flag "-c=", "--cmd=", - description: "Execute commands in a non-interactive shell." - - named_args :file, max: 1 - end - end - - def sh - args = sh_args.parse - - ENV.activate_extensions!(env: args.env) - - ENV.deps = Formula.installed.select { |f| f.keg_only? && f.opt_prefix.directory? } if superenv?(args.env) - ENV.setup_build_environment - if superenv?(args.env) - # superenv stopped adding brew's bin but generally users will want it - ENV["PATH"] = PATH.new(ENV.fetch("PATH")).insert(1, HOMEBREW_PREFIX/"bin").to_s - end - - ENV["VERBOSE"] = "1" if args.verbose? - - preferred_shell = Utils::Shell.preferred_path(default: "/bin/bash") - - if args.cmd.present? - safe_system(preferred_shell, "-c", args.cmd) - elsif args.named.present? - safe_system(preferred_shell, args.named.first) - else - shell_type = Utils::Shell.preferred - subshell = case shell_type - when :zsh - "PS1='brew %B%F{green}%~%f%b$ ' #{preferred_shell} -d -f" - when :bash - "PS1=\"brew \\[\\033[1;32m\\]\\w\\[\\033[0m\\]$ \" #{preferred_shell} --noprofile --norc" - else - "PS1=\"brew \\[\\033[1;32m\\]\\w\\[\\033[0m\\]$ \" #{preferred_shell}" + named_args :file, max: 1 + end + + sig { override.void } + def run + ENV.activate_extensions!(env: args.env) + + ENV.deps = Formula.installed.select { |f| f.keg_only? && f.opt_prefix.directory? } if superenv?(args.env) + ENV.setup_build_environment + if superenv?(args.env) + # superenv stopped adding brew's bin but generally users will want it + ENV["PATH"] = PATH.new(ENV.fetch("PATH")).insert(1, HOMEBREW_PREFIX/"bin").to_s + end + + ENV["VERBOSE"] = "1" if args.verbose? + + preferred_shell = Utils::Shell.preferred_path(default: "/bin/bash") + + if args.cmd.present? + safe_system(preferred_shell, "-c", args.cmd) + elsif args.named.present? + safe_system(preferred_shell, args.named.first) + else + shell_type = Utils::Shell.preferred + subshell = case shell_type + when :zsh + "PS1='brew %B%F{green}%~%f%b$ ' #{preferred_shell} -d -f" + when :bash + "PS1=\"brew \\[\\033[1;32m\\]\\w\\[\\033[0m\\]$ \" #{preferred_shell} --noprofile --norc" + else + "PS1=\"brew \\[\\033[1;32m\\]\\w\\[\\033[0m\\]$ \" #{preferred_shell}" + end + puts <<~EOS + Your shell has been configured to use Homebrew's build environment; + this should help you build stuff. Notably though, the system versions of + gem and pip will ignore our configuration and insist on using the + environment they were built under (mostly). Sadly, scons will also + ignore our configuration. + When done, type `exit`. + EOS + $stdout.flush + safe_system subshell + end end - puts <<~EOS - Your shell has been configured to use Homebrew's build environment; - this should help you build stuff. Notably though, the system versions of - gem and pip will ignore our configuration and insist on using the - environment they were built under (mostly). Sadly, scons will also - ignore our configuration. - When done, type `exit`. - EOS - $stdout.flush - safe_system subshell end end end diff --git a/Library/Homebrew/test/dev-cmd/ruby_spec.rb b/Library/Homebrew/test/dev-cmd/ruby_spec.rb index 076bf01eb6..02833b4ad6 100644 --- a/Library/Homebrew/test/dev-cmd/ruby_spec.rb +++ b/Library/Homebrew/test/dev-cmd/ruby_spec.rb @@ -1,8 +1,9 @@ # frozen_string_literal: true require "cmd/shared_examples/args_parse" +require "dev-cmd/ruby" -RSpec.describe "brew ruby" do +RSpec.describe Homebrew::DevCmd::Ruby do it_behaves_like "parseable arguments" it "executes ruby code with Homebrew's libraries loaded", :integration_test do diff --git a/Library/Homebrew/test/dev-cmd/sh_spec.rb b/Library/Homebrew/test/dev-cmd/sh_spec.rb index e2a690a854..60c4c206f2 100644 --- a/Library/Homebrew/test/dev-cmd/sh_spec.rb +++ b/Library/Homebrew/test/dev-cmd/sh_spec.rb @@ -1,8 +1,9 @@ # frozen_string_literal: true require "cmd/shared_examples/args_parse" +require "dev-cmd/sh" -RSpec.describe "brew sh" do +RSpec.describe Homebrew::DevCmd::Sh do it_behaves_like "parseable arguments" it "runs a shell with the Homebrew environment", :integration_test do