This commit is contained in:
Axel Kittenberger 2010-11-13 16:59:46 +00:00
parent 550c47f8ef
commit ddc6157e91
2 changed files with 154 additions and 2 deletions

View File

@ -8,5 +8,5 @@ settings = {
statusIntervall = 1, statusIntervall = 1,
} }
sync{default.rsync, source="src", target="dst/"} sync{default.rsync, source="src", target="dst/", excludeFrom="exclude"}

View File

@ -637,6 +637,112 @@ local Inlet, InletControl = (function()
} }
end)() end)()
-----
-- A set of exclude patterns
--
local Excludes = (function()
-----
-- Turns a rsync like file pattern to a lua pattern.
--
--
local function toLuaPattern(p)
local o = p
p = string.gsub(p, "%%", "%%")
p = string.gsub(p, "%^", "%^")
p = string.gsub(p, "%$", "%$")
p = string.gsub(p, "%(", "%(")
p = string.gsub(p, "%)", "%)")
p = string.gsub(p, "%.", "%.")
p = string.gsub(p, "%[", "%[")
p = string.gsub(p, "%]", "%]")
p = string.gsub(p, "%+", "%+")
p = string.gsub(p, "%-", "%-")
p = string.gsub(p, "%?", "[^/]")
p = string.gsub(p, "%*", "[^/]*")
-- this was a ** before v
p = string.gsub(p, "%[%^/%]%*%[%^/%]%*", ".*")
p = string.gsub(p, "^/", "^")
p = string.gsub(p, "/$", "/$")
log("Exclude", "toLuaPattern '",o,"' = '",p,'"')
return p
end
-----
-- Adds a pattern to exclude.
--
local function add(self, pattern)
if self.list[pattern] then
-- already in the list
return
end
local lp = toLuaPattern(pattern)
self.list[pattern] = lp
end
-----
-- Adds a list of patterns to exclude.
--
local function addList(self, plist)
for _, v in plist do
add(self, v)
end
end
-----
-- loads excludes from a file
--
local function loadFile(self, file)
f, err = io.open(file)
if not f then
log("Error", "Cannot open exclude file '",file,"': ", err)
terminate(-1) -- ERRNO
end
for line in f:lines() do
-- lsyncd 2.0 does not support includes
if not string.match(line, "%s*+") then
local p = string.match(line, "%s*-?%s*(.*)")
if p then
add(self, p)
end
end
end
f:close()
end
-----
-- Tests if 'file' is excluded.
--
local function test(self, file)
for _, p in pairs(self.list) do
if (string.match(file, p)) then
return true
end
end
return false
end
-----
-- Cretes a new exclude set
--
local function new()
return {
list = {},
-- functions
add = add,
adList = addList,
loadFile = loadFile,
test = test,
}
end
-----
-- Public interface
return { new = new }
end)()
----- -----
-- Holds information about one observed directory inclusively subdirs. -- Holds information about one observed directory inclusively subdirs.
-- --
@ -730,8 +836,33 @@ local Sync = (function()
-- --
local function delay(self, etype, time, path, path2) local function delay(self, etype, time, path, path2)
log("Function", "delay(", self.config.name,", ",etype,", ",path,")") log("Function", "delay(", self.config.name,", ",etype,", ",path,")")
if path2 then if not path2 then
-- test for exclusion
if self.excludes:test(path) then
log("Exclude", "excluded ",etype," on '",path,"'")
return
end
else
log("Function", "+ ",path2) log("Function", "+ ",path2)
local ex1 = self.excludes:test(path)
local ex2 = self.excludes:test(path2)
if ex1 and ex2 then
log("Exclude", "excluded '",etype," on '",path,
"' -> '",path2,"'")
return
elseif not ex1 and ex2 then
-- splits the move if only partly excluded
log("Exclude", "excluded destination transformed ",etype,
" to Delete ",path)
delay(self, "Delete", time, path, nil)
return
elseif ex1 and not ex2 then
-- splits the move if only partly excluded
log("Exclude", "excluded origin transformed ",etype,
" to Create.",path2)
delay(self, "Create", time, path2, nil)
return
end
end end
if etype == "Move" and not self.config.onMove then if etype == "Move" and not self.config.onMove then
@ -969,6 +1100,17 @@ local Sync = (function()
end end
f:write("\n") f:write("\n")
end end
f:write("Excluding:\n")
local nothing = true
for t, p in pairs(self.excludes.list) do
nothing = false
f:write(t,"\n")
end
if nothing then
f:write(" nothing.\n")
end
f:write("\n\n")
end end
----- -----
@ -981,6 +1123,7 @@ local Sync = (function()
delays = CountArray.new(), delays = CountArray.new(),
source = config.source, source = config.source,
processes = CountArray.new(), processes = CountArray.new(),
excludes = Excludes.new(),
-- functions -- functions
collect = collect, collect = collect,
@ -1000,6 +1143,15 @@ local Sync = (function()
-- increments default nevertheless to cause less confusion -- increments default nevertheless to cause less confusion
-- so name will be the n-th call to sync{} -- so name will be the n-th call to sync{}
nextDefaultName = nextDefaultName + 1 nextDefaultName = nextDefaultName + 1
-- loads exclusions
if config.exclude then
s.excludes:addList(config.exclude)
end
if config.excludeFrom then
s.excludes:loadFile(config.excludeFrom)
end
return s return s
end end