Merge pull request #4479 from reitermarkus/refactor-containers
Change `Container::me?` to `Container::can_extract?`.
This commit is contained in:
commit
7cc3c2a846
@ -21,7 +21,7 @@ module Hbc
|
||||
end
|
||||
|
||||
def extract(command: nil, verbose: nil, **_)
|
||||
container = Container.for_path(path, command)
|
||||
container = Container.for_path(path)
|
||||
|
||||
unless container
|
||||
raise CaskError, "Aw dang, could not identify nested container at '#{source}'"
|
||||
|
||||
@ -6,6 +6,7 @@ require "hbc/container/bzip2"
|
||||
require "hbc/container/cab"
|
||||
require "hbc/container/criteria"
|
||||
require "hbc/container/dmg"
|
||||
require "hbc/container/self_extracting_executable"
|
||||
require "hbc/container/executable"
|
||||
require "hbc/container/generic_unar"
|
||||
require "hbc/container/gpg"
|
||||
@ -32,6 +33,7 @@ module Hbc
|
||||
Ttf,
|
||||
Otf,
|
||||
Air,
|
||||
SelfExtractingExecutable,
|
||||
Cab,
|
||||
Dmg,
|
||||
SevenZip,
|
||||
@ -53,12 +55,18 @@ module Hbc
|
||||
# Hbc::Container::GenericUnar
|
||||
end
|
||||
|
||||
def self.for_path(path, command)
|
||||
def self.for_path(path)
|
||||
odebug "Determining which containers to use based on filetype"
|
||||
criteria = Criteria.new(path, command)
|
||||
|
||||
magic_number = if path.directory?
|
||||
""
|
||||
else
|
||||
File.binread(path, 262) || ""
|
||||
end
|
||||
|
||||
autodetect_containers.find do |c|
|
||||
odebug "Checking container class #{c}"
|
||||
c.me?(criteria)
|
||||
c.can_extract?(path: path, magic_number: magic_number)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -3,8 +3,8 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class Air < Base
|
||||
def self.me?(criteria)
|
||||
criteria.path.extname == ".air"
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
path.extname == ".air"
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -34,7 +34,7 @@ module Hbc
|
||||
end
|
||||
|
||||
def extract_nested_container(source)
|
||||
container = Container.for_path(source, @command)
|
||||
container = Container.for_path(source)
|
||||
|
||||
return false unless container
|
||||
|
||||
|
||||
@ -3,8 +3,8 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class Bzip2 < Base
|
||||
def self.me?(criteria)
|
||||
criteria.magic_number(/\ABZh/n)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
magic_number.match?(/\ABZh/n)
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -3,8 +3,8 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class Cab < Base
|
||||
def self.me?(criteria)
|
||||
criteria.magic_number(/\A(MSCF|MZ)/n)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
magic_number.match?(/\A(MSCF|MZ)/n)
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -5,11 +5,13 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class Dmg < Base
|
||||
def self.me?(criteria)
|
||||
!criteria.command.run("/usr/bin/hdiutil",
|
||||
# realpath is a failsafe against unusual filenames
|
||||
args: ["imageinfo", Pathname.new(criteria.path).realpath],
|
||||
print_stderr: false).stdout.empty?
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
imageinfo = SystemCommand.run("/usr/bin/hdiutil",
|
||||
# realpath is a failsafe against unusual filenames
|
||||
args: ["imageinfo", path.realpath],
|
||||
print_stderr: false).stdout
|
||||
|
||||
!imageinfo.empty?
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -4,11 +4,11 @@ require "vendor/macho/macho"
|
||||
module Hbc
|
||||
class Container
|
||||
class Executable < Naked
|
||||
def self.me?(criteria)
|
||||
return true if criteria.magic_number(/\A#!\s*\S+/n)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
return true if magic_number.match?(/\A#!\s*\S+/n)
|
||||
|
||||
begin
|
||||
criteria.path.file? && MachO.open(criteria.path).header.executable?
|
||||
path.file? && MachO.open(path).header.executable?
|
||||
rescue MachO::MagicError
|
||||
false
|
||||
end
|
||||
|
||||
@ -3,7 +3,7 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class GenericUnar < Base
|
||||
def self.me?(_criteria)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
false
|
||||
end
|
||||
|
||||
|
||||
@ -3,8 +3,8 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class Gpg < Base
|
||||
def self.me?(criteria)
|
||||
criteria.extension(/^(gpg)$/)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
path.extname == ".gpg"
|
||||
end
|
||||
|
||||
def import_key
|
||||
|
||||
@ -3,8 +3,8 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class Gzip < Base
|
||||
def self.me?(criteria)
|
||||
criteria.magic_number(/\A\037\213/n)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
magic_number.match?(/\A\037\213/n)
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -3,8 +3,8 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class Lzma < Base
|
||||
def self.me?(criteria)
|
||||
criteria.magic_number(/\A\]\000\000\200\000/n)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
magic_number.match?(/\A\]\000\000\200\000/n)
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -3,10 +3,7 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class Naked < Base
|
||||
# Either inherit from this class and override with self.me?(criteria),
|
||||
# or use this class directly as "container type: :naked",
|
||||
# in which case self.me? is not called.
|
||||
def self.me?(*)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
false
|
||||
end
|
||||
|
||||
|
||||
@ -3,8 +3,8 @@ require "hbc/container/naked"
|
||||
module Hbc
|
||||
class Container
|
||||
class Otf < Naked
|
||||
def self.me?(criteria)
|
||||
criteria.magic_number(/\AOTTO/n)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
magic_number.match?(/\AOTTO/n)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -3,9 +3,9 @@ require "hbc/container/naked"
|
||||
module Hbc
|
||||
class Container
|
||||
class Pkg < Naked
|
||||
def self.me?(criteria)
|
||||
criteria.extension(/m?pkg$/) &&
|
||||
(criteria.path.directory? || criteria.magic_number(/\Axar!/n))
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
path.extname.match?(/\A.m?pkg\Z/) &&
|
||||
(path.directory? || magic_number.match?(/\Axar!/n))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -3,9 +3,8 @@ require "hbc/container/generic_unar"
|
||||
module Hbc
|
||||
class Container
|
||||
class Rar
|
||||
def self.me?(criteria)
|
||||
criteria.magic_number(/\ARar!/n) &&
|
||||
super
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
magic_number.match?(/\ARar!/n)
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -0,0 +1,15 @@
|
||||
require "hbc/container/generic_unar"
|
||||
|
||||
module Hbc
|
||||
class Container
|
||||
class SelfExtractingExecutable < GenericUnar
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
return false unless magic_number.match?(/\AMZ/n)
|
||||
|
||||
SystemCommand.run("file",
|
||||
args: [path],
|
||||
print_stderr: false).stdout.include?("self-extracting")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -2,9 +2,9 @@ require "hbc/container/generic_unar"
|
||||
|
||||
module Hbc
|
||||
class Container
|
||||
class SevenZip < GenericUnar
|
||||
def self.me?(criteria)
|
||||
criteria.magic_number(/\A7z\xBC\xAF\x27\x1C/n)
|
||||
class SevenZip
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
magic_number.match?(/\A7z\xBC\xAF\x27\x1C/n)
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -3,8 +3,8 @@ require "hbc/container/generic_unar"
|
||||
module Hbc
|
||||
class Container
|
||||
class Sit < GenericUnar
|
||||
def self.me?(criteria)
|
||||
criteria.magic_number(/\AStuffIt/n)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
magic_number.match?(/\AStuffIt/n)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
module Hbc
|
||||
class Container
|
||||
class SvnRepository < Base
|
||||
def self.me?(criteria)
|
||||
criteria.path.join(".svn").directory?
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
(path/".svn").directory?
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -3,10 +3,13 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class Tar < Base
|
||||
def self.me?(criteria)
|
||||
criteria.magic_number(/\A.{257}ustar/n) ||
|
||||
# or compressed tar (bzip2/gzip/lzma/xz)
|
||||
IO.popen(["/usr/bin/tar", "-t", "-f", criteria.path.to_s], err: File::NULL) { |io| !io.read(1).nil? }
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
return true if magic_number.match?(/\A.{257}ustar/n)
|
||||
|
||||
# Check if `tar` can list the contents, then it can also extract it.
|
||||
IO.popen(["tar", "tf", path], err: File::NULL) do |stdout|
|
||||
!stdout.read(1).nil?
|
||||
end
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -3,11 +3,11 @@ require "hbc/container/naked"
|
||||
module Hbc
|
||||
class Container
|
||||
class Ttf < Naked
|
||||
def self.me?(criteria)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
# TrueType Font
|
||||
criteria.magic_number(/\A\000\001\000\000\000/n) ||
|
||||
magic_number.match?(/\A\000\001\000\000\000/n) ||
|
||||
# Truetype Font Collection
|
||||
criteria.magic_number(/\Attcf/n)
|
||||
magic_number.match?(/\Attcf/n)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -3,8 +3,8 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class Xar < Base
|
||||
def self.me?(criteria)
|
||||
criteria.magic_number(/\Axar!/n)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
magic_number.match?(/\Axar!/n)
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -3,8 +3,8 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class Xz < Base
|
||||
def self.me?(criteria)
|
||||
criteria.magic_number(/\A\xFD7zXZ\x00/n)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
magic_number.match?(/\A\xFD7zXZ\x00/n)
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -3,8 +3,8 @@ require "hbc/container/base"
|
||||
module Hbc
|
||||
class Container
|
||||
class Zip < Base
|
||||
def self.me?(criteria)
|
||||
criteria.magic_number(/\APK(\003\004|\005\006)/n)
|
||||
def self.can_extract?(path:, magic_number:)
|
||||
magic_number.match?(/\APK(\003\004|\005\006)/n)
|
||||
end
|
||||
|
||||
def extract
|
||||
|
||||
@ -149,7 +149,7 @@ module Hbc
|
||||
container = if @cask.container&.type
|
||||
Container.from_type(@cask.container.type)
|
||||
else
|
||||
Container.for_path(@downloaded_path, @command)
|
||||
Container.for_path(@downloaded_path)
|
||||
end
|
||||
|
||||
container&.new(@cask, @downloaded_path, @command, verbose: verbose?)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user