annotate cutils/util/glob.py @ 311:6d1add815d14

FIX: doc string for glob syntax rules
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 10 Mar 2025 01:45:09 +0100
parents 1371ceb6fad6
children 48430941c18c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
296
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
2 # :-
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
3 # :Copyright: (c) 2020-2025 Franz Glasner
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
4 # :License: BSD-3-Clause
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
5 # :-
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
6 r"""Glob handling.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
7
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
8 .. seealso::
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
9 - https://docs.oracle.com/javase/8/docs/api/java/nio/file/FileSystem.html#getPathMatcher-java.lang.String-
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
10 - https://docs.oracle.com/javase/tutorial/essential/io/fileOps.html#glob
310
1371ceb6fad6 glob: also describe the "**/" pattern
Franz Glasner <fzglas.hg@dom66.de>
parents: 298
diff changeset
11 - Mercurial: :command:`hg help patterns`
296
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
12
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
13 The following rules are used to interpret glob patterns:
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
14
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
15 - The ``*`` character matches zero or more characters of a name
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
16 component without crossing directory boundaries.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
17
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
18 - The ``**`` characters matches zero or more characters crossing
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
19 directory boundaries.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
20
310
1371ceb6fad6 glob: also describe the "**/" pattern
Franz Glasner <fzglas.hg@dom66.de>
parents: 298
diff changeset
21 - ``**/`` matches zero or more subdirectories; files do not match.
1371ceb6fad6 glob: also describe the "**/" pattern
Franz Glasner <fzglas.hg@dom66.de>
parents: 298
diff changeset
22
296
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
23 - The ``?`` character matches exactly one character of a name component.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
24
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
25 - The backslash character (``\``) is used to escape characters that
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
26 would otherwise be interpreted as special characters. The expression
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
27 ``\\`` matches a single backslash and ``\{`` matches a left brace for
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
28 example.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
29
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
30 - The ``[ ]`` characters are a bracket expression that match a single
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
31 character of a name component out of a set of characters. For example,
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
32 ``[abc]`` matches "``a``", "``b``", or "``c``". The hyphen (``-``) may
311
6d1add815d14 FIX: doc string for glob syntax rules
Franz Glasner <fzglas.hg@dom66.de>
parents: 310
diff changeset
33 be used to specify a range so ``[a-z]`` specifies a range that matches
296
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
34 from "``a``" to "``z``" (inclusive). These forms can be mixed so
311
6d1add815d14 FIX: doc string for glob syntax rules
Franz Glasner <fzglas.hg@dom66.de>
parents: 310
diff changeset
35 ``[abce-g]`` matches "``a``", "``b``", "``c``", "``e``", "``f``" or
296
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
36 "``g``".
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
37
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
38 If the character after the ``[`` is a ``!`` then it is used for negation
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
39 so ``[!a-c]`` matches any character except "``a``", "``b``", or "``c``".
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
40
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
41 Within a bracket expression the ``*``, ``?`` and ``\`` characters match
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
42 themselves.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
43
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
44 The ``-`` character matches itself if it is the first or last character
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
45 within the brackets, or the first or last character after the ``!`` if
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
46 negating.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
47
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
48 Also, the ``]`` character matches itself if it is the first character
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
49 within the brackets, or the first character after the ``!`` if negating.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
50
297
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
51 - The curly brace characters ``{ }`` denote a group of subpatterns, where
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
52 the group matches if any subpattern in the group matches.
296
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
53
297
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
54 The ``,`` character is used to separate the subpatterns. Groups can be
296
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
55 nested.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
56
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
57 - Leading period/dot characters in file name are treated as regular characters
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
58 in match operations. For example, the ``*`` glob pattern matches file name
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
59 ``.login``.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
60
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
61 - All other characters match themselves.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
62
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
63 """
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
64
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
65 from __future__ import print_function, absolute_import
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
66
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
67
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
68 __all__ = ["glob_to_regexp"]
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
69
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
70
297
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
71 import logging
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
72 import re
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
73
296
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
74 from . import PY2
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
75
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
76
297
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
77 def glob_to_regexp(globobj):
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
78 """Convert a glob string to a regular expression string.
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
79
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
80 The resulting regexp is *not* rooted.
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
81
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
82 :param globobj: the pattern with glob syntax or an iterator over the
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
83 characters in such a pattern
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
84 :type globobj: str or iterator over str
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
85
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
86 """
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
87 res = []
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
88 grouplvl = 0 # support for nested pattern groups
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
89 globiter = CharIter(globobj)
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
90 for c in globiter:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
91 if c == '?':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
92 res.append(".")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
93 elif c == '*':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
94 if globiter.peek() == '*':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
95 # extended glob
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
96 next(globiter)
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
97 if globiter.peek() == '/':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
98 next(globiter)
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
99 res.append("(?:.*/)?")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
100 else:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
101 res.append(".*")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
102 else:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
103 res.append("[^/]*")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
104 elif c == '\\':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
105 try:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
106 res.append(re.escape(next(globiter)))
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
107 except StopIteration:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
108 # XXX FIXME: or raise an exception with an invalid syntax
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
109 logging.warning(
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
110 "lone trailing backslash in glob: %s", globobj)
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
111 res.append("\\\\")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
112 elif c == '[':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
113 bres = [] # need a temp store because of errors
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
114 if globiter.peek() == '!': # XXX FIXME: handle '^' also? see below!
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
115 next(globiter)
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
116 bres.append("^")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
117 if globiter.peek() == ']':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
118 next(globiter)
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
119 bres.append("\\]")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
120 elif globiter.peek() == '-':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
121 next(globiter)
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
122 bres.append("\\-")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
123 elif globiter.peek() == '^':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
124 #
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
125 # XXX FIXME: as an extension: FreeBSD /bin/sh handles this
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
126 # like `!'. Should we follow it?
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
127 #
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
128 next(globiter)
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
129 if len(bres) > 0 and bres[0] == '^':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
130 bres.append("^")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
131 else:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
132 bres.append("\\^")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
133 for c2 in globiter:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
134 if c2 == ']':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
135 # normal and regular break
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
136 if bres[-1] == '-':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
137 bres.insert(-1, "\\")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
138 res.append("[")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
139 res.extend(bres)
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
140 res.append("]")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
141 break
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
142 if c2 == '\\':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
143 bres.append("\\\\")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
144 else:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
145 bres.append(c2) # no escaping needed
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
146 else:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
147 # no trailing `]' char
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
148 logging.warning(
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
149 "missing trailing bracket `]' in this glob: %s", globobj)
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
150 #
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
151 # FreeBSD's /bin/sh handles this like putting the given pattern
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
152 # into single quotes -- effectively disabling any glob syntax.
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
153 # We do this here also.
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
154 #
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
155 res.append("\\[")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
156 res.append(re.escape("".join(bres)))
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
157 elif c == '{':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
158 grouplvl += 1
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
159 res.append("(?:")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
160 elif grouplvl > 0 and c == '}':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
161 grouplvl -= 1
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
162 res.append(")")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
163 elif grouplvl > 0 and c == ',':
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
164 res.append("|")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
165 else:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
166 res.append(re.escape(c))
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
167 if grouplvl > 0:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
168 if grouplvl > 1:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
169 logging.warning("missing braces `}' in this glob: %s", globobj)
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
170 else:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
171 logging.warning("missing brace `}' in this glob: %s", globobj)
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
172 while grouplvl > 0:
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
173 # XXX FIXME: what about trailing `|' chars
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
174 grouplvl -= 1
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
175 res.append(")")
141a3aa0b403 First version of converting a glob-style pattern to a regex
Franz Glasner <fzglas.hg@dom66.de>
parents: 296
diff changeset
176 return "".join(res)
296
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
177
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
178
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
179 class CharIter(object):
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
180
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
181 """Iterator over byte or unicode strings with peek support.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
182
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
183 On Python3 always yields an octet of :class:`bytes` instead of
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
184 :class:`int`s if the iterator iterates over :class:`bytes`.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
185
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
186 """
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
187
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
188 __slots__ = ("_it", "_nch")
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
189
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
190 def __init__(self, w):
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
191 self._nch = None
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
192 if PY2:
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
193 if isinstance(w, (bytes, unicode)): # noqa: F821 undefined name
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
194 self._it = iter(w)
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
195 else:
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
196 self._it = w
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
197 else:
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
198 if isinstance(w, (bytes, str)):
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
199 self._it = iter(w)
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
200 else:
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
201 self._it = w
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
202
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
203 def __iter__(self):
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
204 return self
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
205
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
206 def __next__(self):
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
207 if self._nch is not None:
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
208 c = self._nch
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
209 self._nch = None
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
210 return c
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
211 c = next(self._it)
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
212 return bytes((c,)) if isinstance(c, int) else c
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
213
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
214 if PY2:
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
215 next = __next__
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
216
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
217 def peek(self):
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
218 """Peek the next character.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
219
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
220 Return `None` if the iterator is exhausted.
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
221
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
222 """
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
223 if self._nch is not None:
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
224 return self._nch
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
225 self._nch = next(self._it, None)
298
16a5c337fcb9 FIX: peeking for byte strings on Python3 needs to convert from int to bytes
Franz Glasner <fzglas.hg@dom66.de>
parents: 297
diff changeset
226 if isinstance(self._nch, int):
16a5c337fcb9 FIX: peeking for byte strings on Python3 needs to convert from int to bytes
Franz Glasner <fzglas.hg@dom66.de>
parents: 297
diff changeset
227 self._nch = bytes((self._nch,))
296
ca293f708cb4 Begin some preparation for handling glob-style patterns in treeview.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
228 return self._nch