View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000476 | file | General | public | 2023-09-02 16:58 | 2024-02-04 19:30 |
Reporter | abathur | Assigned To | christos | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | feedback | Resolution | open | ||
Product Version | 5.45 | ||||
Summary | 0000476: identifying templated shebangs? | ||||
Description | I noticed the identifications like below for a few templates in ruby's bundler project: bundler/lib/bundler/templates/Executable: a <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %> script, ASCII text executable I'm not sure if a fix will be in scope since this feels like a pathological edge case. I'm also not sure what the best outcome would be if you feel like it is. I can imagine a few: 1. If it isn't a valid shebang, perhaps it can be excluded from the category of executables? I tried a naive test of this--mark it executable and try to run it. On Linux (NixOS) this just hangs (in strace it looks like it's looping before it ever gets passed to env). In macOS some or all of the shebang makes it through to env: $ bundler/lib/bundler/templates/Executable.standalone env: Bundler.settings[:shebang]: No such file or directory I'm not sure if it's the system or env ignoring `<%=` here. 2. Identify them as templates 3. Identify them as Ruby scripts (though I only really suggest this since it's already identifying the Executable.bundler script that way) | ||||
Steps To Reproduce | $ file bundler/lib/bundler/templates/Executable* bundler/lib/bundler/templates/Executable: a <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %> script, ASCII text executable bundler/lib/bundler/templates/Executable.bundler: Ruby script, ASCII text bundler/lib/bundler/templates/Executable.standalone: a <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %> script, ASCII text executable | ||||
Additional Information | $ file --version file-5.45 magic file from /nix/store/nil8ddwh0gg3rx7gr7bs6xi0lnnvsi71-file-5.45/share/misc/magic | ||||
Tags | No tags attached. | ||||
|
Executable (868 bytes)
#!/usr/bin/env <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %> # frozen_string_literal: true # # This file was generated by Bundler. # # The application '<%= executable %>' is installed as part of a gem, and # this file is here to facilitate running it. # ENV["BUNDLE_GEMFILE"] ||= File.expand_path("<%= relative_gemfile_path %>", __dir__) bundle_binstub = File.expand_path("bundle", __dir__) if File.file?(bundle_binstub) if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") load(bundle_binstub) else abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") end end require "rubygems" require "bundler/setup" load Gem.bin_path("<%= spec.name %>", "<%= executable %>") Executable.bundler (2,915 bytes)
#!/usr/bin/env <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %> # frozen_string_literal: true # # This file was generated by Bundler. # # The application '<%= executable %>' is installed as part of a gem, and # this file is here to facilitate running it. # require "rubygems" m = Module.new do module_function def invoked_as_script? File.expand_path($0) == File.expand_path(__FILE__) end def env_var_version ENV["BUNDLER_VERSION"] end def cli_arg_version return unless invoked_as_script? # don't want to hijack other binstubs return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update` bundler_version = nil update_index = nil ARGV.each_with_index do |a, i| if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN bundler_version = a end next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ bundler_version = $1 update_index = i end bundler_version end def gemfile gemfile = ENV["BUNDLE_GEMFILE"] return gemfile if gemfile && !gemfile.empty? File.expand_path("<%= relative_gemfile_path %>", __dir__) end def lockfile lockfile = case File.basename(gemfile) when "gems.rb" then gemfile.sub(/\.rb$/, ".locked") else "#{gemfile}.lock" end File.expand_path(lockfile) end def lockfile_version return unless File.file?(lockfile) lockfile_contents = File.read(lockfile) return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/ Regexp.last_match(1) end def bundler_requirement @bundler_requirement ||= env_var_version || cli_arg_version || bundler_requirement_for(lockfile_version) end def bundler_requirement_for(version) return "#{Gem::Requirement.default}.a" unless version bundler_gem_version = Gem::Version.new(version) bundler_gem_version.approximate_recommendation end def load_bundler! ENV["BUNDLE_GEMFILE"] ||= gemfile activate_bundler end def activate_bundler gem_error = activation_error_handling do gem "bundler", bundler_requirement end return if gem_error.nil? require_error = activation_error_handling do require "bundler/version" end return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION)) warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`" exit 42 end def activation_error_handling yield nil rescue StandardError, LoadError => e e end end m.load_bundler! if m.invoked_as_script? load Gem.bin_path("<%= spec.name %>", "<%= executable %>") end Executable.standalone (428 bytes)
#!/usr/bin/env <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %> # frozen_string_literal: true # # This file was generated by Bundler. # # The application '<%= executable %>' is installed as part of a gem, and # this file is here to facilitate running it. # $:.unshift File.expand_path "<%= standalone_path %>", __dir__ require "bundler/setup" load File.expand_path "<%= executable_path %>", __dir__ |
|
If you want so try to supply some magic for it, I will probably add it... Yes, it is quite complicated... |
Date Modified | Username | Field | Change |
---|---|---|---|
2023-09-02 16:58 | abathur | New Issue | |
2023-09-02 16:58 | abathur | File Added: Executable | |
2023-09-02 16:58 | abathur | File Added: Executable.bundler | |
2023-09-02 16:58 | abathur | File Added: Executable.standalone | |
2024-02-04 19:29 | christos | Assigned To | => christos |
2024-02-04 19:29 | christos | Status | new => assigned |
2024-02-04 19:30 | christos | Status | assigned => feedback |
2024-02-04 19:30 | christos | Note Added: 0004000 |