79 lines
2.2 KiB
Ruby
79 lines
2.2 KiB
Ruby
module Ark
|
|
class SevenZipCommandBuilder
|
|
def unpack
|
|
sevenzip_command
|
|
end
|
|
|
|
def dump
|
|
sevenzip_command_builder(resource.path, 'e')
|
|
end
|
|
|
|
def cherry_pick
|
|
"#{sevenzip_command_builder(resource.path, 'x')} -r #{resource.creates}"
|
|
end
|
|
|
|
def initialize(resource)
|
|
@resource = resource
|
|
end
|
|
|
|
private
|
|
|
|
attr_reader :resource
|
|
|
|
def node
|
|
resource.run_context.node
|
|
end
|
|
|
|
def sevenzip_command
|
|
if resource.strip_components <= 0
|
|
return sevenzip_command_builder(resource.path, 'x')
|
|
end
|
|
|
|
tmpdir = make_temp_directory.tr('/', '\\')
|
|
cmd = sevenzip_command_builder(tmpdir, 'x')
|
|
|
|
cmd += ' && '
|
|
currdir = tmpdir
|
|
|
|
1.upto(resource.strip_components).each do |count|
|
|
cmd += "for /f %#{count} in ('dir /ad /b \"#{currdir}\"') do "
|
|
currdir += "\\%#{count}"
|
|
end
|
|
|
|
cmd += "(\"#{ENV.fetch('SystemRoot')}\\System32\\robocopy\" \"#{currdir}\" \"#{resource.path}\" /s /e) ^& IF %ERRORLEVEL% LEQ 3 cmd /c exit 0"
|
|
end
|
|
|
|
def sevenzip_binary
|
|
@tar_binary ||= "\"#{(node['ark']['sevenzip_binary'] || sevenzip_path_from_registry)}\""
|
|
end
|
|
|
|
def sevenzip_path_from_registry
|
|
begin
|
|
basepath = ::Win32::Registry::HKEY_LOCAL_MACHINE.open('SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\7zFM.exe').read_s('Path')
|
|
|
|
# users like pretty errors
|
|
rescue ::Win32::Registry::Error
|
|
raise 'Failed to find the path of 7zip binary by searching checking HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\7zFM.exe\Path. Make sure to install 7zip before using this resource. If 7zip is installed and you still receive this message you can also specify the 7zip binary path by setting node["ark"]["sevenzip_binary"]'
|
|
end
|
|
"#{basepath}7z.exe"
|
|
end
|
|
|
|
def sevenzip_command_builder(dir, command)
|
|
"#{sevenzip_binary} #{command} \"#{resource.release_file}\"#{extension_is_tar} -o\"#{dir}\" -uy"
|
|
end
|
|
|
|
def extension_is_tar
|
|
if resource.extension =~ /tar.gz|tgz|tar.bz2|tbz|tar.xz|txz/
|
|
" -so | #{sevenzip_binary} x -aoa -si -ttar"
|
|
else
|
|
' -aoa' # force overwrite, Fixes #164
|
|
end
|
|
end
|
|
|
|
def make_temp_directory
|
|
require 'tmpdir'
|
|
Dir.mktmpdir
|
|
end
|
|
end
|
|
end
|