diff --git a/borg/archiver.py b/borg/archiver.py index 40e234a55..915afa13a 100644 --- a/borg/archiver.py +++ b/borg/archiver.py @@ -1025,7 +1025,7 @@ class Archiver: Note that the default pattern style for `--pattern` and `--patterns-from` is 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 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:: - # "sh:" pattern style is the default, so the following line is not needed: - P sh R / # can be rebuild - /home/*/.cache diff --git a/borg/helpers.py b/borg/helpers.py index ed9d1fae5..fc0ae09cb 100644 --- a/borg/helpers.py +++ b/borg/helpers.py @@ -346,23 +346,18 @@ def parse_timestamp(timestamp): 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.""" - pattern = parse_inclexcl_pattern(patternstr, fallback=fallback) + pattern = parse_inclexcl_pattern(patternstr) if pattern.ptype is RootPath: roots.append(pattern.pattern) - elif pattern.ptype is PatternStyle: - fallback = pattern.pattern else: patterns.append(pattern) - return fallback -def load_pattern_file(fileobj, roots, patterns, fallback=None): - if fallback is None: - fallback = ShellPattern # ShellPattern is defined later in this module +def load_pattern_file(fileobj, roots, patterns): 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): @@ -375,7 +370,7 @@ class ArgparsePatternAction(argparse.Action): super().__init__(nargs=nargs, **kw) 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): @@ -571,14 +566,6 @@ _PATTERN_STYLE_BY_PREFIX = dict((i.PREFIX, i) for i in _PATTERN_STYLES) InclExclPattern = namedtuple('InclExclPattern', 'pattern ptype') 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): @@ -586,9 +573,14 @@ def parse_pattern(pattern, fallback=FnmatchPattern): """ if len(pattern) > 2 and pattern[2] == ":" and pattern[:2].isalnum(): (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: cls = fallback + return cls(pattern) @@ -606,8 +598,6 @@ def parse_inclexcl_pattern(pattern, fallback=ShellPattern): '+': True, 'R': RootPath, 'r': RootPath, - 'P': PatternStyle, - 'p': PatternStyle, } try: 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)) if ptype is RootPath: pobj = pattern - elif ptype is PatternStyle: - try: - pobj = get_pattern_style(pattern) - except ValueError: - raise argparse.ArgumentTypeError("Unable to parse pattern: {}".format(pattern)) else: pobj = parse_pattern(pattern, fallback) return InclExclPattern(pobj, ptype) diff --git a/borg/testsuite/helpers.py b/borg/testsuite/helpers.py index a1571b70a..ed399435e 100644 --- a/borg/testsuite/helpers.py +++ b/borg/testsuite/helpers.py @@ -494,32 +494,6 @@ def test_load_patterns_from_file(tmpdir, lines, expected_roots, expected_numpatt 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", [ (["X /data"]), # illegal pattern type prefix (["/data"]), # need a pattern type prefix