# typed: strict # frozen_string_literal: true require "system_command" module Utils # Helper functions for interacting with tar files. module Tar class << self include SystemCommand::Mixin TAR_FILE_EXTENSIONS = %w[.tar .tb2 .tbz .tbz2 .tgz .tlz .txz .tZ].freeze sig { returns(T::Boolean) } def available? executable.present? end sig { returns(T.nilable(Pathname)) } def executable return @executable if defined?(@executable) gnu_tar_gtar_path = HOMEBREW_PREFIX/"opt/gnu-tar/bin/gtar" gnu_tar_gtar = gnu_tar_gtar_path if gnu_tar_gtar_path.executable? @executable = T.let(which("gtar") || gnu_tar_gtar || which("tar"), T.nilable(Pathname)) end sig { params(path: T.any(Pathname, String)).void } def validate_file(path) return unless available? path = Pathname.new(path) return unless TAR_FILE_EXTENSIONS.include? path.extname stdout, _, status = system_command(executable, args: ["--list", "--file", path], print_stderr: false) odie "#{path} is not a valid tar file!" if !status.success? || stdout.blank? end sig { void } def clear_executable_cache remove_instance_variable(:@executable) if defined?(@executable) end end end end