-
Notifications
You must be signed in to change notification settings - Fork 558
Description
Ruby is moving toward having literal strings frozen by default[1][2]. Currently passenger has many instances where it mutates a literal string. This will break in future version of ruby where literal strings are frozen, and currently breaks apps that try and run with frozen-string-literal enabled.
I tested this with the latest version of passenger (6.0.27) with rails 7.1.5 on ruby 3.1.3 and rails 8.0.2 on ruby 3.2.2. I am on Mac OSX 15.4.
I found a bunch of cases where string literals were mutated, and started to try and fix them. But I was unable to get very far since I couldn't get the dev environment setup for passenger. Hopefully this helps someone else get started.
STEPS TO REPRODUCE
SETUP
Generate a new rails app:
rails new my_app
cd my_app
Add passenger to the Gemfile:
gem "passenger", "~> 6.0.27", require: "phusion_passenger/rack_handler"
Bundle install to install passenge:
bundle install
Run passenger with frozen-string-literal enabled:
RUBYOPT="--enable=frozen_string_literal" bundle exec passenger start
OBSERVED BEHAVIOR
Passenger fails to start with a FrozenError in the passenger code.
bundler: failed to load command: passenger (/Users/steven.boyd/.asdf/installs/ruby/3.2.2/bin/passenger)
/Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/passenger-6.0.27/src/ruby_supportlib/phusion_passenger.rb:192:in `block in <module:PhusionPassenger>': can't modify frozen String: "" (FrozenError)
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/passenger-6.0.27/src/ruby_supportlib/phusion_passenger.rb:191:in `each'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/passenger-6.0.27/src/ruby_supportlib/phusion_passenger.rb:191:in `<module:PhusionPassenger>'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/passenger-6.0.27/src/ruby_supportlib/phusion_passenger.rb:26:in `<top (required)>'
from <internal:/Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
from <internal:/Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/passenger-6.0.27/bin/passenger:33:in `<top (required)>'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/bin/passenger:25:in `load'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/bin/passenger:25:in `<top (required)>'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/cli/exec.rb:58:in `load'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/cli/exec.rb:58:in `kernel_load'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/cli/exec.rb:23:in `run'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/cli.rb:491:in `exec'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/cli.rb:34:in `dispatch'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/cli.rb:28:in `start'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/exe/bundle:45:in `block in <top (required)>'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/exe/bundle:33:in `<top (required)>'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/bin/bundle:25:in `load'
from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/bin/bundle:25:in `<main>'
DESIRED BEHAVIOR
Passenger boots up and works with frozen-string-literal enabled.