Mercurial > hgrepos > Python > apps > py-cutils
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 |
| 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 |
