def __init__(self):
super(BackupOptions, self).__init__()
- self['exclude'] = []
+ self['exclude'] = set()
def parseArgs(self, localdir, topath):
self.from_dir = localdir
g = pattern.strip()
if g:
exclude = self['exclude']
- if g not in exclude:
- exclude.append(g)
+ exclude.add(g)
def opt_exclude_from(self, filepath):
"""Ignore file matching glob patterns listed in file, one per
def filter_listdir(self, listdir):
"""Yields non-excluded childpaths in path."""
exclude = self['exclude']
- excluded_dirmembers = []
- if listdir and exclude:
- # expand patterns with a reduce taste
- for pattern in exclude:
- excluded_dirmembers += fnmatch.filter(listdir, pattern)
- # do subtraction
+ exclude_regexps = [re.compile(fnmatch.translate(pat)) for pat in exclude]
for filename in listdir:
- if filename not in excluded_dirmembers:
+ for regexp in exclude_regexps:
+ if regexp.match(filename):
+ break
+ else:
yield filename
longdesc = """Add a versioned backup of the local FROM directory to a timestamped subdir of the (tahoe) TO/Archives directory, sharing as many files and directories as possible with the previous backup. Creates TO/Latest as a reference to the latest backup. Behaves somewhat like 'rsync -a --link-dest=TO/Archives/(previous) FROM TO/Archives/(new); ln -sf TO/Archives/(new) TO/Latest'."""