Port Homebrew::DevCmd::Sh
This commit is contained in:
parent
177bab38c7
commit
1436b06e90
@ -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` [<options>] (`-e` <text>|<file>)"
|
||||
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` [<options>] (`-e` <text>|<file>)"
|
||||
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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user