summaryrefslogtreecommitdiff
path: root/xmake/modules/utils/archive/extract.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2018-09-28 00:09:43 +0800
committerruki <[email protected]>2018-09-27 18:58:19 +0800
commit8607468bbf60fd6deb6da8f984b7a3135979adeb (patch)
tree6708b2f832ac29774b5e658911d1e29d1745dfe4 /xmake/modules/utils/archive/extract.lua
parent1aef7b0dcf8d8fa744f2a91e9711da39a78910e3 (diff)
excludes files for archive.extract
Diffstat (limited to 'xmake/modules/utils/archive/extract.lua')
-rw-r--r--xmake/modules/utils/archive/extract.lua59
1 files changed, 46 insertions, 13 deletions
diff --git a/xmake/modules/utils/archive/extract.lua b/xmake/modules/utils/archive/extract.lua
index 720f179b6..90efe06db 100644
--- a/xmake/modules/utils/archive/extract.lua
+++ b/xmake/modules/utils/archive/extract.lua
@@ -31,7 +31,7 @@ import("detect.tools.find_gzip")
import("detect.tools.find_unzip")
-- extract archivefile using tar
-function _extract_using_tar(archivefile, outputdir, extension)
+function _extract_using_tar(archivefile, outputdir, extension, opt)
-- the tar of winenv can only extract "*.tar"
if os.host() == "windows" and extension ~= ".tar" then
@@ -45,7 +45,7 @@ function _extract_using_tar(archivefile, outputdir, extension)
end
-- init argv
- local argv = {ifelse(option.get("verbose"), "-xvf", "-xf"), archivefile}
+ local argv = {option.get("verbose") and "-xvf" or "-xf", archivefile}
-- ensure output directory
if not os.isdir(outputdir) then
@@ -56,6 +56,14 @@ function _extract_using_tar(archivefile, outputdir, extension)
table.insert(argv, "-C")
table.insert(argv, outputdir)
+ -- excludes files
+ if opt.excludes then
+ table.insert(argv, "--exclude")
+ for _, exclude in ipairs(opt.excludes) do
+ table.insert(argv, exclude)
+ end
+ end
+
-- extract it
os.vrunv(program, argv)
@@ -64,7 +72,7 @@ function _extract_using_tar(archivefile, outputdir, extension)
end
-- extract archivefile using 7z
-function _extract_using_7z(archivefile, outputdir, extension)
+function _extract_using_7z(archivefile, outputdir, extension, opt)
-- find 7z
local program = find_7z()
@@ -80,7 +88,7 @@ function _extract_using_7z(archivefile, outputdir, extension)
end
-- init argv
- local argv = {"x", "-y", ifelse(option.get("verbose"), "-bb3", "-bb0"), archivefile}
+ local argv = {"x", "-y", option.get("verbose") and "-bb3" or "-bb0", archivefile}
-- ensure output directory
if not os.isdir(outputdir) then
@@ -90,14 +98,27 @@ function _extract_using_7z(archivefile, outputdir, extension)
-- set outputdir
table.insert(argv, "-o" .. outputdir)
+ -- excludes files
+ local excludesfile = nil
+ if opt.excludes and not outputdir_old then
+ excludesfile = os.tmpfile()
+ io.writefile(excludesfile, table.concat(opt.excludes, '\n'))
+ table.insert(argv, "-xr@" .. excludesfile)
+ end
+
-- extract it
os.vrunv(program, argv)
+ -- remove the excludes file
+ if excludesfile then
+ os.tryrm(excludesfile)
+ end
+
-- continue to extract *.tar file
if outputdir_old then
local tarfile = find_file("*.tar", outputdir)
if tarfile and os.isfile(tarfile) then
- return _extract(tarfile, outputdir_old, ".tar", {_extract_using_tar, _extract_using_7z})
+ return _extract(tarfile, outputdir_old, ".tar", {_extract_using_tar, _extract_using_7z}, opt)
end
end
@@ -106,7 +127,7 @@ function _extract_using_7z(archivefile, outputdir, extension)
end
-- extract archivefile using gzip
-function _extract_using_gzip(archivefile, outputdir, extension)
+function _extract_using_gzip(archivefile, outputdir, extension, opt)
-- find gzip
local program = find_gzip()
@@ -154,7 +175,7 @@ function _extract_using_gzip(archivefile, outputdir, extension)
if outputdir_old then
local tarfile = find_file("*.tar", outputdir)
if tarfile and os.isfile(tarfile) then
- return _extract(tarfile, outputdir_old, ".tar", {_extract_using_tar, _extract_using_7z})
+ return _extract(tarfile, outputdir_old, ".tar", {_extract_using_tar, _extract_using_7z}, opt)
end
end
@@ -163,7 +184,7 @@ function _extract_using_gzip(archivefile, outputdir, extension)
end
-- extract archivefile using unzip
-function _extract_using_unzip(archivefile, outputdir, extension)
+function _extract_using_unzip(archivefile, outputdir, extension, opt)
-- find unzip
local program = find_unzip()
@@ -194,6 +215,14 @@ function _extract_using_unzip(archivefile, outputdir, extension)
table.insert(argv, "-d")
table.insert(argv, outputdir)
+ -- excludes files
+ if opt.excludes and not outputdir_old then
+ table.insert(argv, "-x")
+ for _, exclude in ipairs(opt.excludes) do
+ table.insert(argv, exclude)
+ end
+ end
+
-- extract it
os.vrunv(program, argv)
@@ -201,7 +230,7 @@ function _extract_using_unzip(archivefile, outputdir, extension)
if outputdir_old then
local tarfile = find_file("*.tar", outputdir)
if tarfile and os.isfile(tarfile) then
- return _extract(tarfile, outputdir_old, ".tar", {_extract_using_tar, _extract_using_7z})
+ return _extract(tarfile, outputdir_old, ".tar", {_extract_using_tar, _extract_using_7z}, opt)
end
end
@@ -210,11 +239,11 @@ function _extract_using_unzip(archivefile, outputdir, extension)
end
-- extract archive file using extractors
-function _extract(archivefile, outputdir, extension, extractors)
+function _extract(archivefile, outputdir, extension, extractors, opt)
-- extract it
for _, extract in ipairs(extractors) do
- if extract(archivefile, outputdir, extension) then
+ if extract(archivefile, outputdir, extension, opt) then
return true
end
end
@@ -250,12 +279,16 @@ end
--
-- @param archivefile the archive file. e.g. *.tar.gz, *.zip, *.7z, *.tar.bz2, ..
-- @param outputdir the output directory
+-- @param options the options, .e.g. {excludes = {"*/dir/*", "dir/*"}}
--
-function main(archivefile, outputdir)
+function main(archivefile, outputdir, opt)
-- init outputdir
outputdir = outputdir or os.curdir()
+ -- init options
+ opt = opt or {}
+
-- init extractors
local extractors =
{
@@ -273,5 +306,5 @@ function main(archivefile, outputdir)
local extension = _extension(archivefile, extractors)
-- extract it
- return _extract(archivefile, outputdir, extension, extractors[extension])
+ return _extract(archivefile, outputdir, extension, extractors[extension], opt)
end