From 370e61e5046659299f9702d84cdd0c919726386b Mon Sep 17 00:00:00 2001 From: Sam Ford <1584702+samford@users.noreply.github.com> Date: Mon, 14 Aug 2023 20:22:47 -0400 Subject: [PATCH] perl: refactor to align Shebang modules This primarily reworks `Language::Perl::Shebang` to use constants for the shebang regex and max length (like the previous Node commit) and to extract the `RewriteInfo` call into a separate method (like Python and Node). Besides that, this also adds type signatures to the methods. --- Library/Homebrew/language/perl.rb | 37 ++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/Library/Homebrew/language/perl.rb b/Library/Homebrew/language/perl.rb index c9b1775cef..45829a7e8c 100644 --- a/Library/Homebrew/language/perl.rb +++ b/Library/Homebrew/language/perl.rb @@ -10,24 +10,35 @@ module Language module Shebang module_function - def detected_perl_shebang(formula = self) - perl_deps = formula.declared_deps.select { |dep| dep.name == "perl" } - perl_path = if perl_deps.present? - if perl_deps.any? { |dep| !dep.uses_from_macos? || !dep.use_macos_install? } - Formula["perl"].opt_bin/"perl" - else - "/usr/bin/perl#{MacOS.preferred_perl_version}" - end - else - raise ShebangDetectionError.new("Perl", "formula does not depend on Perl") - end + # A regex to match potential shebang permutations. + PERL_SHEBANG_REGEX = %r{^#! ?/usr/bin/(?:env )?perl( |$)}.freeze + # The length of the longest shebang matching `SHEBANG_REGEX`. + PERL_SHEBANG_MAX_LENGTH = "#! /usr/bin/env perl ".length + + # @private + sig { params(perl_path: T.any(String, Pathname)).returns(Utils::Shebang::RewriteInfo) } + def perl_shebang_rewrite_info(perl_path) Utils::Shebang::RewriteInfo.new( - %r{^#! ?/usr/bin/(?:env )?perl( |$)}, - 21, # the length of "#! /usr/bin/env perl " + PERL_SHEBANG_REGEX, + PERL_SHEBANG_MAX_LENGTH, "#{perl_path}\\1", ) end + + sig { params(formula: T.untyped).returns(Utils::Shebang::RewriteInfo) } + def detected_perl_shebang(formula = self) + perl_deps = formula.declared_deps.select { |dep| dep.name == "perl" } + raise ShebangDetectionError.new("Perl", "formula does not depend on Perl") if perl_deps.empty? + + perl_path = if perl_deps.any? { |dep| !dep.uses_from_macos? || !dep.use_macos_install? } + Formula["perl"].opt_bin/"perl" + else + "/usr/bin/perl#{MacOS.preferred_perl_version}" + end + + perl_shebang_rewrite_info(perl_path) + end end end end