thegates/app/scripts/sandbox/unzip.gd
2024-05-04 00:14:24 +04:00

38 lines
1.4 KiB
GDScript

extends Node
class_name UnZip
static func unzip(zip_path: String, to_folder: String, contains_symlink: bool = false) -> void:
var reader = ZIPReader.new()
var err = reader.open(zip_path)
if err != OK: Debug.logerr("Cannot open file %s to unzip" % [zip_path]); return
for path in reader.get_files():
if path.get_file().is_empty(): # is directory
DirAccess.make_dir_recursive_absolute(to_folder + "/" + path)
# Debug.logclr("makedir %s" % [to_folder + "/" + path], Color.DIM_GRAY)
else:
create_file(reader, path, to_folder, contains_symlink)
static func create_file(reader: ZIPReader, path: String, folder: String, contains_symlink: bool) -> void:
var data = reader.read_file(path)
var symlink = ""
if contains_symlink:
symlink = data.get_string_from_utf8()
if symlink.split("\n").size() != 1:
symlink = ""
if contains_symlink and symlink.is_absolute_path():
var link_to = ProjectSettings.globalize_path(folder + "/" + path.get_basename())
OS.execute("ln", ["-s", symlink, link_to])
# Debug.logclr("ln -s %s %s" % [symlink, link_to], Color.DIM_GRAY)
else:
var file_path = folder + "/" + path
var file = FileAccess.open(file_path, FileAccess.WRITE)
file.store_buffer(data)
file.close()
if file_path.get_extension() == "sh":
OS.execute("chmod", ["+x", ProjectSettings.globalize_path(file_path)])
# Debug.logclr("touch %s" % [folder + "/" + path], Color.DIM_GRAY)