From: hone02@... Date: 2017-10-12T18:34:46+00:00 Subject: [ruby-core:83240] [Ruby trunk Bug#13997] Bundler gem binstub broken Issue #13997 has been updated by hone (Terence Lee). Eregon (Benoit Daloze) wrote: > So #load indeed does not support this skipping-until-ruby-shebang logic that `ruby file` does. > > I wonder why Bundle is trying to load a binary. > To save some time over creating another Ruby process? Ah, I see what you're saying. After some more inspection, it looks like there's something weird going on with how bundler's files in ```exe/``` are generated. This is bundler's file: ```ruby #!/bin/sh # -*- ruby -*- bindir="${0%/*}" exec "$bindir/ruby" -x "$0" "$@" #!/usr/bin/env ruby # frozen_string_literal: true load File.expand_path("../bundle", __FILE__) ``` This is rake's file: ```ruby $ cat /tmp/rubytest/lib/ruby/gems/2.5.0/gems/rake-12.1.0/exe/rake #!/usr/bin/env ruby #-- # Copyright (c) 2003, 2004, 2005, 2006, 2007 Jim Weirich # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. #++ require "rake" Rake.application.run ``` ---------------------------------------- Bug #13997: Bundler gem binstub broken https://bugs.ruby-lang.org/issues/13997#change-67191 * Author: hone (Terence Lee) * Status: Feedback * Priority: Normal * Assignee: hsbt (Hiroshi SHIBATA) * Target version: 2.5 * ruby -v: ruby 2.5.0preview1 (2017-10-10 trunk 60153) [x86_64-linux] * Backport: ---------------------------------------- Hi, In Ruby 2.5.0-preview1, I'm seeing the following error if the Rubygems binstub PATH precedes the binstubs from ruby and the Bundler version installed is <= 1.15.4 (what ruby vendors). ~~~ /home/hone/.rvm/gems/ruby-2.4.1@global/bin/bundle:22:in `load': /tmp/bundler/lib/ruby/gems/2.5.0/gems/bundler-1.15.4/exe/bundle:4: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError) exec "$bindir/ruby" -x "$0" "$@" ^ /tmp/bundler/lib/ruby/gems/2.5.0/gems/bundler-1.15.4/exe/bundle:9: syntax error, unexpected keyword_do_block, expecting end-of-input Signal.trap("INT") do ~~~ The reason for this is because the generated bundler binstub by rubygems runs code like this: ~~~ load Gem.bin_path('bundler', 'bundle', '>= 0.a') ~~~ The problem is that the binstub from the vendored bundler in ruby is not pure ruby: ~~~ #!/bin/sh # -*- ruby -*- bindir="${0%/*}" exec "$bindir/ruby" -x "$0" "$@" ~~~ The top of this file is shell and not ruby. Kernel#load chokes on this. Thanks, Terence -- https://bugs.ruby-lang.org/ Unsubscribe: