Revert "Merge pull request #2401 from ThomasWaldmann/patterns-style-default-1.0"

This reverts commit 7a4e9e7a6f, reversing
changes made to b007808706.
This commit is contained in:
Marian Beermann 2017-05-15 23:37:28 +02:00
parent 967a40dcdb
commit 173ecfddb4
3 changed files with 12 additions and 55 deletions

View File

@ -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

View File

@ -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)

View File

@ -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