diff options
| author | ruki <[email protected]> | 2024-04-10 15:36:35 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-04-10 15:36:35 +0800 |
| commit | b559b4c1591e448b0f3faaa5928fc79e8286b8c3 (patch) | |
| tree | 786d95287a8a7bb665f5830e47ae3f3fd71b67b2 | |
| parent | 7e7b37e4f776e76d9a88b38f6419ff5c95923ef4 (diff) | |
| parent | bcc361fcee9277dedfdcdd031d058c4de5322c73 (diff) | |
Merge pull request #4956 from xmake-io/archive
Improve archive
| -rw-r--r-- | core/xpack.lua | 16 | ||||
| -rw-r--r-- | xmake/modules/private/action/require/impl/actions/download.lua | 3 | ||||
| -rw-r--r-- | xmake/modules/private/action/require/impl/actions/download_resources.lua | 3 | ||||
| -rw-r--r-- | xmake/modules/private/action/require/impl/actions/patch_sources.lua | 3 | ||||
| -rw-r--r-- | xmake/modules/utils/archive/archive.lua | 23 | ||||
| -rw-r--r-- | xmake/modules/utils/archive/extract.lua | 22 |
6 files changed, 42 insertions, 28 deletions
diff --git a/core/xpack.lua b/core/xpack.lua index 94e21f7a2..4262ef1b5 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 988461e36..060f7303b 100644 --- a/xmake/modules/private/action/require/impl/actions/download.lua +++ b/xmake/modules/private/action/require/impl/actions/download.lua @@ -211,7 +211,8 @@ 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 df87daf32..048e4b273 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 a960d1bcb..bd5d698bd 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 d21203368..f91aa9d7f 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 + 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 true end end - return false + raise("cannot archive %s, %s!", path.filename(archivefile), errors or "archivers not found!") end -- only archive tar file @@ -306,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 6df173bff..604899300 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 end end - return false + raise("cannot extract %s, %s!", path.filename(archivefile), errors or "extractors not found!") end -- extract archive file @@ -389,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 |
