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'