summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2015-06-17 12:38:41 +0800
committerruki <[email protected]>2015-06-17 12:38:41 +0800
commitdda38bb51d261f058706ada91fdf8b03701bd2e5 (patch)
tree667734bc5dbc3e535833fb960b19cfec90404262
parent95798306093295a45c8f8671ca2f18edb16f796e (diff)
add excludes pattern for files
-rwxr-xr-xcore/src/xmake/os/find.c59
-rw-r--r--xmake/scripts/base/os.lua24
-rw-r--r--xmake/scripts/base/project.lua4
3 files changed, 79 insertions, 8 deletions
diff --git a/core/src/xmake/os/find.c b/core/src/xmake/os/find.c
index c891b9146..725c08e5f 100755
--- a/core/src/xmake/os/find.c
+++ b/core/src/xmake/os/find.c
@@ -61,7 +61,7 @@ static tb_bool_t xm_os_find_walk(tb_char_t const* path, tb_file_info_t const* in
// find file or directory?
if ((findir && info->type == TB_FILE_TYPE_DIRECTORY) || (!findir && info->type == TB_FILE_TYPE_FILE))
{
- // done string.match(pattern)
+ // done path:match(pattern)
lua_getfield(lua, -1, "match");
lua_pushstring(lua, path);
lua_pushstring(lua, pattern);
@@ -74,9 +74,62 @@ static tb_bool_t xm_os_find_walk(tb_char_t const* path, tb_file_info_t const* in
return tb_false;
}
- // match ok? save this path
+ // match ok?
if (lua_isstring(lua, -1) && !tb_strcmp(path, lua_tostring(lua, -1)))
- lua_rawseti(lua, -3, ++*pcount);
+ {
+ // exists excludes?
+ tb_bool_t excluded = tb_false;
+ if (lua_istable(lua, 5))
+ {
+ // the root directory
+ size_t rootlen = 0;
+ tb_char_t const* rootdir = luaL_checklstring(lua, 1, &rootlen);
+ tb_assert_and_check_return_val(rootdir && rootlen, tb_false);
+
+ // check
+ tb_assert_abort(!tb_strcmp(path, rootdir));
+ tb_assert_abort(rootlen + 1 <= tb_strlen(path));
+
+ // skip the rootdir
+ path += rootlen + 1;
+
+ // exclude pathes
+ tb_size_t i = 0;
+ tb_size_t count = luaL_getn(lua, 5);
+ for (i = 0; i < count && !excluded; i++)
+ {
+ // get exclude
+ lua_rawgeti(lua, 5, i + 1);
+ tb_char_t const* exclude = lua_tostring(lua, -1);
+ if (exclude)
+ {
+ // done path:match(exclude)
+ lua_getfield(lua, -3, "match");
+ lua_pushstring(lua, path);
+ lua_pushstring(lua, exclude);
+ if (lua_pcall(lua, 2, 1, 0))
+ {
+ // trace
+ tb_printf("error: call string.match(%s, %s) failed: %s!\n", path, exclude, lua_tostring(lua, -1));
+ }
+
+ // matched?
+ excluded = lua_isstring(lua, -1) && !tb_strcmp(path, lua_tostring(lua, -1));
+
+ // pop the match result
+ lua_pop(lua, 1);
+ }
+
+ // pop exclude
+ lua_pop(lua, 1);
+ }
+ }
+
+ // save this path
+ if (!excluded) lua_rawseti(lua, -3, ++*pcount);
+ // pop this return value
+ else lua_pop(lua, 1);
+ }
// pop this return value
else lua_pop(lua, 1);
}
diff --git a/xmake/scripts/base/os.lua b/xmake/scripts/base/os.lua
index 31ff7957f..75b555651 100644
--- a/xmake/scripts/base/os.lua
+++ b/xmake/scripts/base/os.lua
@@ -26,6 +26,7 @@ local os = os or {}
-- load modules
local path = require("base/path")
local utils = require("base/utils")
+local string = require("base/string")
-- copy file or directory
function os.cp(src, dst)
@@ -160,8 +161,27 @@ end
--
function os.match(pattern, findir)
+ -- get the excludes
+ local excludes = pattern:match("|.*$")
+ if excludes then excludes = excludes:split("|") end
+
+ -- translate excludes
+ if excludes then
+ local _excludes = {}
+ for _, exclude in ipairs(excludes) do
+ exclude = path.translate(exclude)
+ exclude = exclude:gsub("([%+%.%-%^%$%(%)%%])", "%%%1")
+ exclude = exclude:gsub("%*%*", "\001")
+ exclude = exclude:gsub("%*", "\002")
+ exclude = exclude:gsub("\001", ".*")
+ exclude = exclude:gsub("\002", "[^/]*")
+ table.insert(_excludes, exclude)
+ end
+ excludes = _excludes
+ end
+
-- translate path and remove some repeat separators
- pattern = path.translate(pattern)
+ pattern = path.translate(pattern:gsub("|.*$", ""))
-- get the root directory
local rootdir = pattern
@@ -182,7 +202,7 @@ function os.match(pattern, findir)
pattern = pattern:gsub("\002", "[^/]*")
-- find it
- return os.find(rootdir, pattern, recurse, findir)
+ return os.find(rootdir, pattern, recurse, findir, excludes)
end
-- return module: os
diff --git a/xmake/scripts/base/project.lua b/xmake/scripts/base/project.lua
index 41b754a45..e8769d57b 100644
--- a/xmake/scripts/base/project.lua
+++ b/xmake/scripts/base/project.lua
@@ -1074,13 +1074,11 @@ function project.menu()
local projectfile = xmake._PROJECT_FILE
if projectfile and os.isfile(projectfile) then
configs, errors = project._load_options(projectfile)
- else
- errors = string.format("load %s failed!", projectfile)
end
-- failed?
if not configs then
- utils.error(errors)
+ if errors then utils.error(errors) end
return {}
end