Mercurial > hg
comparison tests/test-command-template.t @ 30115:8e42dfde93d1
templater: provide arithmetic operations on integers
The termwidth template keyword is of limited use without some way to ensure
that margins are respected.
Provide a full set of arithmetic operators (four basic operations plus the
mod function, defined to match Python's // for division), so that you can
create termwidth based layouts that match the user's terminal size
author | Simon Farnsworth <simonfar@fb.com> |
---|---|
date | Sun, 09 Oct 2016 05:51:04 -0700 |
parents | d1f5f158768e |
children | 741e5d7f282d |
comparison
equal
deleted
inserted
replaced
30114:ad43458d3529 | 30115:8e42dfde93d1 |
---|---|
26 $ hg add d | 26 $ hg add d |
27 $ hg commit -m 'new head' -d '1500000 0' -u 'person' | 27 $ hg commit -m 'new head' -d '1500000 0' -u 'person' |
28 | 28 |
29 $ hg merge -q foo | 29 $ hg merge -q foo |
30 $ hg commit -m 'merge' -d '1500001 0' -u 'person' | 30 $ hg commit -m 'merge' -d '1500001 0' -u 'person' |
31 | |
32 Test arithmetic operators have the right precedence: | |
33 | |
34 $ hg log -l 1 -T '{date(date, "%s") + 5 * 10} {date(date, "%s") - 2 * 3}\n' | |
35 1500051 1499995 | |
36 $ hg log -l 1 -T '{date(date, "%s") * 5 + 10} {date(date, "%s") * 3 - 2}\n' | |
37 7500015 4500001 | |
38 | |
39 Test division: | |
40 | |
41 $ hg debugtemplate -r0 -v '{5 / 2} {mod(5, 2)}\n' | |
42 (template | |
43 (/ | |
44 ('integer', '5') | |
45 ('integer', '2')) | |
46 ('string', ' ') | |
47 (func | |
48 ('symbol', 'mod') | |
49 (list | |
50 ('integer', '5') | |
51 ('integer', '2'))) | |
52 ('string', '\n')) | |
53 2 1 | |
54 $ hg debugtemplate -r0 -v '{5 / -2} {mod(5, -2)}\n' | |
55 (template | |
56 (/ | |
57 ('integer', '5') | |
58 (negate | |
59 ('integer', '2'))) | |
60 ('string', ' ') | |
61 (func | |
62 ('symbol', 'mod') | |
63 (list | |
64 ('integer', '5') | |
65 (negate | |
66 ('integer', '2')))) | |
67 ('string', '\n')) | |
68 -3 -1 | |
69 $ hg debugtemplate -r0 -v '{-5 / 2} {mod(-5, 2)}\n' | |
70 (template | |
71 (/ | |
72 (negate | |
73 ('integer', '5')) | |
74 ('integer', '2')) | |
75 ('string', ' ') | |
76 (func | |
77 ('symbol', 'mod') | |
78 (list | |
79 (negate | |
80 ('integer', '5')) | |
81 ('integer', '2'))) | |
82 ('string', '\n')) | |
83 -3 1 | |
84 $ hg debugtemplate -r0 -v '{-5 / -2} {mod(-5, -2)}\n' | |
85 (template | |
86 (/ | |
87 (negate | |
88 ('integer', '5')) | |
89 (negate | |
90 ('integer', '2'))) | |
91 ('string', ' ') | |
92 (func | |
93 ('symbol', 'mod') | |
94 (list | |
95 (negate | |
96 ('integer', '5')) | |
97 (negate | |
98 ('integer', '2')))) | |
99 ('string', '\n')) | |
100 2 -1 | |
101 | |
102 Filters bind closer than arithmetic: | |
103 | |
104 $ hg debugtemplate -r0 -v '{revset(".")|count - 1}\n' | |
105 (template | |
106 (- | |
107 (| | |
108 (func | |
109 ('symbol', 'revset') | |
110 ('string', '.')) | |
111 ('symbol', 'count')) | |
112 ('integer', '1')) | |
113 ('string', '\n')) | |
114 0 | |
115 | |
116 But negate binds closer still: | |
117 | |
118 $ hg debugtemplate -r0 -v '{1-3|stringify}\n' | |
119 (template | |
120 (- | |
121 ('integer', '1') | |
122 (| | |
123 ('integer', '3') | |
124 ('symbol', 'stringify'))) | |
125 ('string', '\n')) | |
126 hg: parse error: arithmetic only defined on integers | |
127 [255] | |
128 $ hg debugtemplate -r0 -v '{-3|stringify}\n' | |
129 (template | |
130 (| | |
131 (negate | |
132 ('integer', '3')) | |
133 ('symbol', 'stringify')) | |
134 ('string', '\n')) | |
135 -3 | |
31 | 136 |
32 Second branch starting at nullrev: | 137 Second branch starting at nullrev: |
33 | 138 |
34 $ hg update null | 139 $ hg update null |
35 0 files updated, 0 files merged, 4 files removed, 0 files unresolved | 140 0 files updated, 0 files merged, 4 files removed, 0 files unresolved |
2888 ('string', '\n')) | 2993 ('string', '\n')) |
2889 123 | 2994 123 |
2890 $ hg debugtemplate -v '{(-4)}\n' | 2995 $ hg debugtemplate -v '{(-4)}\n' |
2891 (template | 2996 (template |
2892 (group | 2997 (group |
2893 ('integer', '-4')) | 2998 (negate |
2999 ('integer', '4'))) | |
2894 ('string', '\n')) | 3000 ('string', '\n')) |
2895 -4 | 3001 -4 |
2896 $ hg debugtemplate '{(-)}\n' | 3002 $ hg debugtemplate '{(-)}\n' |
2897 hg: parse error at 2: integer literal without digits | 3003 hg: parse error at 3: not a prefix: ) |
2898 [255] | 3004 [255] |
2899 $ hg debugtemplate '{(-a)}\n' | 3005 $ hg debugtemplate '{(-a)}\n' |
2900 hg: parse error at 2: integer literal without digits | 3006 hg: parse error: negation needs an integer argument |
2901 [255] | 3007 [255] |
2902 | 3008 |
2903 top-level integer literal is interpreted as symbol (i.e. variable name): | 3009 top-level integer literal is interpreted as symbol (i.e. variable name): |
2904 | 3010 |
2905 $ hg debugtemplate -D 1=one -v '{1}\n' | 3011 $ hg debugtemplate -D 1=one -v '{1}\n' |