# typed: true # rubocop:todo Sorbet/StrictSigil # frozen_string_literal: true require "context" module Homebrew extend Context def self._system(cmd, *args, **options) pid = fork do yield if block_given? args.map!(&:to_s) begin exec(cmd, *args, **options) rescue nil end exit! 1 # never gets here unless exec failed end Process.wait(T.must(pid)) $CHILD_STATUS.success? end def self.system(cmd, *args, **options) if verbose? out = (options[:out] == :err) ? $stderr : $stdout out.puts "#{cmd} #{args * " "}".gsub(RUBY_PATH, "ruby") .gsub($LOAD_PATH.join(File::PATH_SEPARATOR).to_s, "$LOAD_PATH") end _system(cmd, *args, **options) end # `Module` and `Regexp` are global variables used as types here so they don't need to be imported # rubocop:disable Style/GlobalVars sig { params(the_module: Module, pattern: Regexp).void } def self.inject_dump_stats!(the_module, pattern) @injected_dump_stat_modules ||= {} @injected_dump_stat_modules[the_module] ||= [] injected_methods = @injected_dump_stat_modules[the_module] the_module.module_eval do instance_methods.grep(pattern).each do |name| next if injected_methods.include? name method = instance_method(name) define_method(name) do |*args, &block| require "time" time = Time.now begin method.bind_call(self, *args, &block) ensure $times[name] ||= 0 $times[name] += Time.now - time end end end end return unless $times.nil? $times = {} at_exit do col_width = [$times.keys.map(&:size).max.to_i + 2, 15].max $times.sort_by { |_k, v| v }.each do |method, time| puts format("%-#{col_width}s %