mirror of https://github.com/borgbackup/borg.git
Revert "Merge pull request #2401 from ThomasWaldmann/patterns-style-default-1.0"
This reverts commit7a4e9e7a6f
, reversing changes made tob007808706
.
This commit is contained in:
parent
967a40dcdb
commit
173ecfddb4
|
@ -1025,7 +1025,7 @@ class Archiver:
|
||||||
|
|
||||||
Note that the default pattern style for `--pattern` and `--patterns-from` is
|
Note that the default pattern style for `--pattern` and `--patterns-from` is
|
||||||
shell style (`sh:`), so those patterns behave similar to rsync include/exclude
|
shell style (`sh:`), so those patterns behave similar to rsync include/exclude
|
||||||
patterns. The pattern style can be set via the `P` prefix.
|
patterns.
|
||||||
|
|
||||||
Patterns (`--pattern`) and excludes (`--exclude`) from the command line are
|
Patterns (`--pattern`) and excludes (`--exclude`) from the command line are
|
||||||
considered first (in the order of appearance). Then patterns from `--patterns-from`
|
considered first (in the order of appearance). Then patterns from `--patterns-from`
|
||||||
|
@ -1033,8 +1033,6 @@ class Archiver:
|
||||||
|
|
||||||
An example `--patterns-from` file could look like that::
|
An example `--patterns-from` file could look like that::
|
||||||
|
|
||||||
# "sh:" pattern style is the default, so the following line is not needed:
|
|
||||||
P sh
|
|
||||||
R /
|
R /
|
||||||
# can be rebuild
|
# can be rebuild
|
||||||
- /home/*/.cache
|
- /home/*/.cache
|
||||||
|
|
|
@ -346,23 +346,18 @@ def parse_timestamp(timestamp):
|
||||||
return datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S').replace(tzinfo=timezone.utc)
|
return datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S').replace(tzinfo=timezone.utc)
|
||||||
|
|
||||||
|
|
||||||
def parse_add_pattern(patternstr, roots, patterns, fallback):
|
def parse_add_pattern(patternstr, roots, patterns):
|
||||||
"""Parse a pattern string and add it to roots or patterns depending on the pattern type."""
|
"""Parse a pattern string and add it to roots or patterns depending on the pattern type."""
|
||||||
pattern = parse_inclexcl_pattern(patternstr, fallback=fallback)
|
pattern = parse_inclexcl_pattern(patternstr)
|
||||||
if pattern.ptype is RootPath:
|
if pattern.ptype is RootPath:
|
||||||
roots.append(pattern.pattern)
|
roots.append(pattern.pattern)
|
||||||
elif pattern.ptype is PatternStyle:
|
|
||||||
fallback = pattern.pattern
|
|
||||||
else:
|
else:
|
||||||
patterns.append(pattern)
|
patterns.append(pattern)
|
||||||
return fallback
|
|
||||||
|
|
||||||
|
|
||||||
def load_pattern_file(fileobj, roots, patterns, fallback=None):
|
def load_pattern_file(fileobj, roots, patterns):
|
||||||
if fallback is None:
|
|
||||||
fallback = ShellPattern # ShellPattern is defined later in this module
|
|
||||||
for patternstr in clean_lines(fileobj):
|
for patternstr in clean_lines(fileobj):
|
||||||
fallback = parse_add_pattern(patternstr, roots, patterns, fallback)
|
parse_add_pattern(patternstr, roots, patterns)
|
||||||
|
|
||||||
|
|
||||||
def load_exclude_file(fileobj, patterns):
|
def load_exclude_file(fileobj, patterns):
|
||||||
|
@ -375,7 +370,7 @@ class ArgparsePatternAction(argparse.Action):
|
||||||
super().__init__(nargs=nargs, **kw)
|
super().__init__(nargs=nargs, **kw)
|
||||||
|
|
||||||
def __call__(self, parser, args, values, option_string=None):
|
def __call__(self, parser, args, values, option_string=None):
|
||||||
parse_add_pattern(values[0], args.paths, args.patterns, ShellPattern)
|
parse_add_pattern(values[0], args.paths, args.patterns)
|
||||||
|
|
||||||
|
|
||||||
class ArgparsePatternFileAction(argparse.Action):
|
class ArgparsePatternFileAction(argparse.Action):
|
||||||
|
@ -571,14 +566,6 @@ _PATTERN_STYLE_BY_PREFIX = dict((i.PREFIX, i) for i in _PATTERN_STYLES)
|
||||||
|
|
||||||
InclExclPattern = namedtuple('InclExclPattern', 'pattern ptype')
|
InclExclPattern = namedtuple('InclExclPattern', 'pattern ptype')
|
||||||
RootPath = object()
|
RootPath = object()
|
||||||
PatternStyle = object()
|
|
||||||
|
|
||||||
|
|
||||||
def get_pattern_style(prefix):
|
|
||||||
try:
|
|
||||||
return _PATTERN_STYLE_BY_PREFIX[prefix]
|
|
||||||
except KeyError:
|
|
||||||
raise ValueError("Unknown pattern style: {}".format(prefix)) from None
|
|
||||||
|
|
||||||
|
|
||||||
def parse_pattern(pattern, fallback=FnmatchPattern):
|
def parse_pattern(pattern, fallback=FnmatchPattern):
|
||||||
|
@ -586,9 +573,14 @@ def parse_pattern(pattern, fallback=FnmatchPattern):
|
||||||
"""
|
"""
|
||||||
if len(pattern) > 2 and pattern[2] == ":" and pattern[:2].isalnum():
|
if len(pattern) > 2 and pattern[2] == ":" and pattern[:2].isalnum():
|
||||||
(style, pattern) = (pattern[:2], pattern[3:])
|
(style, pattern) = (pattern[:2], pattern[3:])
|
||||||
cls = get_pattern_style(style)
|
|
||||||
|
cls = _PATTERN_STYLE_BY_PREFIX.get(style, None)
|
||||||
|
|
||||||
|
if cls is None:
|
||||||
|
raise ValueError("Unknown pattern style: {}".format(style))
|
||||||
else:
|
else:
|
||||||
cls = fallback
|
cls = fallback
|
||||||
|
|
||||||
return cls(pattern)
|
return cls(pattern)
|
||||||
|
|
||||||
|
|
||||||
|
@ -606,8 +598,6 @@ def parse_inclexcl_pattern(pattern, fallback=ShellPattern):
|
||||||
'+': True,
|
'+': True,
|
||||||
'R': RootPath,
|
'R': RootPath,
|
||||||
'r': RootPath,
|
'r': RootPath,
|
||||||
'P': PatternStyle,
|
|
||||||
'p': PatternStyle,
|
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
ptype = type_prefix_map[pattern[0]]
|
ptype = type_prefix_map[pattern[0]]
|
||||||
|
@ -618,11 +608,6 @@ def parse_inclexcl_pattern(pattern, fallback=ShellPattern):
|
||||||
raise argparse.ArgumentTypeError("Unable to parse pattern: {}".format(pattern))
|
raise argparse.ArgumentTypeError("Unable to parse pattern: {}".format(pattern))
|
||||||
if ptype is RootPath:
|
if ptype is RootPath:
|
||||||
pobj = pattern
|
pobj = pattern
|
||||||
elif ptype is PatternStyle:
|
|
||||||
try:
|
|
||||||
pobj = get_pattern_style(pattern)
|
|
||||||
except ValueError:
|
|
||||||
raise argparse.ArgumentTypeError("Unable to parse pattern: {}".format(pattern))
|
|
||||||
else:
|
else:
|
||||||
pobj = parse_pattern(pattern, fallback)
|
pobj = parse_pattern(pattern, fallback)
|
||||||
return InclExclPattern(pobj, ptype)
|
return InclExclPattern(pobj, ptype)
|
||||||
|
|
|
@ -494,32 +494,6 @@ def test_load_patterns_from_file(tmpdir, lines, expected_roots, expected_numpatt
|
||||||
assert numpatterns == expected_numpatterns
|
assert numpatterns == expected_numpatterns
|
||||||
|
|
||||||
|
|
||||||
def test_switch_patterns_style():
|
|
||||||
patterns = """\
|
|
||||||
+0_initial_default_is_shell
|
|
||||||
p fm
|
|
||||||
+1_fnmatch
|
|
||||||
P re
|
|
||||||
+2_regex
|
|
||||||
+3_more_regex
|
|
||||||
P pp
|
|
||||||
+4_pathprefix
|
|
||||||
p fm
|
|
||||||
p sh
|
|
||||||
+5_shell
|
|
||||||
"""
|
|
||||||
pattern_file = StringIO(patterns)
|
|
||||||
roots, patterns = [], []
|
|
||||||
load_pattern_file(pattern_file, roots, patterns)
|
|
||||||
assert len(patterns) == 6
|
|
||||||
assert isinstance(patterns[0].pattern, ShellPattern)
|
|
||||||
assert isinstance(patterns[1].pattern, FnmatchPattern)
|
|
||||||
assert isinstance(patterns[2].pattern, RegexPattern)
|
|
||||||
assert isinstance(patterns[3].pattern, RegexPattern)
|
|
||||||
assert isinstance(patterns[4].pattern, PathPrefixPattern)
|
|
||||||
assert isinstance(patterns[5].pattern, ShellPattern)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("lines", [
|
@pytest.mark.parametrize("lines", [
|
||||||
(["X /data"]), # illegal pattern type prefix
|
(["X /data"]), # illegal pattern type prefix
|
||||||
(["/data"]), # need a pattern type prefix
|
(["/data"]), # need a pattern type prefix
|
||||||
|
|
Loading…
Reference in New Issue