From 3270e053705de1df51abda4fa56faee6888d9295 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 10 Apr 2024 00:55:24 +0800 Subject: [PATCH 1/2] improve archive --- core/xpack.lua | 16 +++++----------- .../action/require/impl/actions/download.lua | 4 +++- .../impl/actions/download_resources.lua | 3 ++- .../require/impl/actions/patch_sources.lua | 3 ++- xmake/modules/utils/archive/archive.lua | 19 ++++++++++++++++--- xmake/modules/utils/archive/extract.lua | 18 +++++++++++++++--- 6 files changed, 43 insertions(+), 20 deletions(-) diff --git a/core/xpack.lua b/core/xpack.lua index 94e21f7a269..4262ef1b5c4 100644 --- a/core/xpack.lua +++ b/core/xpack.lua @@ -48,18 +48,12 @@ xpack("xmake") local winenv_bindir = path.join(package:buildir(), "winenv", "bin") os.mkdir(winenv_bindir) http.download(url_7z, archive_7z, {insecure = global.get("insecure-ssl")}) - if archive.extract(archive_7z, tmpdir_7z) then - os.cp(path.join(tmpdir_7z, "*"), winenv_bindir) - else - raise("extract 7z.zip failed!") - end + archive.extract(archive_7z, tmpdir_7z) + os.cp(path.join(tmpdir_7z, "*"), winenv_bindir) http.download(url_curl, archive_curl, {insecure = global.get("insecure-ssl")}) - if archive.extract(archive_curl, tmpdir_curl) then - os.cp(path.join(tmpdir_curl, "*", "bin", "*.exe"), winenv_bindir) - os.cp(path.join(tmpdir_curl, "*", "bin", "*.crt"), winenv_bindir) - else - raise("extract curl.zip failed!") - end + archive.extract(archive_curl, tmpdir_curl) + os.cp(path.join(tmpdir_curl, "*", "bin", "*.exe"), winenv_bindir) + os.cp(path.join(tmpdir_curl, "*", "bin", "*.crt"), winenv_bindir) winenv = path.directory(winenv_bindir) package:add("installfiles", path.join(winenv, "**"), {rootdir = path.directory(winenv)}) end diff --git a/xmake/modules/private/action/require/impl/actions/download.lua b/xmake/modules/private/action/require/impl/actions/download.lua index 988461e3660..c90fc4646b4 100644 --- a/xmake/modules/private/action/require/impl/actions/download.lua +++ b/xmake/modules/private/action/require/impl/actions/download.lua @@ -211,7 +211,9 @@ function _download(package, url, sourcedir, opt) local sourcedir_tmp = sourcedir .. ".tmp" os.rm(sourcedir_tmp) local extension = archive.extension(packagefile) - if archive.extract(packagefile, sourcedir_tmp, {excludes = opt.url_excludes}) then + + local ok = try {function() archive.extract(packagefile, sourcedir_tmp, {excludes = opt.url_excludes}); return true end} + if ok then -- move to source directory and we skip it to avoid long path issues on windows if only one root directory os.rm(sourcedir) local filedirs = os.filedirs(path.join(sourcedir_tmp, "*")) diff --git a/xmake/modules/private/action/require/impl/actions/download_resources.lua b/xmake/modules/private/action/require/impl/actions/download_resources.lua index df87daf328e..048e4b2732e 100644 --- a/xmake/modules/private/action/require/impl/actions/download_resources.lua +++ b/xmake/modules/private/action/require/impl/actions/download_resources.lua @@ -135,7 +135,8 @@ function _download(package, resource_name, resource_url, resource_hash) local resourcedir_tmp = resourcedir .. ".tmp" os.tryrm(resourcedir_tmp) local extension = archive.extension(resource_file) - if archive.extract(resource_file, resourcedir_tmp) then + local ok = try {function() archive.extract(resource_file, resourcedir_tmp); return true end} + if ok then os.tryrm(resourcedir) os.mv(resourcedir_tmp, resourcedir) elseif extension and extension ~= "" then diff --git a/xmake/modules/private/action/require/impl/actions/patch_sources.lua b/xmake/modules/private/action/require/impl/actions/patch_sources.lua index a960d1bcbe5..bd5d698bdd2 100644 --- a/xmake/modules/private/action/require/impl/actions/patch_sources.lua +++ b/xmake/modules/private/action/require/impl/actions/patch_sources.lua @@ -107,7 +107,8 @@ function _patch(package, patchinfo) local patchdir = patch_file .. ".dir" local patchdir_tmp = patchdir .. ".tmp" os.tryrm(patchdir_tmp) - if archive.extract(patch_file, patchdir_tmp) then + local ok = try {function() archive.extract(patch_file, patchdir_tmp); return true end} + if ok then os.tryrm(patchdir) os.mv(patchdir_tmp, patchdir) else diff --git a/xmake/modules/utils/archive/archive.lua b/xmake/modules/utils/archive/archive.lua index d2120336859..59933ae6838 100644 --- a/xmake/modules/utils/archive/archive.lua +++ b/xmake/modules/utils/archive/archive.lua @@ -281,12 +281,25 @@ end -- archive archive file using archivers function _archive(archivefile, inputfiles, extension, archivers, opt) + local errors for _, archive in ipairs(archivers) do - if archive(archivefile, inputfiles, extension, opt) then - return true + local ok = try { + function () + return archive(archivefile, inputfiles, extension, opt) + end, + catch { + function (errs) + if errs then + errors = tostring(errs) + end + end + } + } + if ok then + return end end - return false + raise("cannot archive %s, %s!", path.filename(archivefile), errors or "archivers not found!") end -- only archive tar file diff --git a/xmake/modules/utils/archive/extract.lua b/xmake/modules/utils/archive/extract.lua index 6df173bff9d..b046dafd4f5 100644 --- a/xmake/modules/utils/archive/extract.lua +++ b/xmake/modules/utils/archive/extract.lua @@ -373,13 +373,25 @@ end -- extract archive file using extractors function _extract(archivefile, outputdir, extension, extractors, opt) + local errors for _, extract in ipairs(extractors) do - local ok = try {function () return extract(archivefile, outputdir, extension, opt) end} + local ok = try { + function () + return extract(archivefile, outputdir, extension, opt) + end, + catch { + function (errs) + if errs then + errors = tostring(errs) + end + end + } + } if ok then - return true + return end end - return false + raise("cannot extract %s, %s!", path.filename(archivefile), errors or "extractors not found!") end -- extract archive file From bcc361fcee9277dedfdcdd031d058c4de5322c73 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 10 Apr 2024 22:42:38 +0800 Subject: [PATCH 2/2] fix archive --- .../private/action/require/impl/actions/download.lua | 1 - xmake/modules/utils/archive/archive.lua | 8 ++------ xmake/modules/utils/archive/extract.lua | 8 ++------ 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/xmake/modules/private/action/require/impl/actions/download.lua b/xmake/modules/private/action/require/impl/actions/download.lua index c90fc4646b4..060f7303b43 100644 --- a/xmake/modules/private/action/require/impl/actions/download.lua +++ b/xmake/modules/private/action/require/impl/actions/download.lua @@ -211,7 +211,6 @@ function _download(package, url, sourcedir, opt) local sourcedir_tmp = sourcedir .. ".tmp" os.rm(sourcedir_tmp) local extension = archive.extension(packagefile) - local ok = try {function() archive.extract(packagefile, sourcedir_tmp, {excludes = opt.url_excludes}); return true end} if ok then -- move to source directory and we skip it to avoid long path issues on windows if only one root directory diff --git a/xmake/modules/utils/archive/archive.lua b/xmake/modules/utils/archive/archive.lua index 59933ae6838..f91aa9d7f23 100644 --- a/xmake/modules/utils/archive/archive.lua +++ b/xmake/modules/utils/archive/archive.lua @@ -296,7 +296,7 @@ function _archive(archivefile, inputfiles, extension, archivers, opt) } } if ok then - return + return true end end raise("cannot archive %s, %s!", path.filename(archivefile), errors or "archivers not found!") @@ -319,12 +319,8 @@ end -- @param options the options, e.g.. {curdir = "/tmp", recurse = true, compress = "fastest|faster|default|better|best", excludes = {"*/dir/*", "dir/*"}} -- function main(archivefile, inputfiles, opt) - - -- init inputfiles - inputfiles = inputfiles or os.curdir() - - -- init options opt = opt or {} + inputfiles = inputfiles or os.curdir() if opt.recurse == nil then opt.recurse = true end diff --git a/xmake/modules/utils/archive/extract.lua b/xmake/modules/utils/archive/extract.lua index b046dafd4f5..604899300ef 100644 --- a/xmake/modules/utils/archive/extract.lua +++ b/xmake/modules/utils/archive/extract.lua @@ -388,7 +388,7 @@ function _extract(archivefile, outputdir, extension, extractors, opt) } } if ok then - return + return true end end raise("cannot extract %s, %s!", path.filename(archivefile), errors or "extractors not found!") @@ -401,12 +401,8 @@ end -- @param options the options, e.g.. {excludes = {"*/dir/*", "dir/*"}} -- function main(archivefile, outputdir, opt) - - -- init outputdir - outputdir = outputdir or os.curdir() - - -- init options opt = opt or {} + outputdir = outputdir or os.curdir() -- init extractors local extractors