2020-10-10 14:16:11 +02:00
|
|
|
# typed: true
|
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
|
|
|
|
attr_reader :regex, :max_length, :replacement
|
|
|
|
|
2020-11-17 03:54:31 +01: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 = regex
|
|
|
|
@max_length = max_length
|
|
|
|
@replacement = replacement
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-08-26 09:28:16 +02:00
|
|
|
# Rewrite shebang for the given `paths` using the given `rewrite_info`.
|
|
|
|
#
|
|
|
|
# @example
|
|
|
|
# rewrite_shebang detected_python_shebang, bin/"script.py"
|
|
|
|
#
|
|
|
|
# @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
|