46 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # 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
 | 
