diff options
| author | ruki <[email protected]> | 2015-06-17 12:38:41 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2015-06-17 12:38:41 +0800 |
| commit | dda38bb51d261f058706ada91fdf8b03701bd2e5 (patch) | |
| tree | 667734bc5dbc3e535833fb960b19cfec90404262 | |
| parent | 95798306093295a45c8f8671ca2f18edb16f796e (diff) | |
add excludes pattern for files
| -rwxr-xr-x | core/src/xmake/os/find.c | 59 | ||||
| -rw-r--r-- | xmake/scripts/base/os.lua | 24 | ||||
| -rw-r--r-- | xmake/scripts/base/project.lua | 4 |
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 |
