Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions lib/shadowenv_ruby.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,14 @@ def resolve_ruby_version(explicit_version)
def detect_homebrew_ruby_version
prefix = brew_prefix_for("ruby")
return nil unless prefix
# /opt/homebrew/Cellar/ruby/4.0.1 -> "4.0.1"
# /opt/homebrew/Cellar/ruby/4.0.1 -> "4.0.1"
# /opt/homebrew/Cellar/ruby/4.0.6_1 -> "4.0.6"
# The keg dirname carries brew's PKG version, whose "_N" formula-revision
# suffix (a rebuild of the same upstream Ruby) is not part of RUBY_VERSION
# and is rejected by Gem::Version - so only the numeric prefix may leak out.
realpath = File.realpath(prefix) rescue prefix
version = File.basename(realpath)
return version if version.match?(/\A\d+\.\d+/)
version = File.basename(realpath)[/\A\d+(?:\.\d+)+/]
return version if version
# Fallback: ask the Homebrew ruby binary directly
ruby_bin = File.join(prefix, "bin", "ruby")
return nil unless File.executable?(ruby_bin)
Expand Down
36 changes: 36 additions & 0 deletions test/lib/shadowenv_ruby_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,42 @@ class ShadowenvRubyTest < Minitest::Test
1 * Kernel.abort("dev: Resolved Ruby 2.6.0 is below dev's minimum (>= 2.7.0). Pin a newer version in dependencies.rb or run: brew upgrade ruby")
end

# --- detect_homebrew_ruby_version ---

test "detect_homebrew_ruby_version returns the keg version from a plain Cellar path" do
Given "a brew ruby prefix resolving to a plain version keg"
tmpdir = Dir.mktmpdir("shadowenv-detect-test-")
keg = File.join(tmpdir, "Cellar", "ruby", "4.0.6")
FileUtils.mkdir_p(keg)

When "we detect the Homebrew Ruby version"
result = ShadowenvRuby.detect_homebrew_ruby_version

Then "the keg's version is returned"
_ * ShadowenvRuby.brew_prefix_for("ruby") >> keg
result == "4.0.6"

Cleanup
FileUtils.rm_rf(tmpdir)
end

test "detect_homebrew_ruby_version strips a brew formula revision suffix" do
Given "a brew ruby prefix resolving to a revision keg (a rebuild of the same upstream Ruby)"
tmpdir = Dir.mktmpdir("shadowenv-detect-test-")
keg = File.join(tmpdir, "Cellar", "ruby", "4.0.6_1")
FileUtils.mkdir_p(keg)

When "we detect the Homebrew Ruby version"
result = ShadowenvRuby.detect_homebrew_ruby_version

Then "the upstream version is returned - RUBY_VERSION carries no _1, and Gem::Version rejects it"
_ * ShadowenvRuby.brew_prefix_for("ruby") >> keg
result == "4.0.6"

Cleanup
FileUtils.rm_rf(tmpdir)
end

# --- ensure! ---

test "ensure! skips setup! when the project is already provisioned" do
Expand Down
Loading