Refactor staging step for download strategies.
This commit is contained in:
parent
0c38ceb6f6
commit
abd855bdad
@ -90,20 +90,6 @@ class AbstractDownloadStrategy
|
|||||||
def quiet_safe_system(*args)
|
def quiet_safe_system(*args)
|
||||||
safe_system(*expand_safe_system_args(args))
|
safe_system(*expand_safe_system_args(args))
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def xzpath
|
|
||||||
"#{HOMEBREW_PREFIX}/opt/xz/bin/xz"
|
|
||||||
end
|
|
||||||
|
|
||||||
def lzippath
|
|
||||||
"#{HOMEBREW_PREFIX}/opt/lzip/bin/lzip"
|
|
||||||
end
|
|
||||||
|
|
||||||
def lhapath
|
|
||||||
"#{HOMEBREW_PREFIX}/opt/lha/bin/lha"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class VCSDownloadStrategy < AbstractDownloadStrategy
|
class VCSDownloadStrategy < AbstractDownloadStrategy
|
||||||
@ -191,43 +177,47 @@ end
|
|||||||
|
|
||||||
class AbstractFileDownloadStrategy < AbstractDownloadStrategy
|
class AbstractFileDownloadStrategy < AbstractDownloadStrategy
|
||||||
def stage
|
def stage
|
||||||
case type = cached_location.compression_type
|
path = cached_location
|
||||||
|
unpack_dir = Pathname.pwd
|
||||||
|
|
||||||
|
case type = path.compression_type
|
||||||
when :zip
|
when :zip
|
||||||
quiet_safe_system "unzip", "-qq", cached_location
|
safe_system "unzip", "-qq", path, "-d", unpack_dir
|
||||||
chdir
|
chdir
|
||||||
when :gzip_only
|
when :gzip_only
|
||||||
buffered_write "gunzip"
|
FileUtils.cp path, unpack_dir, preserve: true
|
||||||
|
safe_system "gunzip", "-q", "-N", unpack_dir/path.basename
|
||||||
when :bzip2_only
|
when :bzip2_only
|
||||||
buffered_write "bunzip2"
|
FileUtils.cp path, unpack_dir, preserve: true
|
||||||
|
safe_system "bunzip2", "-q", unpack_dir/path.basename
|
||||||
when :gzip, :bzip2, :xz, :compress, :tar
|
when :gzip, :bzip2, :xz, :compress, :tar
|
||||||
tar_flags = "x"
|
|
||||||
if type == :gzip
|
|
||||||
tar_flags << "z"
|
|
||||||
elsif type == :bzip2
|
|
||||||
tar_flags << "j"
|
|
||||||
elsif type == :xz
|
|
||||||
tar_flags << "J"
|
|
||||||
end
|
|
||||||
tar_flags << "f"
|
|
||||||
if type == :xz && DependencyCollector.tar_needs_xz_dependency?
|
if type == :xz && DependencyCollector.tar_needs_xz_dependency?
|
||||||
pipe_to_tar xzpath
|
pipe_to_tar "#{HOMEBREW_PREFIX}/opt/xz/bin/xz", unpack_dir
|
||||||
else
|
else
|
||||||
safe_system "tar", tar_flags, cached_location
|
flags = if type == :gzip
|
||||||
|
["-z"]
|
||||||
|
elsif type == :bzip2
|
||||||
|
["-j"]
|
||||||
|
elsif type == :xz
|
||||||
|
["-J"]
|
||||||
|
end
|
||||||
|
|
||||||
|
safe_system "tar", "-x", *flags, "-f", path, "-C", unpack_dir
|
||||||
end
|
end
|
||||||
chdir
|
chdir
|
||||||
when :lzip
|
when :lzip
|
||||||
pipe_to_tar lzippath
|
pipe_to_tar "#{HOMEBREW_PREFIX}/opt/lzip/bin/lzip", unpack_dir
|
||||||
chdir
|
chdir
|
||||||
when :lha
|
when :lha
|
||||||
safe_system lhapath, "x", cached_location
|
safe_system "#{HOMEBREW_PREFIX}/opt/lha/bin/lha", "xq2w=#{unpack_dir}", path
|
||||||
when :xar
|
when :xar
|
||||||
safe_system "/usr/bin/xar", "-xf", cached_location
|
safe_system "xar", "-x", "-f", path, "-C", unpack_dir
|
||||||
when :rar
|
when :rar
|
||||||
quiet_safe_system "unrar", "x", "-inul", cached_location
|
safe_system "unrar", "x", "-inul", path, unpack_dir
|
||||||
when :p7zip
|
when :p7zip
|
||||||
safe_system "7zr", "x", cached_location
|
safe_system "7zr", "x", "-y", "-bd", "-bso0", path, "-o#{unpack_dir}"
|
||||||
else
|
else
|
||||||
cp cached_location, basename_without_params, preserve: true
|
cp path, unpack_dir/basename_without_params, preserve: true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -245,29 +235,17 @@ class AbstractFileDownloadStrategy < AbstractDownloadStrategy
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def pipe_to_tar(tool)
|
def pipe_to_tar(tool, unpack_dir)
|
||||||
Utils.popen_read(tool, "-dc", cached_location.to_s) do |rd|
|
path = cached_location
|
||||||
Utils.popen_write("tar", "xf", "-") do |wr|
|
|
||||||
|
Utils.popen_read(tool, "-dc", path) do |rd|
|
||||||
|
Utils.popen_write("tar", "-x", "-f", "-", "-C", unpack_dir) do |wr|
|
||||||
buf = ""
|
buf = ""
|
||||||
wr.write(buf) while rd.read(16384, buf)
|
wr.write(buf) while rd.read(16384, buf)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# gunzip and bunzip2 write the output file in the same directory as the input
|
|
||||||
# file regardless of the current working directory, so we need to write it to
|
|
||||||
# the correct location ourselves.
|
|
||||||
def buffered_write(tool)
|
|
||||||
target = File.basename(basename_without_params, cached_location.extname)
|
|
||||||
|
|
||||||
Utils.popen_read(tool, "-f", cached_location.to_s, "-c") do |pipe|
|
|
||||||
File.open(target, "wb") do |f|
|
|
||||||
buf = ""
|
|
||||||
f.write(buf) while pipe.read(16384, buf)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def basename_without_params
|
def basename_without_params
|
||||||
# Strip any ?thing=wad out of .c?thing=wad style extensions
|
# Strip any ?thing=wad out of .c?thing=wad style extensions
|
||||||
File.basename(@url)[/[^?]+/]
|
File.basename(@url)[/[^?]+/]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user