brew/Library/Homebrew/utils/shebang.rb

49 lines
1.3 KiB
Ruby
Raw Normal View History

# typed: strict
2020-03-27 13:04:10 +00:00
# frozen_string_literal: true
module Utils
2020-08-26 09:28:16 +02:00
# Helper functions for manipulating shebang lines.
2020-03-27 13:04:10 +00:00
module Shebang
2023-04-17 11:18:51 -07:00
module_function
2020-08-26 09:28:16 +02:00
# Specification on how to rewrite a given shebang.
2020-03-27 13:04:10 +00:00
class RewriteInfo
sig { returns(Regexp) }
attr_reader :regex
sig { returns(Integer) }
attr_reader :max_length
sig { returns(T.any(String, Pathname)) }
attr_reader :replacement
2020-03-27 13:04:10 +00:00
sig { params(regex: Regexp, max_length: Integer, replacement: T.any(String, Pathname)).void }
2020-03-27 13:04:10 +00:00
def initialize(regex, max_length, replacement)
@regex = T.let(regex, Regexp)
@max_length = T.let(max_length, Integer)
@replacement = T.let(replacement, T.any(String, Pathname))
2020-03-27 13:04:10 +00:00
end
end
2020-08-26 09:28:16 +02:00
# Rewrite shebang for the given `paths` using the given `rewrite_info`.
#
# ### Example
#
# ```ruby
# rewrite_shebang detected_python_shebang, bin/"script.py"
# ```
2020-08-26 09:28:16 +02:00
#
# @api public
2023-04-17 11:18:51 -07:00
sig { params(rewrite_info: RewriteInfo, paths: T.any(String, Pathname)).void }
def rewrite_shebang(rewrite_info, *paths)
2020-03-27 13:04:10 +00:00
paths.each do |f|
f = Pathname(f)
next unless f.file?
next unless rewrite_info.regex.match?(f.read(rewrite_info.max_length))
Utils::Inreplace.inreplace f.to_s, rewrite_info.regex, "#!#{rewrite_info.replacement}"
end
end
end
end