Fix again bug with invalid ignore_files patterns
The pattern cannot be tested in advance as it seems that Lua inspect the pattern only partially, the part that is actually used. We resort to use pcall to catch any error when using the pattern.
This commit is contained in:
parent
a6f32ca0d0
commit
b02aae939c
|
@ -136,20 +136,23 @@ local function compile_ignore_files()
|
||||||
-- config.ignore_files could be a simple string...
|
-- config.ignore_files could be a simple string...
|
||||||
if type(ipatterns) ~= "table" then ipatterns = {ipatterns} end
|
if type(ipatterns) ~= "table" then ipatterns = {ipatterns} end
|
||||||
for i, pattern in ipairs(ipatterns) do
|
for i, pattern in ipairs(ipatterns) do
|
||||||
-- we ignore malformed pattern that raise an error
|
compiled[i] = {
|
||||||
if pcall(string.match, "a", pattern) then
|
|
||||||
table.insert(compiled, {
|
|
||||||
use_path = pattern:match("/[^/$]"), -- contains a slash but not at the end
|
use_path = pattern:match("/[^/$]"), -- contains a slash but not at the end
|
||||||
-- An '/' or '/$' at the end means we want to match a directory.
|
-- An '/' or '/$' at the end means we want to match a directory.
|
||||||
match_dir = pattern:match(".+/%$?$"), -- to be used as a boolen value
|
match_dir = pattern:match(".+/%$?$"), -- to be used as a boolen value
|
||||||
pattern = pattern -- get the actual pattern
|
pattern = pattern -- get the actual pattern
|
||||||
})
|
}
|
||||||
end
|
|
||||||
end
|
end
|
||||||
return compiled
|
return compiled
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function safe_match(s, pattern)
|
||||||
|
local ok, match = pcall(string.match, s, pattern)
|
||||||
|
return ok and match
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
local function fileinfo_pass_filter(info, ignore_compiled)
|
local function fileinfo_pass_filter(info, ignore_compiled)
|
||||||
if info.size >= config.file_size_limit * 1e6 then return false end
|
if info.size >= config.file_size_limit * 1e6 then return false end
|
||||||
local basename = common.basename(info.filename)
|
local basename = common.basename(info.filename)
|
||||||
|
@ -158,11 +161,11 @@ local function fileinfo_pass_filter(info, ignore_compiled)
|
||||||
for _, compiled in ipairs(ignore_compiled) do
|
for _, compiled in ipairs(ignore_compiled) do
|
||||||
local test = compiled.use_path and fullname or basename
|
local test = compiled.use_path and fullname or basename
|
||||||
if compiled.match_dir then
|
if compiled.match_dir then
|
||||||
if info.type == "dir" and string.match(test .. "/", compiled.pattern) then
|
if info.type == "dir" and safe_match(test .. "/", compiled.pattern) then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if string.match(test, compiled.pattern) then
|
if safe_match(test, compiled.pattern) then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue