Mercurial > hg
annotate mercurial/filesetlang.py @ 48974:2bb75c65fa6c stable
ci: use the `v1.0` flavor of the docker images in the CI
This new versioning will help us to maintain backward compatibility in the
docker image. This will be useful to deal with mismatch between default/stable
in version and the re-run CI on older changesets in the future.
Once this changeset land on stable, we will have to merge it in default. Then
we can start make backward incompatible changes in a new image version.
Differential Revision: https://phab.mercurial-scm.org/D12388
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 18 Mar 2022 18:09:46 +0100 |
parents | d4ba4d51f85f |
children | 6000f5b25c9b |
rev | line source |
---|---|
38805
b9162ea1b815
fileset: extract language processing part to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
38804
diff
changeset
|
1 # filesetlang.py - parser, tokenizer and utility for file set language |
11275 | 2 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents:
43089
diff
changeset
|
3 # Copyright 2010 Olivia Mackall <olivia@selenic.com> |
11275 | 4 # |
5 # This software may be used and distributed according to the terms of the | |
6 # GNU General Public License version 2 or any later version. | |
7 | |
25938
e194ada8d45f
fileset: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25815
diff
changeset
|
8 from __future__ import absolute_import |
e194ada8d45f
fileset: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25815
diff
changeset
|
9 |
e194ada8d45f
fileset: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25815
diff
changeset
|
10 from .i18n import _ |
43089
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43077
diff
changeset
|
11 from .pycompat import getattr |
25938
e194ada8d45f
fileset: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25815
diff
changeset
|
12 from . import ( |
e194ada8d45f
fileset: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25815
diff
changeset
|
13 error, |
e194ada8d45f
fileset: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25815
diff
changeset
|
14 parser, |
32523
1fb0a85fb20e
py3: use pycompat.bytestr so that we don't get ascii values
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32291
diff
changeset
|
15 pycompat, |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36505
diff
changeset
|
16 ) |
11275 | 17 |
38863
61ab546b71c3
fileset: introduce weight constants for readability
Yuya Nishihara <yuya@tcha.org>
parents:
38832
diff
changeset
|
18 # common weight constants for static optimization |
61ab546b71c3
fileset: introduce weight constants for readability
Yuya Nishihara <yuya@tcha.org>
parents:
38832
diff
changeset
|
19 # (see registrar.filesetpredicate for details) |
61ab546b71c3
fileset: introduce weight constants for readability
Yuya Nishihara <yuya@tcha.org>
parents:
38832
diff
changeset
|
20 WEIGHT_CHECK_FILENAME = 0.5 |
61ab546b71c3
fileset: introduce weight constants for readability
Yuya Nishihara <yuya@tcha.org>
parents:
38832
diff
changeset
|
21 WEIGHT_READ_CONTENTS = 30 |
61ab546b71c3
fileset: introduce weight constants for readability
Yuya Nishihara <yuya@tcha.org>
parents:
38832
diff
changeset
|
22 WEIGHT_STATUS = 10 |
61ab546b71c3
fileset: introduce weight constants for readability
Yuya Nishihara <yuya@tcha.org>
parents:
38832
diff
changeset
|
23 WEIGHT_STATUS_THOROUGH = 50 |
61ab546b71c3
fileset: introduce weight constants for readability
Yuya Nishihara <yuya@tcha.org>
parents:
38832
diff
changeset
|
24 |
11275 | 25 elements = { |
25815
e71e5629e006
parser: separate actions for primary expression and prefix operator
Yuya Nishihara <yuya@tcha.org>
parents:
25801
diff
changeset
|
26 # token-type: binding-strength, primary, prefix, infix, suffix |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
27 b"(": (20, None, (b"group", 1, b")"), (b"func", 1, b")"), None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
28 b":": (15, None, None, (b"kindpat", 15), None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
29 b"-": (5, None, (b"negate", 19), (b"minus", 5), None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
30 b"not": (10, None, (b"not", 10), None, None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
31 b"!": (10, None, (b"not", 10), None, None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
32 b"and": (5, None, None, (b"and", 5), None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
33 b"&": (5, None, None, (b"and", 5), None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
34 b"or": (4, None, None, (b"or", 4), None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
35 b"|": (4, None, None, (b"or", 4), None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
36 b"+": (4, None, None, (b"or", 4), None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
37 b",": (2, None, None, (b"list", 2), None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
38 b")": (0, None, None, None, None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
39 b"symbol": (0, b"symbol", None, None, None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
40 b"string": (0, b"string", None, None, None), |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
41 b"end": (0, None, None, None, None), |
11275 | 42 } |
43 | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
44 keywords = {b'and', b'or', b'not'} |
11275 | 45 |
38805
b9162ea1b815
fileset: extract language processing part to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
38804
diff
changeset
|
46 symbols = {} |
b9162ea1b815
fileset: extract language processing part to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
38804
diff
changeset
|
47 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
48 globchars = b".*{}[]?/\\_" |
14551
68d814a3cefd
fileset: basic pattern and boolean support
Matt Mackall <mpm@selenic.com>
parents:
14513
diff
changeset
|
49 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
50 |
11275 | 51 def tokenize(program): |
52 pos, l = 0, len(program) | |
32523
1fb0a85fb20e
py3: use pycompat.bytestr so that we don't get ascii values
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32291
diff
changeset
|
53 program = pycompat.bytestr(program) |
11275 | 54 while pos < l: |
55 c = program[pos] | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
56 if c.isspace(): # skip inter-token whitespace |
11275 | 57 pass |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
58 elif c in b"(),-:|&+!": # handle simple operators |
11289
4215ce511134
revset: raise ParseError exceptions
Matt Mackall <mpm@selenic.com>
parents:
11284
diff
changeset
|
59 yield (c, None, pos) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
60 elif ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
61 c in b'"\'' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
62 or c == b'r' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
63 and program[pos : pos + 2] in (b"r'", b'r"') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
64 ): # handle quoted strings |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
65 if c == b'r': |
12408
78a97859b90d
revset: support raw string literals
Brodie Rao <brodie@bitheap.org>
parents:
12401
diff
changeset
|
66 pos += 1 |
78a97859b90d
revset: support raw string literals
Brodie Rao <brodie@bitheap.org>
parents:
12401
diff
changeset
|
67 c = program[pos] |
78a97859b90d
revset: support raw string literals
Brodie Rao <brodie@bitheap.org>
parents:
12401
diff
changeset
|
68 decode = lambda x: x |
78a97859b90d
revset: support raw string literals
Brodie Rao <brodie@bitheap.org>
parents:
12401
diff
changeset
|
69 else: |
26233
d3dbb65c8dc6
fileset: handle error of string unescaping
Yuya Nishihara <yuya@tcha.org>
parents:
26195
diff
changeset
|
70 decode = parser.unescapestr |
11275 | 71 pos += 1 |
72 s = pos | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
73 while pos < l: # find closing quote |
11275 | 74 d = program[pos] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
75 if d == b'\\': # skip over escaped characters |
11275 | 76 pos += 2 |
77 continue | |
78 if d == c: | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
79 yield (b'string', decode(program[s:pos]), s) |
11275 | 80 break |
81 pos += 1 | |
82 else: | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
83 raise error.ParseError(_(b"unterminated string"), s) |
14551
68d814a3cefd
fileset: basic pattern and boolean support
Matt Mackall <mpm@selenic.com>
parents:
14513
diff
changeset
|
84 elif c.isalnum() or c in globchars or ord(c) > 127: |
14513 | 85 # gather up a symbol/keyword |
11275 | 86 s = pos |
87 pos += 1 | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
88 while pos < l: # find end of symbol |
11275 | 89 d = program[pos] |
14551
68d814a3cefd
fileset: basic pattern and boolean support
Matt Mackall <mpm@selenic.com>
parents:
14513
diff
changeset
|
90 if not (d.isalnum() or d in globchars or ord(d) > 127): |
11275 | 91 break |
92 pos += 1 | |
93 sym = program[s:pos] | |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
94 if sym in keywords: # operator keywords |
11289
4215ce511134
revset: raise ParseError exceptions
Matt Mackall <mpm@selenic.com>
parents:
11284
diff
changeset
|
95 yield (sym, None, s) |
11275 | 96 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
97 yield (b'symbol', sym, s) |
11275 | 98 pos -= 1 |
99 else: | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
100 raise error.ParseError(_(b"syntax error"), pos) |
11275 | 101 pos += 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
102 yield (b'end', None, pos) |
11275 | 103 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
104 |
20208
61a47fd64f30
fileset, revset: do not use global parser object for thread safety
Yuya Nishihara <yuya@tcha.org>
parents:
19470
diff
changeset
|
105 def parse(expr): |
25654
af329a84310c
parser: accept iterator of tokens instead of tokenizer function and program
Yuya Nishihara <yuya@tcha.org>
parents:
25633
diff
changeset
|
106 p = parser.parser(elements) |
af329a84310c
parser: accept iterator of tokens instead of tokenizer function and program
Yuya Nishihara <yuya@tcha.org>
parents:
25633
diff
changeset
|
107 tree, pos = p.parse(tokenize(expr)) |
25252
ac381dd7a21f
fileset: move validation of incomplete parsing to parse() function
Yuya Nishihara <yuya@tcha.org>
parents:
24408
diff
changeset
|
108 if pos != len(expr): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
109 raise error.ParseError(_(b"invalid token"), pos) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
110 return parser.simplifyinfixops(tree, {b'list', b'or'}) |
11275 | 111 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
112 |
35691
735f47b41521
fileset: make it robust for bad function calls
Yuya Nishihara <yuya@tcha.org>
parents:
35615
diff
changeset
|
113 def getsymbol(x): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
114 if x and x[0] == b'symbol': |
35691
735f47b41521
fileset: make it robust for bad function calls
Yuya Nishihara <yuya@tcha.org>
parents:
35615
diff
changeset
|
115 return x[1] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
116 raise error.ParseError(_(b'not a symbol')) |
35691
735f47b41521
fileset: make it robust for bad function calls
Yuya Nishihara <yuya@tcha.org>
parents:
35615
diff
changeset
|
117 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
118 |
14551
68d814a3cefd
fileset: basic pattern and boolean support
Matt Mackall <mpm@selenic.com>
parents:
14513
diff
changeset
|
119 def getstring(x, err): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
120 if x and (x[0] == b'string' or x[0] == b'symbol'): |
14551
68d814a3cefd
fileset: basic pattern and boolean support
Matt Mackall <mpm@selenic.com>
parents:
14513
diff
changeset
|
121 return x[1] |
68d814a3cefd
fileset: basic pattern and boolean support
Matt Mackall <mpm@selenic.com>
parents:
14513
diff
changeset
|
122 raise error.ParseError(err) |
68d814a3cefd
fileset: basic pattern and boolean support
Matt Mackall <mpm@selenic.com>
parents:
14513
diff
changeset
|
123 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
124 |
38805
b9162ea1b815
fileset: extract language processing part to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
38804
diff
changeset
|
125 def getkindpat(x, y, allkinds, err): |
35741
73432eee0ac4
fileset: add kind:pat operator
Yuya Nishihara <yuya@tcha.org>
parents:
35739
diff
changeset
|
126 kind = getsymbol(x) |
73432eee0ac4
fileset: add kind:pat operator
Yuya Nishihara <yuya@tcha.org>
parents:
35739
diff
changeset
|
127 pat = getstring(y, err) |
73432eee0ac4
fileset: add kind:pat operator
Yuya Nishihara <yuya@tcha.org>
parents:
35739
diff
changeset
|
128 if kind not in allkinds: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
129 raise error.ParseError(_(b"invalid pattern kind: %s") % kind) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
130 return b'%s:%s' % (kind, pat) |
35741
73432eee0ac4
fileset: add kind:pat operator
Yuya Nishihara <yuya@tcha.org>
parents:
35739
diff
changeset
|
131 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
132 |
35741
73432eee0ac4
fileset: add kind:pat operator
Yuya Nishihara <yuya@tcha.org>
parents:
35739
diff
changeset
|
133 def getpattern(x, allkinds, err): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
134 if x and x[0] == b'kindpat': |
38805
b9162ea1b815
fileset: extract language processing part to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
38804
diff
changeset
|
135 return getkindpat(x[1], x[2], allkinds, err) |
35741
73432eee0ac4
fileset: add kind:pat operator
Yuya Nishihara <yuya@tcha.org>
parents:
35739
diff
changeset
|
136 return getstring(x, err) |
73432eee0ac4
fileset: add kind:pat operator
Yuya Nishihara <yuya@tcha.org>
parents:
35739
diff
changeset
|
137 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
138 |
38598
d046bf37f1ba
fileset: move helper functions to top
Yuya Nishihara <yuya@tcha.org>
parents:
38414
diff
changeset
|
139 def getlist(x): |
d046bf37f1ba
fileset: move helper functions to top
Yuya Nishihara <yuya@tcha.org>
parents:
38414
diff
changeset
|
140 if not x: |
d046bf37f1ba
fileset: move helper functions to top
Yuya Nishihara <yuya@tcha.org>
parents:
38414
diff
changeset
|
141 return [] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
142 if x[0] == b'list': |
38803
4dc498d61d86
fileset: flatten arguments list
Yuya Nishihara <yuya@tcha.org>
parents:
38772
diff
changeset
|
143 return list(x[1:]) |
38598
d046bf37f1ba
fileset: move helper functions to top
Yuya Nishihara <yuya@tcha.org>
parents:
38414
diff
changeset
|
144 return [x] |
d046bf37f1ba
fileset: move helper functions to top
Yuya Nishihara <yuya@tcha.org>
parents:
38414
diff
changeset
|
145 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
146 |
38598
d046bf37f1ba
fileset: move helper functions to top
Yuya Nishihara <yuya@tcha.org>
parents:
38414
diff
changeset
|
147 def getargs(x, min, max, err): |
d046bf37f1ba
fileset: move helper functions to top
Yuya Nishihara <yuya@tcha.org>
parents:
38414
diff
changeset
|
148 l = getlist(x) |
d046bf37f1ba
fileset: move helper functions to top
Yuya Nishihara <yuya@tcha.org>
parents:
38414
diff
changeset
|
149 if len(l) < min or len(l) > max: |
d046bf37f1ba
fileset: move helper functions to top
Yuya Nishihara <yuya@tcha.org>
parents:
38414
diff
changeset
|
150 raise error.ParseError(err) |
d046bf37f1ba
fileset: move helper functions to top
Yuya Nishihara <yuya@tcha.org>
parents:
38414
diff
changeset
|
151 return l |
d046bf37f1ba
fileset: move helper functions to top
Yuya Nishihara <yuya@tcha.org>
parents:
38414
diff
changeset
|
152 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
153 |
38826
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
154 def _analyze(x): |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
155 if x is None: |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
156 return x |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
157 |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
158 op = x[0] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
159 if op in {b'string', b'symbol'}: |
38826
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
160 return x |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
161 if op == b'kindpat': |
38826
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
162 getsymbol(x[1]) # kind must be a symbol |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
163 t = _analyze(x[2]) |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
164 return (op, x[1], t) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
165 if op == b'group': |
38827
48fc2a8af345
fileset: drop 'group' node from tree to be evaluated
Yuya Nishihara <yuya@tcha.org>
parents:
38826
diff
changeset
|
166 return _analyze(x[1]) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
167 if op == b'negate': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
168 raise error.ParseError(_(b"can't use negate operator in this context")) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
169 if op == b'not': |
38826
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
170 t = _analyze(x[1]) |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
171 return (op, t) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
172 if op == b'and': |
38826
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
173 ta = _analyze(x[1]) |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
174 tb = _analyze(x[2]) |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
175 return (op, ta, tb) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
176 if op == b'minus': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
177 return _analyze((b'and', x[1], (b'not', x[2]))) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
178 if op in {b'list', b'or'}: |
38826
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
179 ts = tuple(_analyze(y) for y in x[1:]) |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
180 return (op,) + ts |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
181 if op == b'func': |
38826
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
182 getsymbol(x[1]) # function name must be a symbol |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
183 ta = _analyze(x[2]) |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
184 return (op, x[1], ta) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
185 raise error.ProgrammingError(b'invalid operator %r' % op) |
38826
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
186 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
187 |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
188 def _insertstatushints(x): |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
189 """Insert hint nodes where status should be calculated (first path) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
190 |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
191 This works in bottom-up way, summing up status names and inserting hint |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
192 nodes at 'and' and 'or' as needed. Thus redundant hint nodes may be left. |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
193 |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
194 Returns (status-names, new-tree) at the given subtree, where status-names |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
195 is a sum of status names referenced in the given subtree. |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
196 """ |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
197 if x is None: |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
198 return (), x |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
199 |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
200 op = x[0] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
201 if op in {b'string', b'symbol', b'kindpat'}: |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
202 return (), x |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
203 if op == b'not': |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
204 h, t = _insertstatushints(x[1]) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
205 return h, (op, t) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
206 if op == b'and': |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
207 ha, ta = _insertstatushints(x[1]) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
208 hb, tb = _insertstatushints(x[2]) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
209 hr = ha + hb |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
210 if ha and hb: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
211 return hr, (b'withstatus', (op, ta, tb), (b'string', b' '.join(hr))) |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
212 return hr, (op, ta, tb) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
213 if op == b'or': |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
214 hs, ts = zip(*(_insertstatushints(y) for y in x[1:])) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
215 hr = sum(hs, ()) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
216 if sum(bool(h) for h in hs) > 1: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
217 return hr, (b'withstatus', (op,) + ts, (b'string', b' '.join(hr))) |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
218 return hr, (op,) + ts |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
219 if op == b'list': |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
220 hs, ts = zip(*(_insertstatushints(y) for y in x[1:])) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
221 return sum(hs, ()), (op,) + ts |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
222 if op == b'func': |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
223 f = getsymbol(x[1]) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
224 # don't propagate 'ha' crossing a function boundary |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
225 ha, ta = _insertstatushints(x[2]) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
226 if getattr(symbols.get(f), '_callstatus', False): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
227 return (f,), (b'withstatus', (op, x[1], ta), (b'string', f)) |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
228 return (), (op, x[1], ta) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
229 raise error.ProgrammingError(b'invalid operator %r' % op) |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
230 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
231 |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
232 def _mergestatushints(x, instatus): |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
233 """Remove redundant status hint nodes (second path) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
234 |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
235 This is the top-down path to eliminate inner hint nodes. |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
236 """ |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
237 if x is None: |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
238 return x |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
239 |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
240 op = x[0] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
241 if op == b'withstatus': |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
242 if instatus: |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
243 # drop redundant hint node |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
244 return _mergestatushints(x[1], instatus) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
245 t = _mergestatushints(x[1], instatus=True) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
246 return (op, t, x[2]) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
247 if op in {b'string', b'symbol', b'kindpat'}: |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
248 return x |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
249 if op == b'not': |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
250 t = _mergestatushints(x[1], instatus) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
251 return (op, t) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
252 if op == b'and': |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
253 ta = _mergestatushints(x[1], instatus) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
254 tb = _mergestatushints(x[2], instatus) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
255 return (op, ta, tb) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
256 if op in {b'list', b'or'}: |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
257 ts = tuple(_mergestatushints(y, instatus) for y in x[1:]) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
258 return (op,) + ts |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
259 if op == b'func': |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
260 # don't propagate 'instatus' crossing a function boundary |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
261 ta = _mergestatushints(x[2], instatus=False) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
262 return (op, x[1], ta) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
263 raise error.ProgrammingError(b'invalid operator %r' % op) |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
264 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
265 |
38826
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
266 def analyze(x): |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
267 """Transform raw parsed tree to evaluatable tree which can be fed to |
38829
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
268 optimize() or getmatch() |
38826
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
269 |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
270 All pseudo operations should be mapped to real operations or functions |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
271 defined in methods or symbols table respectively. |
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
272 """ |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
273 t = _analyze(x) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
274 _h, t = _insertstatushints(t) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
275 return _mergestatushints(t, instatus=False) |
38826
6371ab78c3b3
fileset: add phase to transform parsed tree
Yuya Nishihara <yuya@tcha.org>
parents:
38805
diff
changeset
|
276 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
277 |
38832
ca4de8ba5b5f
fileset: optimize 'x and not y' to 'x - y'
Yuya Nishihara <yuya@tcha.org>
parents:
38831
diff
changeset
|
278 def _optimizeandops(op, ta, tb): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
279 if tb is not None and tb[0] == b'not': |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
280 return (b'minus', ta, tb[1]) |
38832
ca4de8ba5b5f
fileset: optimize 'x and not y' to 'x - y'
Yuya Nishihara <yuya@tcha.org>
parents:
38831
diff
changeset
|
281 return (op, ta, tb) |
ca4de8ba5b5f
fileset: optimize 'x and not y' to 'x - y'
Yuya Nishihara <yuya@tcha.org>
parents:
38831
diff
changeset
|
282 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
283 |
38865
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
284 def _optimizeunion(xs): |
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
285 # collect string patterns so they can be compiled into a single regexp |
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
286 ws, ts, ss = [], [], [] |
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
287 for x in xs: |
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
288 w, t = _optimize(x) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
289 if t is not None and t[0] in {b'string', b'symbol', b'kindpat'}: |
38865
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
290 ss.append(t) |
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
291 continue |
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
292 ws.append(w) |
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
293 ts.append(t) |
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
294 if ss: |
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
295 ws.append(WEIGHT_CHECK_FILENAME) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
296 ts.append((b'patterns',) + tuple(ss)) |
38865
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
297 return ws, ts |
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
298 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
299 |
38829
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
300 def _optimize(x): |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
301 if x is None: |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
302 return 0, x |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
303 |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
304 op = x[0] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
305 if op == b'withstatus': |
38879
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
306 w, t = _optimize(x[1]) |
e79a69af1593
fileset: insert hints where status should be computed
Yuya Nishihara <yuya@tcha.org>
parents:
38865
diff
changeset
|
307 return w, (op, t, x[2]) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
308 if op in {b'string', b'symbol'}: |
38863
61ab546b71c3
fileset: introduce weight constants for readability
Yuya Nishihara <yuya@tcha.org>
parents:
38832
diff
changeset
|
309 return WEIGHT_CHECK_FILENAME, x |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
310 if op == b'kindpat': |
38829
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
311 w, t = _optimize(x[2]) |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
312 return w, (op, x[1], t) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
313 if op == b'not': |
38829
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
314 w, t = _optimize(x[1]) |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
315 return w, (op, t) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
316 if op == b'and': |
38831
b975c5801487
fileset: reorder 'and' expression to evaluate basic patterns first
Yuya Nishihara <yuya@tcha.org>
parents:
38829
diff
changeset
|
317 wa, ta = _optimize(x[1]) |
b975c5801487
fileset: reorder 'and' expression to evaluate basic patterns first
Yuya Nishihara <yuya@tcha.org>
parents:
38829
diff
changeset
|
318 wb, tb = _optimize(x[2]) |
b975c5801487
fileset: reorder 'and' expression to evaluate basic patterns first
Yuya Nishihara <yuya@tcha.org>
parents:
38829
diff
changeset
|
319 if wa <= wb: |
38832
ca4de8ba5b5f
fileset: optimize 'x and not y' to 'x - y'
Yuya Nishihara <yuya@tcha.org>
parents:
38831
diff
changeset
|
320 return wa, _optimizeandops(op, ta, tb) |
38831
b975c5801487
fileset: reorder 'and' expression to evaluate basic patterns first
Yuya Nishihara <yuya@tcha.org>
parents:
38829
diff
changeset
|
321 else: |
38832
ca4de8ba5b5f
fileset: optimize 'x and not y' to 'x - y'
Yuya Nishihara <yuya@tcha.org>
parents:
38831
diff
changeset
|
322 return wb, _optimizeandops(op, tb, ta) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
323 if op == b'or': |
38865
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
324 ws, ts = _optimizeunion(x[1:]) |
899b4c74209c
fileset: combine union of basic patterns into single matcher
Yuya Nishihara <yuya@tcha.org>
parents:
38864
diff
changeset
|
325 if len(ts) == 1: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
326 return ws[0], ts[0] # 'or' operation is fully optimized out |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
327 ts = tuple( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
328 it[1] for it in sorted(enumerate(ts), key=lambda it: ws[it[0]]) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
329 ) |
38829
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
330 return max(ws), (op,) + ts |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
331 if op == b'list': |
38829
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
332 ws, ts = zip(*(_optimize(y) for y in x[1:])) |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
333 return sum(ws), (op,) + ts |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
334 if op == b'func': |
38829
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
335 f = getsymbol(x[1]) |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
336 w = getattr(symbols.get(f), '_weight', 1) |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
337 wa, ta = _optimize(x[2]) |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
338 return w + wa, (op, x[1], ta) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
339 raise error.ProgrammingError(b'invalid operator %r' % op) |
38829
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
340 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
341 |
38829
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
342 def optimize(x): |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
343 """Reorder/rewrite evaluatable tree for optimization |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
344 |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
345 All pseudo operations should be transformed beforehand. |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
346 """ |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
347 _w, t = _optimize(x) |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
348 return t |
7e7e2b2ff284
fileset: add stub for weight-based optimization
Yuya Nishihara <yuya@tcha.org>
parents:
38828
diff
changeset
|
349 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
38879
diff
changeset
|
350 |
25255
ad1d2c952889
fileset: pretty print syntax tree in debug output
Yuya Nishihara <yuya@tcha.org>
parents:
25252
diff
changeset
|
351 def prettyformat(tree): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
352 return parser.prettyformat(tree, (b'string', b'symbol')) |