##// END OF EJS Templates
gitweb: apply styles from annotate tooltip to followlines popup...
av6 -
r35026:b445fc69 default
parent child Browse files
Show More
@@ -1,390 +1,389 b''
1 body { font-family: sans-serif; font-size: 12px; border:solid #d9d8d1; border-width:1px; margin:10px; background: white; color: black; }
1 body { font-family: sans-serif; font-size: 12px; border:solid #d9d8d1; border-width:1px; margin:10px; background: white; color: black; }
2 a { color:#0000cc; }
2 a { color:#0000cc; }
3 a:hover, a:visited, a:active { color:#880000; }
3 a:hover, a:visited, a:active { color:#880000; }
4 div.page_header { height:25px; padding:8px; font-size:18px; font-weight:bold; background-color:#d9d8d1; }
4 div.page_header { height:25px; padding:8px; font-size:18px; font-weight:bold; background-color:#d9d8d1; }
5 div.page_header a:visited { color:#0000cc; }
5 div.page_header a:visited { color:#0000cc; }
6 div.page_header a:hover { color:#880000; }
6 div.page_header a:hover { color:#880000; }
7 div.page_nav {
7 div.page_nav {
8 padding:8px;
8 padding:8px;
9 display: flex;
9 display: flex;
10 justify-content: space-between;
10 justify-content: space-between;
11 align-items: center;
11 align-items: center;
12 }
12 }
13 div.page_nav a:visited { color:#0000cc; }
13 div.page_nav a:visited { color:#0000cc; }
14 div.extra_nav {
14 div.extra_nav {
15 padding: 8px;
15 padding: 8px;
16 }
16 }
17 div.extra_nav a:visited {
17 div.extra_nav a:visited {
18 color: #0000cc;
18 color: #0000cc;
19 }
19 }
20 div.page_path { padding:8px; border:solid #d9d8d1; border-width:0px 0px 1px}
20 div.page_path { padding:8px; border:solid #d9d8d1; border-width:0px 0px 1px}
21 div.page_footer { padding:4px 8px; background-color: #d9d8d1; }
21 div.page_footer { padding:4px 8px; background-color: #d9d8d1; }
22 div.page_footer_text { float:left; color:#555555; font-style:italic; }
22 div.page_footer_text { float:left; color:#555555; font-style:italic; }
23 div.page_body { padding:8px; }
23 div.page_body { padding:8px; }
24 div.title, a.title {
24 div.title, a.title {
25 display:block; padding:6px 8px;
25 display:block; padding:6px 8px;
26 font-weight:bold; background-color:#edece6; text-decoration:none; color:#000000;
26 font-weight:bold; background-color:#edece6; text-decoration:none; color:#000000;
27 }
27 }
28 a.title:hover { background-color: #d9d8d1; }
28 a.title:hover { background-color: #d9d8d1; }
29 div.title_text { padding:6px 0px; border: solid #d9d8d1; border-width:0px 0px 1px; }
29 div.title_text { padding:6px 0px; border: solid #d9d8d1; border-width:0px 0px 1px; }
30 div.log_body { padding:8px 8px 8px 150px; }
30 div.log_body { padding:8px 8px 8px 150px; }
31 .age { white-space:nowrap; }
31 .age { white-space:nowrap; }
32 span.age { position:relative; float:left; width:142px; font-style:italic; }
32 span.age { position:relative; float:left; width:142px; font-style:italic; }
33 div.log_link {
33 div.log_link {
34 padding:0px 8px;
34 padding:0px 8px;
35 font-size:10px; font-family:sans-serif; font-style:normal;
35 font-size:10px; font-family:sans-serif; font-style:normal;
36 position:relative; float:left; width:136px;
36 position:relative; float:left; width:136px;
37 }
37 }
38 div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; }
38 div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; }
39 a.list { text-decoration:none; color:#000000; }
39 a.list { text-decoration:none; color:#000000; }
40 a.list:hover { text-decoration:underline; color:#880000; }
40 a.list:hover { text-decoration:underline; color:#880000; }
41 table { padding:8px 4px; }
41 table { padding:8px 4px; }
42 th { padding:2px 5px; font-size:12px; text-align:left; }
42 th { padding:2px 5px; font-size:12px; text-align:left; }
43 .parity0 { background-color:#ffffff; }
43 .parity0 { background-color:#ffffff; }
44 tr.dark, .parity1, pre.sourcelines.stripes > :nth-child(4n+4) { background-color:#f6f6f0; }
44 tr.dark, .parity1, pre.sourcelines.stripes > :nth-child(4n+4) { background-color:#f6f6f0; }
45 tr.light:hover, .parity0:hover, tr.dark:hover, .parity1:hover,
45 tr.light:hover, .parity0:hover, tr.dark:hover, .parity1:hover,
46 pre.sourcelines.stripes > :nth-child(4n+2):hover,
46 pre.sourcelines.stripes > :nth-child(4n+2):hover,
47 pre.sourcelines.stripes > :nth-child(4n+4):hover,
47 pre.sourcelines.stripes > :nth-child(4n+4):hover,
48 pre.sourcelines.stripes > :nth-child(4n+1):hover + :nth-child(4n+2),
48 pre.sourcelines.stripes > :nth-child(4n+1):hover + :nth-child(4n+2),
49 pre.sourcelines.stripes > :nth-child(4n+3):hover + :nth-child(4n+4) { background-color:#edece6; }
49 pre.sourcelines.stripes > :nth-child(4n+3):hover + :nth-child(4n+4) { background-color:#edece6; }
50 td { padding:2px 5px; font-size:12px; vertical-align:top; }
50 td { padding:2px 5px; font-size:12px; vertical-align:top; }
51 td.closed { background-color: #99f; }
51 td.closed { background-color: #99f; }
52 td.link { padding:2px 5px; font-family:sans-serif; font-size:10px; }
52 td.link { padding:2px 5px; font-family:sans-serif; font-size:10px; }
53 td.indexlinks { white-space: nowrap; }
53 td.indexlinks { white-space: nowrap; }
54 td.indexlinks a {
54 td.indexlinks a {
55 padding: 2px 5px; line-height: 10px;
55 padding: 2px 5px; line-height: 10px;
56 border: 1px solid;
56 border: 1px solid;
57 color: #ffffff; background-color: #7777bb;
57 color: #ffffff; background-color: #7777bb;
58 border-color: #aaaadd #333366 #333366 #aaaadd;
58 border-color: #aaaadd #333366 #333366 #aaaadd;
59 font-weight: bold; text-align: center; text-decoration: none;
59 font-weight: bold; text-align: center; text-decoration: none;
60 font-size: 10px;
60 font-size: 10px;
61 }
61 }
62 td.indexlinks a:hover { background-color: #6666aa; }
62 td.indexlinks a:hover { background-color: #6666aa; }
63 div.pre { font-family:monospace; font-size:12px; white-space:pre; }
63 div.pre { font-family:monospace; font-size:12px; white-space:pre; }
64 div.diff_info { font-family:monospace; color:#000099; background-color:#edece6; font-style:italic; }
64 div.diff_info { font-family:monospace; color:#000099; background-color:#edece6; font-style:italic; }
65 div.index_include { border:solid #d9d8d1; border-width:0px 0px 1px; padding:12px 8px; }
65 div.index_include { border:solid #d9d8d1; border-width:0px 0px 1px; padding:12px 8px; }
66
66
67 .search {
67 .search {
68 margin-right: 8px;
68 margin-right: 8px;
69 }
69 }
70
70
71 div#hint {
71 div#hint {
72 position: absolute;
72 position: absolute;
73 display: none;
73 display: none;
74 width: 250px;
74 width: 250px;
75 padding: 5px;
75 padding: 5px;
76 background: #ffc;
76 background: #ffc;
77 border: 1px solid yellow;
77 border: 1px solid yellow;
78 border-radius: 5px;
78 border-radius: 5px;
79 }
79 }
80
80
81 #searchform:hover div#hint { display: block; }
81 #searchform:hover div#hint { display: block; }
82
82
83 tr.thisrev a { color:#999999; text-decoration: none; }
83 tr.thisrev a { color:#999999; text-decoration: none; }
84 tr.thisrev pre { color:#009900; }
84 tr.thisrev pre { color:#009900; }
85 td.annotate {
85 td.annotate {
86 white-space: nowrap;
86 white-space: nowrap;
87 }
87 }
88 div.annotate-info {
88 div.annotate-info {
89 z-index: 5;
89 z-index: 5;
90 display: none;
90 display: none;
91 position: absolute;
91 position: absolute;
92 background-color: #FFFFFF;
92 background-color: #FFFFFF;
93 border: 1px solid #d9d8d1;
93 border: 1px solid #d9d8d1;
94 text-align: left;
94 text-align: left;
95 color: #000000;
95 color: #000000;
96 padding: 5px;
96 padding: 5px;
97 }
97 }
98 div.annotate-info a { color: #0000FF; text-decoration: underline; }
98 div.annotate-info a { color: #0000FF; text-decoration: underline; }
99 td.annotate:hover div.annotate-info { display: inline; }
99 td.annotate:hover div.annotate-info { display: inline; }
100
100
101 #diffopts-form {
101 #diffopts-form {
102 padding-left: 8px;
102 padding-left: 8px;
103 display: none;
103 display: none;
104 }
104 }
105
105
106 .linenr { color:#999999; text-decoration:none }
106 .linenr { color:#999999; text-decoration:none }
107 div.rss_logo { float: right; white-space: nowrap; }
107 div.rss_logo { float: right; white-space: nowrap; }
108 div.rss_logo a {
108 div.rss_logo a {
109 padding:3px 6px; line-height:10px;
109 padding:3px 6px; line-height:10px;
110 border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
110 border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
111 color:#ffffff; background-color:#ff6600;
111 color:#ffffff; background-color:#ff6600;
112 font-weight:bold; font-family:sans-serif; font-size:10px;
112 font-weight:bold; font-family:sans-serif; font-size:10px;
113 text-align:center; text-decoration:none;
113 text-align:center; text-decoration:none;
114 }
114 }
115 div.rss_logo a:hover { background-color:#ee5500; }
115 div.rss_logo a:hover { background-color:#ee5500; }
116 pre { margin: 0; }
116 pre { margin: 0; }
117 span.logtags span {
117 span.logtags span {
118 padding: 0px 4px;
118 padding: 0px 4px;
119 font-size: 10px;
119 font-size: 10px;
120 font-weight: normal;
120 font-weight: normal;
121 border: 1px solid;
121 border: 1px solid;
122 background-color: #ffaaff;
122 background-color: #ffaaff;
123 border-color: #ffccff #ff00ee #ff00ee #ffccff;
123 border-color: #ffccff #ff00ee #ff00ee #ffccff;
124 }
124 }
125 span.logtags span.tagtag {
125 span.logtags span.tagtag {
126 background-color: #ffffaa;
126 background-color: #ffffaa;
127 border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
127 border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
128 }
128 }
129 span.logtags span.branchtag {
129 span.logtags span.branchtag {
130 background-color: #aaffaa;
130 background-color: #aaffaa;
131 border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
131 border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
132 }
132 }
133 span.logtags span.inbranchtag {
133 span.logtags span.inbranchtag {
134 background-color: #d5dde6;
134 background-color: #d5dde6;
135 border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
135 border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
136 }
136 }
137 span.logtags span.bookmarktag {
137 span.logtags span.bookmarktag {
138 background-color: #afdffa;
138 background-color: #afdffa;
139 border-color: #ccecff #46ace6 #46ace6 #ccecff;
139 border-color: #ccecff #46ace6 #46ace6 #ccecff;
140 }
140 }
141 span.difflineplus { color:#008800; }
141 span.difflineplus { color:#008800; }
142 span.difflineminus { color:#cc0000; }
142 span.difflineminus { color:#cc0000; }
143 span.difflineat { color:#990099; }
143 span.difflineat { color:#990099; }
144 div.diffblocks { counter-reset: lineno; }
144 div.diffblocks { counter-reset: lineno; }
145 div.diffblock { counter-increment: lineno; }
145 div.diffblock { counter-increment: lineno; }
146 pre.sourcelines { position: relative; counter-reset: lineno; }
146 pre.sourcelines { position: relative; counter-reset: lineno; }
147 pre.sourcelines > span {
147 pre.sourcelines > span {
148 display: inline-block;
148 display: inline-block;
149 box-sizing: border-box;
149 box-sizing: border-box;
150 width: 100%;
150 width: 100%;
151 padding: 0 0 0 5em;
151 padding: 0 0 0 5em;
152 counter-increment: lineno;
152 counter-increment: lineno;
153 vertical-align: top;
153 vertical-align: top;
154 }
154 }
155 pre.sourcelines > span:before {
155 pre.sourcelines > span:before {
156 -moz-user-select: -moz-none;
156 -moz-user-select: -moz-none;
157 -khtml-user-select: none;
157 -khtml-user-select: none;
158 -webkit-user-select: none;
158 -webkit-user-select: none;
159 -ms-user-select: none;
159 -ms-user-select: none;
160 user-select: none;
160 user-select: none;
161 display: inline-block;
161 display: inline-block;
162 margin-left: -6em;
162 margin-left: -6em;
163 width: 4em;
163 width: 4em;
164 color: #999;
164 color: #999;
165 text-align: right;
165 text-align: right;
166 content: counters(lineno,".");
166 content: counters(lineno,".");
167 float: left;
167 float: left;
168 }
168 }
169 pre.sourcelines > a {
169 pre.sourcelines > a {
170 display: inline-block;
170 display: inline-block;
171 position: absolute;
171 position: absolute;
172 left: 0px;
172 left: 0px;
173 width: 4em;
173 width: 4em;
174 height: 1em;
174 height: 1em;
175 }
175 }
176 tr:target td,
176 tr:target td,
177 pre.sourcelines > span:target,
177 pre.sourcelines > span:target,
178 pre.sourcelines.stripes > span:target {
178 pre.sourcelines.stripes > span:target {
179 background-color: #bfdfff;
179 background-color: #bfdfff;
180 }
180 }
181
181
182 .description {
182 .description {
183 font-family: monospace;
183 font-family: monospace;
184 white-space: pre;
184 white-space: pre;
185 }
185 }
186
186
187 /* Followlines */
187 /* Followlines */
188 tbody.sourcelines > tr.followlines-selected,
188 tbody.sourcelines > tr.followlines-selected,
189 pre.sourcelines > span.followlines-selected {
189 pre.sourcelines > span.followlines-selected {
190 background-color: #99C7E9 !important;
190 background-color: #99C7E9 !important;
191 }
191 }
192
192
193 div#followlines {
193 div#followlines {
194 background-color: #B7B7B7;
194 background-color: #FFF;
195 border: 1px solid #CCC;
195 border: 1px solid #d9d8d1;
196 border-radius: 5px;
196 padding: 5px;
197 padding: 4px;
198 position: fixed;
197 position: fixed;
199 }
198 }
200
199
201 div.followlines-cancel {
200 div.followlines-cancel {
202 text-align: right;
201 text-align: right;
203 }
202 }
204
203
205 div.followlines-cancel > button {
204 div.followlines-cancel > button {
206 line-height: 80%;
205 line-height: 80%;
207 padding: 0;
206 padding: 0;
208 border: 0;
207 border: 0;
209 border-radius: 2px;
208 border-radius: 2px;
210 background-color: inherit;
209 background-color: inherit;
211 font-weight: bold;
210 font-weight: bold;
212 }
211 }
213
212
214 div.followlines-cancel > button:hover {
213 div.followlines-cancel > button:hover {
215 color: #FFFFFF;
214 color: #FFFFFF;
216 background-color: #CF1F1F;
215 background-color: #CF1F1F;
217 }
216 }
218
217
219 div.followlines-link {
218 div.followlines-link {
220 margin: 2px;
219 margin: 2px;
221 margin-top: 4px;
220 margin-top: 4px;
222 font-family: sans-serif;
221 font-family: sans-serif;
223 }
222 }
224
223
225 .btn-followlines {
224 .btn-followlines {
226 display: none;
225 display: none;
227 cursor: pointer;
226 cursor: pointer;
228 box-sizing: content-box;
227 box-sizing: content-box;
229 font-size: 11px;
228 font-size: 11px;
230 width: 13px;
229 width: 13px;
231 height: 13px;
230 height: 13px;
232 border-radius: 3px;
231 border-radius: 3px;
233 margin: 0px;
232 margin: 0px;
234 margin-top: -2px;
233 margin-top: -2px;
235 padding: 0px;
234 padding: 0px;
236 background-color: #E5FDE5;
235 background-color: #E5FDE5;
237 border: 1px solid #9BC19B;
236 border: 1px solid #9BC19B;
238 font-family: monospace;
237 font-family: monospace;
239 text-align: center;
238 text-align: center;
240 line-height: 5px;
239 line-height: 5px;
241 }
240 }
242
241
243 tr .btn-followlines {
242 tr .btn-followlines {
244 position: absolute;
243 position: absolute;
245 }
244 }
246
245
247 span .btn-followlines {
246 span .btn-followlines {
248 float: left;
247 float: left;
249 }
248 }
250
249
251 span.followlines-select .btn-followlines {
250 span.followlines-select .btn-followlines {
252 margin-left: -1.6em;
251 margin-left: -1.6em;
253 }
252 }
254
253
255 .btn-followlines:hover {
254 .btn-followlines:hover {
256 transform: scale(1.1, 1.1);
255 transform: scale(1.1, 1.1);
257 }
256 }
258
257
259 .btn-followlines .followlines-plus {
258 .btn-followlines .followlines-plus {
260 color: green;
259 color: green;
261 }
260 }
262
261
263 .btn-followlines .followlines-minus {
262 .btn-followlines .followlines-minus {
264 color: red;
263 color: red;
265 }
264 }
266
265
267 .btn-followlines-end {
266 .btn-followlines-end {
268 background-color: #ffdcdc;
267 background-color: #ffdcdc;
269 }
268 }
270
269
271 .sourcelines tr:hover .btn-followlines,
270 .sourcelines tr:hover .btn-followlines,
272 .sourcelines span.followlines-select:hover > .btn-followlines {
271 .sourcelines span.followlines-select:hover > .btn-followlines {
273 display: inline;
272 display: inline;
274 }
273 }
275
274
276 .btn-followlines-hidden,
275 .btn-followlines-hidden,
277 .sourcelines tr:hover .btn-followlines-hidden {
276 .sourcelines tr:hover .btn-followlines-hidden {
278 display: none;
277 display: none;
279 }
278 }
280
279
281 /* Graph */
280 /* Graph */
282 div#wrapper {
281 div#wrapper {
283 position: relative;
282 position: relative;
284 margin: 0;
283 margin: 0;
285 padding: 0;
284 padding: 0;
286 margin-top: 3px;
285 margin-top: 3px;
287 }
286 }
288
287
289 canvas {
288 canvas {
290 position: absolute;
289 position: absolute;
291 z-index: 5;
290 z-index: 5;
292 top: -0.9em;
291 top: -0.9em;
293 margin: 0;
292 margin: 0;
294 }
293 }
295
294
296 ul#nodebgs {
295 ul#nodebgs {
297 list-style: none inside none;
296 list-style: none inside none;
298 padding: 0;
297 padding: 0;
299 margin: 0;
298 margin: 0;
300 top: -0.7em;
299 top: -0.7em;
301 }
300 }
302
301
303 ul#graphnodes li, ul#nodebgs li {
302 ul#graphnodes li, ul#nodebgs li {
304 height: 39px;
303 height: 39px;
305 }
304 }
306
305
307 ul#graphnodes {
306 ul#graphnodes {
308 position: absolute;
307 position: absolute;
309 z-index: 10;
308 z-index: 10;
310 top: -0.8em;
309 top: -0.8em;
311 list-style: none inside none;
310 list-style: none inside none;
312 padding: 0;
311 padding: 0;
313 }
312 }
314
313
315 ul#graphnodes li .info {
314 ul#graphnodes li .info {
316 display: block;
315 display: block;
317 font-size: 100%;
316 font-size: 100%;
318 position: relative;
317 position: relative;
319 top: -3px;
318 top: -3px;
320 font-style: italic;
319 font-style: italic;
321 }
320 }
322
321
323 /* Comparison */
322 /* Comparison */
324 .legend {
323 .legend {
325 padding: 1.5% 0 1.5% 0;
324 padding: 1.5% 0 1.5% 0;
326 }
325 }
327
326
328 .legendinfo {
327 .legendinfo {
329 border: 1px solid #d9d8d1;
328 border: 1px solid #d9d8d1;
330 font-size: 80%;
329 font-size: 80%;
331 text-align: center;
330 text-align: center;
332 padding: 0.5%;
331 padding: 0.5%;
333 }
332 }
334
333
335 .equal {
334 .equal {
336 background-color: #ffffff;
335 background-color: #ffffff;
337 }
336 }
338
337
339 .delete {
338 .delete {
340 background-color: #faa;
339 background-color: #faa;
341 color: #333;
340 color: #333;
342 }
341 }
343
342
344 .insert {
343 .insert {
345 background-color: #ffa;
344 background-color: #ffa;
346 }
345 }
347
346
348 .replace {
347 .replace {
349 background-color: #e8e8e8;
348 background-color: #e8e8e8;
350 }
349 }
351
350
352 .comparison {
351 .comparison {
353 overflow-x: auto;
352 overflow-x: auto;
354 }
353 }
355
354
356 .header th {
355 .header th {
357 text-align: center;
356 text-align: center;
358 }
357 }
359
358
360 .block {
359 .block {
361 border-top: 1px solid #d9d8d1;
360 border-top: 1px solid #d9d8d1;
362 }
361 }
363
362
364 .scroll-loading {
363 .scroll-loading {
365 -webkit-animation: change_color 1s linear 0s infinite alternate;
364 -webkit-animation: change_color 1s linear 0s infinite alternate;
366 -moz-animation: change_color 1s linear 0s infinite alternate;
365 -moz-animation: change_color 1s linear 0s infinite alternate;
367 -o-animation: change_color 1s linear 0s infinite alternate;
366 -o-animation: change_color 1s linear 0s infinite alternate;
368 animation: change_color 1s linear 0s infinite alternate;
367 animation: change_color 1s linear 0s infinite alternate;
369 }
368 }
370
369
371 @-webkit-keyframes change_color {
370 @-webkit-keyframes change_color {
372 from { background-color: #A0CEFF; } to { }
371 from { background-color: #A0CEFF; } to { }
373 }
372 }
374 @-moz-keyframes change_color {
373 @-moz-keyframes change_color {
375 from { background-color: #A0CEFF; } to { }
374 from { background-color: #A0CEFF; } to { }
376 }
375 }
377 @-o-keyframes change_color {
376 @-o-keyframes change_color {
378 from { background-color: #A0CEFF; } to { }
377 from { background-color: #A0CEFF; } to { }
379 }
378 }
380 @keyframes change_color {
379 @keyframes change_color {
381 from { background-color: #A0CEFF; } to { }
380 from { background-color: #A0CEFF; } to { }
382 }
381 }
383
382
384 .scroll-loading-error {
383 .scroll-loading-error {
385 background-color: #FFCCCC !important;
384 background-color: #FFCCCC !important;
386 }
385 }
387
386
388 #doc {
387 #doc {
389 margin: 0 8px;
388 margin: 0 8px;
390 }
389 }
@@ -1,880 +1,879 b''
1 #require serve
1 #require serve
2
2
3 Some tests for hgweb. Tests static files, plain files and different 404's.
3 Some tests for hgweb. Tests static files, plain files and different 404's.
4
4
5 $ hg init test
5 $ hg init test
6 $ cd test
6 $ cd test
7 $ mkdir da
7 $ mkdir da
8 $ echo foo > da/foo
8 $ echo foo > da/foo
9 $ echo foo > foo
9 $ echo foo > foo
10 $ hg ci -Ambase
10 $ hg ci -Ambase
11 adding da/foo
11 adding da/foo
12 adding foo
12 adding foo
13 $ hg bookmark -r0 '@'
13 $ hg bookmark -r0 '@'
14 $ hg bookmark -r0 'a b c'
14 $ hg bookmark -r0 'a b c'
15 $ hg bookmark -r0 'd/e/f'
15 $ hg bookmark -r0 'd/e/f'
16 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
16 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
17 $ cat hg.pid >> $DAEMON_PIDS
17 $ cat hg.pid >> $DAEMON_PIDS
18
18
19 manifest
19 manifest
20
20
21 $ (get-with-headers.py localhost:$HGPORT 'file/tip/?style=raw')
21 $ (get-with-headers.py localhost:$HGPORT 'file/tip/?style=raw')
22 200 Script output follows
22 200 Script output follows
23
23
24
24
25 drwxr-xr-x da
25 drwxr-xr-x da
26 -rw-r--r-- 4 foo
26 -rw-r--r-- 4 foo
27
27
28
28
29 $ (get-with-headers.py localhost:$HGPORT 'file/tip/da?style=raw')
29 $ (get-with-headers.py localhost:$HGPORT 'file/tip/da?style=raw')
30 200 Script output follows
30 200 Script output follows
31
31
32
32
33 -rw-r--r-- 4 foo
33 -rw-r--r-- 4 foo
34
34
35
35
36
36
37 plain file
37 plain file
38
38
39 $ get-with-headers.py localhost:$HGPORT 'file/tip/foo?style=raw'
39 $ get-with-headers.py localhost:$HGPORT 'file/tip/foo?style=raw'
40 200 Script output follows
40 200 Script output follows
41
41
42 foo
42 foo
43
43
44 should give a 404 - static file that does not exist
44 should give a 404 - static file that does not exist
45
45
46 $ get-with-headers.py localhost:$HGPORT 'static/bogus'
46 $ get-with-headers.py localhost:$HGPORT 'static/bogus'
47 404 Not Found
47 404 Not Found
48
48
49 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
49 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
50 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
50 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
51 <head>
51 <head>
52 <link rel="icon" href="/static/hgicon.png" type="image/png" />
52 <link rel="icon" href="/static/hgicon.png" type="image/png" />
53 <meta name="robots" content="index, nofollow" />
53 <meta name="robots" content="index, nofollow" />
54 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
54 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
55 <script type="text/javascript" src="/static/mercurial.js"></script>
55 <script type="text/javascript" src="/static/mercurial.js"></script>
56
56
57 <title>test: error</title>
57 <title>test: error</title>
58 </head>
58 </head>
59 <body>
59 <body>
60
60
61 <div class="container">
61 <div class="container">
62 <div class="menu">
62 <div class="menu">
63 <div class="logo">
63 <div class="logo">
64 <a href="https://mercurial-scm.org/">
64 <a href="https://mercurial-scm.org/">
65 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
65 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
66 </div>
66 </div>
67 <ul>
67 <ul>
68 <li><a href="/shortlog">log</a></li>
68 <li><a href="/shortlog">log</a></li>
69 <li><a href="/graph">graph</a></li>
69 <li><a href="/graph">graph</a></li>
70 <li><a href="/tags">tags</a></li>
70 <li><a href="/tags">tags</a></li>
71 <li><a href="/bookmarks">bookmarks</a></li>
71 <li><a href="/bookmarks">bookmarks</a></li>
72 <li><a href="/branches">branches</a></li>
72 <li><a href="/branches">branches</a></li>
73 </ul>
73 </ul>
74 <ul>
74 <ul>
75 <li><a href="/help">help</a></li>
75 <li><a href="/help">help</a></li>
76 </ul>
76 </ul>
77 </div>
77 </div>
78
78
79 <div class="main">
79 <div class="main">
80
80
81 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
81 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
82 <h3>error</h3>
82 <h3>error</h3>
83
83
84
84
85 <form class="search" action="/log">
85 <form class="search" action="/log">
86
86
87 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
87 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
88 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
88 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
89 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
89 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
90 </form>
90 </form>
91
91
92 <div class="description">
92 <div class="description">
93 <p>
93 <p>
94 An error occurred while processing your request:
94 An error occurred while processing your request:
95 </p>
95 </p>
96 <p>
96 <p>
97 Not Found
97 Not Found
98 </p>
98 </p>
99 </div>
99 </div>
100 </div>
100 </div>
101 </div>
101 </div>
102
102
103
103
104
104
105 </body>
105 </body>
106 </html>
106 </html>
107
107
108 [1]
108 [1]
109
109
110 should give a 404 - bad revision
110 should give a 404 - bad revision
111
111
112 $ get-with-headers.py localhost:$HGPORT 'file/spam/foo?style=raw'
112 $ get-with-headers.py localhost:$HGPORT 'file/spam/foo?style=raw'
113 404 Not Found
113 404 Not Found
114
114
115
115
116 error: revision not found: spam
116 error: revision not found: spam
117 [1]
117 [1]
118
118
119 should give a 400 - bad command
119 should give a 400 - bad command
120
120
121 $ get-with-headers.py localhost:$HGPORT 'file/tip/foo?cmd=spam&style=raw'
121 $ get-with-headers.py localhost:$HGPORT 'file/tip/foo?cmd=spam&style=raw'
122 400* (glob)
122 400* (glob)
123
123
124
124
125 error: no such method: spam
125 error: no such method: spam
126 [1]
126 [1]
127
127
128 $ get-with-headers.py --headeronly localhost:$HGPORT '?cmd=spam'
128 $ get-with-headers.py --headeronly localhost:$HGPORT '?cmd=spam'
129 400 no such method: spam
129 400 no such method: spam
130 [1]
130 [1]
131
131
132 should give a 400 - bad command as a part of url path (issue4071)
132 should give a 400 - bad command as a part of url path (issue4071)
133
133
134 $ get-with-headers.py --headeronly localhost:$HGPORT 'spam'
134 $ get-with-headers.py --headeronly localhost:$HGPORT 'spam'
135 400 no such method: spam
135 400 no such method: spam
136 [1]
136 [1]
137
137
138 $ get-with-headers.py --headeronly localhost:$HGPORT 'raw-spam'
138 $ get-with-headers.py --headeronly localhost:$HGPORT 'raw-spam'
139 400 no such method: spam
139 400 no such method: spam
140 [1]
140 [1]
141
141
142 $ get-with-headers.py --headeronly localhost:$HGPORT 'spam/tip/foo'
142 $ get-with-headers.py --headeronly localhost:$HGPORT 'spam/tip/foo'
143 400 no such method: spam
143 400 no such method: spam
144 [1]
144 [1]
145
145
146 should give a 404 - file does not exist
146 should give a 404 - file does not exist
147
147
148 $ get-with-headers.py localhost:$HGPORT 'file/tip/bork?style=raw'
148 $ get-with-headers.py localhost:$HGPORT 'file/tip/bork?style=raw'
149 404 Not Found
149 404 Not Found
150
150
151
151
152 error: bork@2ef0ac749a14: not found in manifest
152 error: bork@2ef0ac749a14: not found in manifest
153 [1]
153 [1]
154 $ get-with-headers.py localhost:$HGPORT 'file/tip/bork'
154 $ get-with-headers.py localhost:$HGPORT 'file/tip/bork'
155 404 Not Found
155 404 Not Found
156
156
157 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
157 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
158 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
158 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
159 <head>
159 <head>
160 <link rel="icon" href="/static/hgicon.png" type="image/png" />
160 <link rel="icon" href="/static/hgicon.png" type="image/png" />
161 <meta name="robots" content="index, nofollow" />
161 <meta name="robots" content="index, nofollow" />
162 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
162 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
163 <script type="text/javascript" src="/static/mercurial.js"></script>
163 <script type="text/javascript" src="/static/mercurial.js"></script>
164
164
165 <title>test: error</title>
165 <title>test: error</title>
166 </head>
166 </head>
167 <body>
167 <body>
168
168
169 <div class="container">
169 <div class="container">
170 <div class="menu">
170 <div class="menu">
171 <div class="logo">
171 <div class="logo">
172 <a href="https://mercurial-scm.org/">
172 <a href="https://mercurial-scm.org/">
173 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
173 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
174 </div>
174 </div>
175 <ul>
175 <ul>
176 <li><a href="/shortlog">log</a></li>
176 <li><a href="/shortlog">log</a></li>
177 <li><a href="/graph">graph</a></li>
177 <li><a href="/graph">graph</a></li>
178 <li><a href="/tags">tags</a></li>
178 <li><a href="/tags">tags</a></li>
179 <li><a href="/bookmarks">bookmarks</a></li>
179 <li><a href="/bookmarks">bookmarks</a></li>
180 <li><a href="/branches">branches</a></li>
180 <li><a href="/branches">branches</a></li>
181 </ul>
181 </ul>
182 <ul>
182 <ul>
183 <li><a href="/help">help</a></li>
183 <li><a href="/help">help</a></li>
184 </ul>
184 </ul>
185 </div>
185 </div>
186
186
187 <div class="main">
187 <div class="main">
188
188
189 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
189 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
190 <h3>error</h3>
190 <h3>error</h3>
191
191
192
192
193 <form class="search" action="/log">
193 <form class="search" action="/log">
194
194
195 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
195 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
196 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
196 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
197 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
197 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
198 </form>
198 </form>
199
199
200 <div class="description">
200 <div class="description">
201 <p>
201 <p>
202 An error occurred while processing your request:
202 An error occurred while processing your request:
203 </p>
203 </p>
204 <p>
204 <p>
205 bork@2ef0ac749a14: not found in manifest
205 bork@2ef0ac749a14: not found in manifest
206 </p>
206 </p>
207 </div>
207 </div>
208 </div>
208 </div>
209 </div>
209 </div>
210
210
211
211
212
212
213 </body>
213 </body>
214 </html>
214 </html>
215
215
216 [1]
216 [1]
217 $ get-with-headers.py localhost:$HGPORT 'diff/tip/bork?style=raw'
217 $ get-with-headers.py localhost:$HGPORT 'diff/tip/bork?style=raw'
218 404 Not Found
218 404 Not Found
219
219
220
220
221 error: bork@2ef0ac749a14: not found in manifest
221 error: bork@2ef0ac749a14: not found in manifest
222 [1]
222 [1]
223
223
224 try bad style
224 try bad style
225
225
226 $ (get-with-headers.py localhost:$HGPORT 'file/tip/?style=foobar')
226 $ (get-with-headers.py localhost:$HGPORT 'file/tip/?style=foobar')
227 200 Script output follows
227 200 Script output follows
228
228
229 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
229 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
230 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
230 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
231 <head>
231 <head>
232 <link rel="icon" href="/static/hgicon.png" type="image/png" />
232 <link rel="icon" href="/static/hgicon.png" type="image/png" />
233 <meta name="robots" content="index, nofollow" />
233 <meta name="robots" content="index, nofollow" />
234 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
234 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
235 <script type="text/javascript" src="/static/mercurial.js"></script>
235 <script type="text/javascript" src="/static/mercurial.js"></script>
236
236
237 <title>test: 2ef0ac749a14 /</title>
237 <title>test: 2ef0ac749a14 /</title>
238 </head>
238 </head>
239 <body>
239 <body>
240
240
241 <div class="container">
241 <div class="container">
242 <div class="menu">
242 <div class="menu">
243 <div class="logo">
243 <div class="logo">
244 <a href="https://mercurial-scm.org/">
244 <a href="https://mercurial-scm.org/">
245 <img src="/static/hglogo.png" alt="mercurial" /></a>
245 <img src="/static/hglogo.png" alt="mercurial" /></a>
246 </div>
246 </div>
247 <ul>
247 <ul>
248 <li><a href="/shortlog/tip">log</a></li>
248 <li><a href="/shortlog/tip">log</a></li>
249 <li><a href="/graph/tip">graph</a></li>
249 <li><a href="/graph/tip">graph</a></li>
250 <li><a href="/tags">tags</a></li>
250 <li><a href="/tags">tags</a></li>
251 <li><a href="/bookmarks">bookmarks</a></li>
251 <li><a href="/bookmarks">bookmarks</a></li>
252 <li><a href="/branches">branches</a></li>
252 <li><a href="/branches">branches</a></li>
253 </ul>
253 </ul>
254 <ul>
254 <ul>
255 <li><a href="/rev/tip">changeset</a></li>
255 <li><a href="/rev/tip">changeset</a></li>
256 <li class="active">browse</li>
256 <li class="active">browse</li>
257 </ul>
257 </ul>
258 <ul>
258 <ul>
259
259
260 </ul>
260 </ul>
261 <ul>
261 <ul>
262 <li><a href="/help">help</a></li>
262 <li><a href="/help">help</a></li>
263 </ul>
263 </ul>
264 </div>
264 </div>
265
265
266 <div class="main">
266 <div class="main">
267 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
267 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
268 <h3>
268 <h3>
269 directory / @ 0:<a href="/rev/2ef0ac749a14">2ef0ac749a14</a>
269 directory / @ 0:<a href="/rev/2ef0ac749a14">2ef0ac749a14</a>
270 <span class="tag">tip</span> <span class="tag">@</span> <span class="tag">a b c</span> <span class="tag">d/e/f</span>
270 <span class="tag">tip</span> <span class="tag">@</span> <span class="tag">a b c</span> <span class="tag">d/e/f</span>
271 </h3>
271 </h3>
272
272
273
273
274 <form class="search" action="/log">
274 <form class="search" action="/log">
275
275
276 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
276 <p><input name="rev" id="search1" type="text" size="30" value="" /></p>
277 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
277 <div id="hint">Find changesets by keywords (author, files, the commit message), revision
278 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
278 number or hash, or <a href="/help/revsets">revset expression</a>.</div>
279 </form>
279 </form>
280
280
281 <table class="bigtable">
281 <table class="bigtable">
282 <thead>
282 <thead>
283 <tr>
283 <tr>
284 <th class="name">name</th>
284 <th class="name">name</th>
285 <th class="size">size</th>
285 <th class="size">size</th>
286 <th class="permissions">permissions</th>
286 <th class="permissions">permissions</th>
287 </tr>
287 </tr>
288 </thead>
288 </thead>
289 <tbody class="stripes2">
289 <tbody class="stripes2">
290 <tr class="fileline">
290 <tr class="fileline">
291 <td class="name"><a href="/file/tip/">[up]</a></td>
291 <td class="name"><a href="/file/tip/">[up]</a></td>
292 <td class="size"></td>
292 <td class="size"></td>
293 <td class="permissions">drwxr-xr-x</td>
293 <td class="permissions">drwxr-xr-x</td>
294 </tr>
294 </tr>
295
295
296 <tr class="fileline">
296 <tr class="fileline">
297 <td class="name">
297 <td class="name">
298 <a href="/file/tip/da">
298 <a href="/file/tip/da">
299 <img src="/static/coal-folder.png" alt="dir."/> da/
299 <img src="/static/coal-folder.png" alt="dir."/> da/
300 </a>
300 </a>
301 <a href="/file/tip/da/">
301 <a href="/file/tip/da/">
302
302
303 </a>
303 </a>
304 </td>
304 </td>
305 <td class="size"></td>
305 <td class="size"></td>
306 <td class="permissions">drwxr-xr-x</td>
306 <td class="permissions">drwxr-xr-x</td>
307 </tr>
307 </tr>
308
308
309 <tr class="fileline">
309 <tr class="fileline">
310 <td class="filename">
310 <td class="filename">
311 <a href="/file/tip/foo">
311 <a href="/file/tip/foo">
312 <img src="/static/coal-file.png" alt="file"/> foo
312 <img src="/static/coal-file.png" alt="file"/> foo
313 </a>
313 </a>
314 </td>
314 </td>
315 <td class="size">4</td>
315 <td class="size">4</td>
316 <td class="permissions">-rw-r--r--</td>
316 <td class="permissions">-rw-r--r--</td>
317 </tr>
317 </tr>
318 </tbody>
318 </tbody>
319 </table>
319 </table>
320 </div>
320 </div>
321 </div>
321 </div>
322
322
323
323
324 </body>
324 </body>
325 </html>
325 </html>
326
326
327
327
328 stop and restart
328 stop and restart
329
329
330 $ killdaemons.py
330 $ killdaemons.py
331 $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log
331 $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log
332 $ cat hg.pid >> $DAEMON_PIDS
332 $ cat hg.pid >> $DAEMON_PIDS
333
333
334 Test the access/error files are opened in append mode
334 Test the access/error files are opened in append mode
335
335
336 $ $PYTHON -c "print len(file('access.log').readlines()), 'log lines written'"
336 $ $PYTHON -c "print len(file('access.log').readlines()), 'log lines written'"
337 14 log lines written
337 14 log lines written
338
338
339 static file
339 static file
340
340
341 $ get-with-headers.py --twice localhost:$HGPORT 'static/style-gitweb.css' - date etag server
341 $ get-with-headers.py --twice localhost:$HGPORT 'static/style-gitweb.css' - date etag server
342 200 Script output follows
342 200 Script output follows
343 content-length: 9066
343 content-length: 9044
344 content-type: text/css
344 content-type: text/css
345
345
346 body { font-family: sans-serif; font-size: 12px; border:solid #d9d8d1; border-width:1px; margin:10px; background: white; color: black; }
346 body { font-family: sans-serif; font-size: 12px; border:solid #d9d8d1; border-width:1px; margin:10px; background: white; color: black; }
347 a { color:#0000cc; }
347 a { color:#0000cc; }
348 a:hover, a:visited, a:active { color:#880000; }
348 a:hover, a:visited, a:active { color:#880000; }
349 div.page_header { height:25px; padding:8px; font-size:18px; font-weight:bold; background-color:#d9d8d1; }
349 div.page_header { height:25px; padding:8px; font-size:18px; font-weight:bold; background-color:#d9d8d1; }
350 div.page_header a:visited { color:#0000cc; }
350 div.page_header a:visited { color:#0000cc; }
351 div.page_header a:hover { color:#880000; }
351 div.page_header a:hover { color:#880000; }
352 div.page_nav {
352 div.page_nav {
353 padding:8px;
353 padding:8px;
354 display: flex;
354 display: flex;
355 justify-content: space-between;
355 justify-content: space-between;
356 align-items: center;
356 align-items: center;
357 }
357 }
358 div.page_nav a:visited { color:#0000cc; }
358 div.page_nav a:visited { color:#0000cc; }
359 div.extra_nav {
359 div.extra_nav {
360 padding: 8px;
360 padding: 8px;
361 }
361 }
362 div.extra_nav a:visited {
362 div.extra_nav a:visited {
363 color: #0000cc;
363 color: #0000cc;
364 }
364 }
365 div.page_path { padding:8px; border:solid #d9d8d1; border-width:0px 0px 1px}
365 div.page_path { padding:8px; border:solid #d9d8d1; border-width:0px 0px 1px}
366 div.page_footer { padding:4px 8px; background-color: #d9d8d1; }
366 div.page_footer { padding:4px 8px; background-color: #d9d8d1; }
367 div.page_footer_text { float:left; color:#555555; font-style:italic; }
367 div.page_footer_text { float:left; color:#555555; font-style:italic; }
368 div.page_body { padding:8px; }
368 div.page_body { padding:8px; }
369 div.title, a.title {
369 div.title, a.title {
370 display:block; padding:6px 8px;
370 display:block; padding:6px 8px;
371 font-weight:bold; background-color:#edece6; text-decoration:none; color:#000000;
371 font-weight:bold; background-color:#edece6; text-decoration:none; color:#000000;
372 }
372 }
373 a.title:hover { background-color: #d9d8d1; }
373 a.title:hover { background-color: #d9d8d1; }
374 div.title_text { padding:6px 0px; border: solid #d9d8d1; border-width:0px 0px 1px; }
374 div.title_text { padding:6px 0px; border: solid #d9d8d1; border-width:0px 0px 1px; }
375 div.log_body { padding:8px 8px 8px 150px; }
375 div.log_body { padding:8px 8px 8px 150px; }
376 .age { white-space:nowrap; }
376 .age { white-space:nowrap; }
377 span.age { position:relative; float:left; width:142px; font-style:italic; }
377 span.age { position:relative; float:left; width:142px; font-style:italic; }
378 div.log_link {
378 div.log_link {
379 padding:0px 8px;
379 padding:0px 8px;
380 font-size:10px; font-family:sans-serif; font-style:normal;
380 font-size:10px; font-family:sans-serif; font-style:normal;
381 position:relative; float:left; width:136px;
381 position:relative; float:left; width:136px;
382 }
382 }
383 div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; }
383 div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; }
384 a.list { text-decoration:none; color:#000000; }
384 a.list { text-decoration:none; color:#000000; }
385 a.list:hover { text-decoration:underline; color:#880000; }
385 a.list:hover { text-decoration:underline; color:#880000; }
386 table { padding:8px 4px; }
386 table { padding:8px 4px; }
387 th { padding:2px 5px; font-size:12px; text-align:left; }
387 th { padding:2px 5px; font-size:12px; text-align:left; }
388 .parity0 { background-color:#ffffff; }
388 .parity0 { background-color:#ffffff; }
389 tr.dark, .parity1, pre.sourcelines.stripes > :nth-child(4n+4) { background-color:#f6f6f0; }
389 tr.dark, .parity1, pre.sourcelines.stripes > :nth-child(4n+4) { background-color:#f6f6f0; }
390 tr.light:hover, .parity0:hover, tr.dark:hover, .parity1:hover,
390 tr.light:hover, .parity0:hover, tr.dark:hover, .parity1:hover,
391 pre.sourcelines.stripes > :nth-child(4n+2):hover,
391 pre.sourcelines.stripes > :nth-child(4n+2):hover,
392 pre.sourcelines.stripes > :nth-child(4n+4):hover,
392 pre.sourcelines.stripes > :nth-child(4n+4):hover,
393 pre.sourcelines.stripes > :nth-child(4n+1):hover + :nth-child(4n+2),
393 pre.sourcelines.stripes > :nth-child(4n+1):hover + :nth-child(4n+2),
394 pre.sourcelines.stripes > :nth-child(4n+3):hover + :nth-child(4n+4) { background-color:#edece6; }
394 pre.sourcelines.stripes > :nth-child(4n+3):hover + :nth-child(4n+4) { background-color:#edece6; }
395 td { padding:2px 5px; font-size:12px; vertical-align:top; }
395 td { padding:2px 5px; font-size:12px; vertical-align:top; }
396 td.closed { background-color: #99f; }
396 td.closed { background-color: #99f; }
397 td.link { padding:2px 5px; font-family:sans-serif; font-size:10px; }
397 td.link { padding:2px 5px; font-family:sans-serif; font-size:10px; }
398 td.indexlinks { white-space: nowrap; }
398 td.indexlinks { white-space: nowrap; }
399 td.indexlinks a {
399 td.indexlinks a {
400 padding: 2px 5px; line-height: 10px;
400 padding: 2px 5px; line-height: 10px;
401 border: 1px solid;
401 border: 1px solid;
402 color: #ffffff; background-color: #7777bb;
402 color: #ffffff; background-color: #7777bb;
403 border-color: #aaaadd #333366 #333366 #aaaadd;
403 border-color: #aaaadd #333366 #333366 #aaaadd;
404 font-weight: bold; text-align: center; text-decoration: none;
404 font-weight: bold; text-align: center; text-decoration: none;
405 font-size: 10px;
405 font-size: 10px;
406 }
406 }
407 td.indexlinks a:hover { background-color: #6666aa; }
407 td.indexlinks a:hover { background-color: #6666aa; }
408 div.pre { font-family:monospace; font-size:12px; white-space:pre; }
408 div.pre { font-family:monospace; font-size:12px; white-space:pre; }
409 div.diff_info { font-family:monospace; color:#000099; background-color:#edece6; font-style:italic; }
409 div.diff_info { font-family:monospace; color:#000099; background-color:#edece6; font-style:italic; }
410 div.index_include { border:solid #d9d8d1; border-width:0px 0px 1px; padding:12px 8px; }
410 div.index_include { border:solid #d9d8d1; border-width:0px 0px 1px; padding:12px 8px; }
411
411
412 .search {
412 .search {
413 margin-right: 8px;
413 margin-right: 8px;
414 }
414 }
415
415
416 div#hint {
416 div#hint {
417 position: absolute;
417 position: absolute;
418 display: none;
418 display: none;
419 width: 250px;
419 width: 250px;
420 padding: 5px;
420 padding: 5px;
421 background: #ffc;
421 background: #ffc;
422 border: 1px solid yellow;
422 border: 1px solid yellow;
423 border-radius: 5px;
423 border-radius: 5px;
424 }
424 }
425
425
426 #searchform:hover div#hint { display: block; }
426 #searchform:hover div#hint { display: block; }
427
427
428 tr.thisrev a { color:#999999; text-decoration: none; }
428 tr.thisrev a { color:#999999; text-decoration: none; }
429 tr.thisrev pre { color:#009900; }
429 tr.thisrev pre { color:#009900; }
430 td.annotate {
430 td.annotate {
431 white-space: nowrap;
431 white-space: nowrap;
432 }
432 }
433 div.annotate-info {
433 div.annotate-info {
434 z-index: 5;
434 z-index: 5;
435 display: none;
435 display: none;
436 position: absolute;
436 position: absolute;
437 background-color: #FFFFFF;
437 background-color: #FFFFFF;
438 border: 1px solid #d9d8d1;
438 border: 1px solid #d9d8d1;
439 text-align: left;
439 text-align: left;
440 color: #000000;
440 color: #000000;
441 padding: 5px;
441 padding: 5px;
442 }
442 }
443 div.annotate-info a { color: #0000FF; text-decoration: underline; }
443 div.annotate-info a { color: #0000FF; text-decoration: underline; }
444 td.annotate:hover div.annotate-info { display: inline; }
444 td.annotate:hover div.annotate-info { display: inline; }
445
445
446 #diffopts-form {
446 #diffopts-form {
447 padding-left: 8px;
447 padding-left: 8px;
448 display: none;
448 display: none;
449 }
449 }
450
450
451 .linenr { color:#999999; text-decoration:none }
451 .linenr { color:#999999; text-decoration:none }
452 div.rss_logo { float: right; white-space: nowrap; }
452 div.rss_logo { float: right; white-space: nowrap; }
453 div.rss_logo a {
453 div.rss_logo a {
454 padding:3px 6px; line-height:10px;
454 padding:3px 6px; line-height:10px;
455 border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
455 border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
456 color:#ffffff; background-color:#ff6600;
456 color:#ffffff; background-color:#ff6600;
457 font-weight:bold; font-family:sans-serif; font-size:10px;
457 font-weight:bold; font-family:sans-serif; font-size:10px;
458 text-align:center; text-decoration:none;
458 text-align:center; text-decoration:none;
459 }
459 }
460 div.rss_logo a:hover { background-color:#ee5500; }
460 div.rss_logo a:hover { background-color:#ee5500; }
461 pre { margin: 0; }
461 pre { margin: 0; }
462 span.logtags span {
462 span.logtags span {
463 padding: 0px 4px;
463 padding: 0px 4px;
464 font-size: 10px;
464 font-size: 10px;
465 font-weight: normal;
465 font-weight: normal;
466 border: 1px solid;
466 border: 1px solid;
467 background-color: #ffaaff;
467 background-color: #ffaaff;
468 border-color: #ffccff #ff00ee #ff00ee #ffccff;
468 border-color: #ffccff #ff00ee #ff00ee #ffccff;
469 }
469 }
470 span.logtags span.tagtag {
470 span.logtags span.tagtag {
471 background-color: #ffffaa;
471 background-color: #ffffaa;
472 border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
472 border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
473 }
473 }
474 span.logtags span.branchtag {
474 span.logtags span.branchtag {
475 background-color: #aaffaa;
475 background-color: #aaffaa;
476 border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
476 border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
477 }
477 }
478 span.logtags span.inbranchtag {
478 span.logtags span.inbranchtag {
479 background-color: #d5dde6;
479 background-color: #d5dde6;
480 border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
480 border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
481 }
481 }
482 span.logtags span.bookmarktag {
482 span.logtags span.bookmarktag {
483 background-color: #afdffa;
483 background-color: #afdffa;
484 border-color: #ccecff #46ace6 #46ace6 #ccecff;
484 border-color: #ccecff #46ace6 #46ace6 #ccecff;
485 }
485 }
486 span.difflineplus { color:#008800; }
486 span.difflineplus { color:#008800; }
487 span.difflineminus { color:#cc0000; }
487 span.difflineminus { color:#cc0000; }
488 span.difflineat { color:#990099; }
488 span.difflineat { color:#990099; }
489 div.diffblocks { counter-reset: lineno; }
489 div.diffblocks { counter-reset: lineno; }
490 div.diffblock { counter-increment: lineno; }
490 div.diffblock { counter-increment: lineno; }
491 pre.sourcelines { position: relative; counter-reset: lineno; }
491 pre.sourcelines { position: relative; counter-reset: lineno; }
492 pre.sourcelines > span {
492 pre.sourcelines > span {
493 display: inline-block;
493 display: inline-block;
494 box-sizing: border-box;
494 box-sizing: border-box;
495 width: 100%;
495 width: 100%;
496 padding: 0 0 0 5em;
496 padding: 0 0 0 5em;
497 counter-increment: lineno;
497 counter-increment: lineno;
498 vertical-align: top;
498 vertical-align: top;
499 }
499 }
500 pre.sourcelines > span:before {
500 pre.sourcelines > span:before {
501 -moz-user-select: -moz-none;
501 -moz-user-select: -moz-none;
502 -khtml-user-select: none;
502 -khtml-user-select: none;
503 -webkit-user-select: none;
503 -webkit-user-select: none;
504 -ms-user-select: none;
504 -ms-user-select: none;
505 user-select: none;
505 user-select: none;
506 display: inline-block;
506 display: inline-block;
507 margin-left: -6em;
507 margin-left: -6em;
508 width: 4em;
508 width: 4em;
509 color: #999;
509 color: #999;
510 text-align: right;
510 text-align: right;
511 content: counters(lineno,".");
511 content: counters(lineno,".");
512 float: left;
512 float: left;
513 }
513 }
514 pre.sourcelines > a {
514 pre.sourcelines > a {
515 display: inline-block;
515 display: inline-block;
516 position: absolute;
516 position: absolute;
517 left: 0px;
517 left: 0px;
518 width: 4em;
518 width: 4em;
519 height: 1em;
519 height: 1em;
520 }
520 }
521 tr:target td,
521 tr:target td,
522 pre.sourcelines > span:target,
522 pre.sourcelines > span:target,
523 pre.sourcelines.stripes > span:target {
523 pre.sourcelines.stripes > span:target {
524 background-color: #bfdfff;
524 background-color: #bfdfff;
525 }
525 }
526
526
527 .description {
527 .description {
528 font-family: monospace;
528 font-family: monospace;
529 white-space: pre;
529 white-space: pre;
530 }
530 }
531
531
532 /* Followlines */
532 /* Followlines */
533 tbody.sourcelines > tr.followlines-selected,
533 tbody.sourcelines > tr.followlines-selected,
534 pre.sourcelines > span.followlines-selected {
534 pre.sourcelines > span.followlines-selected {
535 background-color: #99C7E9 !important;
535 background-color: #99C7E9 !important;
536 }
536 }
537
537
538 div#followlines {
538 div#followlines {
539 background-color: #B7B7B7;
539 background-color: #FFF;
540 border: 1px solid #CCC;
540 border: 1px solid #d9d8d1;
541 border-radius: 5px;
541 padding: 5px;
542 padding: 4px;
543 position: fixed;
542 position: fixed;
544 }
543 }
545
544
546 div.followlines-cancel {
545 div.followlines-cancel {
547 text-align: right;
546 text-align: right;
548 }
547 }
549
548
550 div.followlines-cancel > button {
549 div.followlines-cancel > button {
551 line-height: 80%;
550 line-height: 80%;
552 padding: 0;
551 padding: 0;
553 border: 0;
552 border: 0;
554 border-radius: 2px;
553 border-radius: 2px;
555 background-color: inherit;
554 background-color: inherit;
556 font-weight: bold;
555 font-weight: bold;
557 }
556 }
558
557
559 div.followlines-cancel > button:hover {
558 div.followlines-cancel > button:hover {
560 color: #FFFFFF;
559 color: #FFFFFF;
561 background-color: #CF1F1F;
560 background-color: #CF1F1F;
562 }
561 }
563
562
564 div.followlines-link {
563 div.followlines-link {
565 margin: 2px;
564 margin: 2px;
566 margin-top: 4px;
565 margin-top: 4px;
567 font-family: sans-serif;
566 font-family: sans-serif;
568 }
567 }
569
568
570 .btn-followlines {
569 .btn-followlines {
571 display: none;
570 display: none;
572 cursor: pointer;
571 cursor: pointer;
573 box-sizing: content-box;
572 box-sizing: content-box;
574 font-size: 11px;
573 font-size: 11px;
575 width: 13px;
574 width: 13px;
576 height: 13px;
575 height: 13px;
577 border-radius: 3px;
576 border-radius: 3px;
578 margin: 0px;
577 margin: 0px;
579 margin-top: -2px;
578 margin-top: -2px;
580 padding: 0px;
579 padding: 0px;
581 background-color: #E5FDE5;
580 background-color: #E5FDE5;
582 border: 1px solid #9BC19B;
581 border: 1px solid #9BC19B;
583 font-family: monospace;
582 font-family: monospace;
584 text-align: center;
583 text-align: center;
585 line-height: 5px;
584 line-height: 5px;
586 }
585 }
587
586
588 tr .btn-followlines {
587 tr .btn-followlines {
589 position: absolute;
588 position: absolute;
590 }
589 }
591
590
592 span .btn-followlines {
591 span .btn-followlines {
593 float: left;
592 float: left;
594 }
593 }
595
594
596 span.followlines-select .btn-followlines {
595 span.followlines-select .btn-followlines {
597 margin-left: -1.6em;
596 margin-left: -1.6em;
598 }
597 }
599
598
600 .btn-followlines:hover {
599 .btn-followlines:hover {
601 transform: scale(1.1, 1.1);
600 transform: scale(1.1, 1.1);
602 }
601 }
603
602
604 .btn-followlines .followlines-plus {
603 .btn-followlines .followlines-plus {
605 color: green;
604 color: green;
606 }
605 }
607
606
608 .btn-followlines .followlines-minus {
607 .btn-followlines .followlines-minus {
609 color: red;
608 color: red;
610 }
609 }
611
610
612 .btn-followlines-end {
611 .btn-followlines-end {
613 background-color: #ffdcdc;
612 background-color: #ffdcdc;
614 }
613 }
615
614
616 .sourcelines tr:hover .btn-followlines,
615 .sourcelines tr:hover .btn-followlines,
617 .sourcelines span.followlines-select:hover > .btn-followlines {
616 .sourcelines span.followlines-select:hover > .btn-followlines {
618 display: inline;
617 display: inline;
619 }
618 }
620
619
621 .btn-followlines-hidden,
620 .btn-followlines-hidden,
622 .sourcelines tr:hover .btn-followlines-hidden {
621 .sourcelines tr:hover .btn-followlines-hidden {
623 display: none;
622 display: none;
624 }
623 }
625
624
626 /* Graph */
625 /* Graph */
627 div#wrapper {
626 div#wrapper {
628 position: relative;
627 position: relative;
629 margin: 0;
628 margin: 0;
630 padding: 0;
629 padding: 0;
631 margin-top: 3px;
630 margin-top: 3px;
632 }
631 }
633
632
634 canvas {
633 canvas {
635 position: absolute;
634 position: absolute;
636 z-index: 5;
635 z-index: 5;
637 top: -0.9em;
636 top: -0.9em;
638 margin: 0;
637 margin: 0;
639 }
638 }
640
639
641 ul#nodebgs {
640 ul#nodebgs {
642 list-style: none inside none;
641 list-style: none inside none;
643 padding: 0;
642 padding: 0;
644 margin: 0;
643 margin: 0;
645 top: -0.7em;
644 top: -0.7em;
646 }
645 }
647
646
648 ul#graphnodes li, ul#nodebgs li {
647 ul#graphnodes li, ul#nodebgs li {
649 height: 39px;
648 height: 39px;
650 }
649 }
651
650
652 ul#graphnodes {
651 ul#graphnodes {
653 position: absolute;
652 position: absolute;
654 z-index: 10;
653 z-index: 10;
655 top: -0.8em;
654 top: -0.8em;
656 list-style: none inside none;
655 list-style: none inside none;
657 padding: 0;
656 padding: 0;
658 }
657 }
659
658
660 ul#graphnodes li .info {
659 ul#graphnodes li .info {
661 display: block;
660 display: block;
662 font-size: 100%;
661 font-size: 100%;
663 position: relative;
662 position: relative;
664 top: -3px;
663 top: -3px;
665 font-style: italic;
664 font-style: italic;
666 }
665 }
667
666
668 /* Comparison */
667 /* Comparison */
669 .legend {
668 .legend {
670 padding: 1.5% 0 1.5% 0;
669 padding: 1.5% 0 1.5% 0;
671 }
670 }
672
671
673 .legendinfo {
672 .legendinfo {
674 border: 1px solid #d9d8d1;
673 border: 1px solid #d9d8d1;
675 font-size: 80%;
674 font-size: 80%;
676 text-align: center;
675 text-align: center;
677 padding: 0.5%;
676 padding: 0.5%;
678 }
677 }
679
678
680 .equal {
679 .equal {
681 background-color: #ffffff;
680 background-color: #ffffff;
682 }
681 }
683
682
684 .delete {
683 .delete {
685 background-color: #faa;
684 background-color: #faa;
686 color: #333;
685 color: #333;
687 }
686 }
688
687
689 .insert {
688 .insert {
690 background-color: #ffa;
689 background-color: #ffa;
691 }
690 }
692
691
693 .replace {
692 .replace {
694 background-color: #e8e8e8;
693 background-color: #e8e8e8;
695 }
694 }
696
695
697 .comparison {
696 .comparison {
698 overflow-x: auto;
697 overflow-x: auto;
699 }
698 }
700
699
701 .header th {
700 .header th {
702 text-align: center;
701 text-align: center;
703 }
702 }
704
703
705 .block {
704 .block {
706 border-top: 1px solid #d9d8d1;
705 border-top: 1px solid #d9d8d1;
707 }
706 }
708
707
709 .scroll-loading {
708 .scroll-loading {
710 -webkit-animation: change_color 1s linear 0s infinite alternate;
709 -webkit-animation: change_color 1s linear 0s infinite alternate;
711 -moz-animation: change_color 1s linear 0s infinite alternate;
710 -moz-animation: change_color 1s linear 0s infinite alternate;
712 -o-animation: change_color 1s linear 0s infinite alternate;
711 -o-animation: change_color 1s linear 0s infinite alternate;
713 animation: change_color 1s linear 0s infinite alternate;
712 animation: change_color 1s linear 0s infinite alternate;
714 }
713 }
715
714
716 @-webkit-keyframes change_color {
715 @-webkit-keyframes change_color {
717 from { background-color: #A0CEFF; } to { }
716 from { background-color: #A0CEFF; } to { }
718 }
717 }
719 @-moz-keyframes change_color {
718 @-moz-keyframes change_color {
720 from { background-color: #A0CEFF; } to { }
719 from { background-color: #A0CEFF; } to { }
721 }
720 }
722 @-o-keyframes change_color {
721 @-o-keyframes change_color {
723 from { background-color: #A0CEFF; } to { }
722 from { background-color: #A0CEFF; } to { }
724 }
723 }
725 @keyframes change_color {
724 @keyframes change_color {
726 from { background-color: #A0CEFF; } to { }
725 from { background-color: #A0CEFF; } to { }
727 }
726 }
728
727
729 .scroll-loading-error {
728 .scroll-loading-error {
730 background-color: #FFCCCC !important;
729 background-color: #FFCCCC !important;
731 }
730 }
732
731
733 #doc {
732 #doc {
734 margin: 0 8px;
733 margin: 0 8px;
735 }
734 }
736 304 Not Modified
735 304 Not Modified
737
736
738
737
739 phase changes are refreshed (issue4061)
738 phase changes are refreshed (issue4061)
740
739
741 $ echo bar >> foo
740 $ echo bar >> foo
742 $ hg ci -msecret --secret
741 $ hg ci -msecret --secret
743 $ get-with-headers.py localhost:$HGPORT 'log?style=raw'
742 $ get-with-headers.py localhost:$HGPORT 'log?style=raw'
744 200 Script output follows
743 200 Script output follows
745
744
746
745
747 # HG changelog
746 # HG changelog
748 # Node ID 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
747 # Node ID 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
749
748
750 changeset: 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
749 changeset: 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
751 revision: 0
750 revision: 0
752 user: test
751 user: test
753 date: Thu, 01 Jan 1970 00:00:00 +0000
752 date: Thu, 01 Jan 1970 00:00:00 +0000
754 summary: base
753 summary: base
755 branch: default
754 branch: default
756 tag: tip
755 tag: tip
757 bookmark: @
756 bookmark: @
758 bookmark: a b c
757 bookmark: a b c
759 bookmark: d/e/f
758 bookmark: d/e/f
760
759
761
760
762 $ hg phase --draft tip
761 $ hg phase --draft tip
763 $ get-with-headers.py localhost:$HGPORT 'log?style=raw'
762 $ get-with-headers.py localhost:$HGPORT 'log?style=raw'
764 200 Script output follows
763 200 Script output follows
765
764
766
765
767 # HG changelog
766 # HG changelog
768 # Node ID a084749e708a9c4c0a5b652a2a446322ce290e04
767 # Node ID a084749e708a9c4c0a5b652a2a446322ce290e04
769
768
770 changeset: a084749e708a9c4c0a5b652a2a446322ce290e04
769 changeset: a084749e708a9c4c0a5b652a2a446322ce290e04
771 revision: 1
770 revision: 1
772 user: test
771 user: test
773 date: Thu, 01 Jan 1970 00:00:00 +0000
772 date: Thu, 01 Jan 1970 00:00:00 +0000
774 summary: secret
773 summary: secret
775 branch: default
774 branch: default
776 tag: tip
775 tag: tip
777
776
778 changeset: 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
777 changeset: 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
779 revision: 0
778 revision: 0
780 user: test
779 user: test
781 date: Thu, 01 Jan 1970 00:00:00 +0000
780 date: Thu, 01 Jan 1970 00:00:00 +0000
782 summary: base
781 summary: base
783 bookmark: @
782 bookmark: @
784 bookmark: a b c
783 bookmark: a b c
785 bookmark: d/e/f
784 bookmark: d/e/f
786
785
787
786
788
787
789 access bookmarks
788 access bookmarks
790
789
791 $ get-with-headers.py localhost:$HGPORT 'rev/@?style=paper' | egrep '^200|changeset 0:'
790 $ get-with-headers.py localhost:$HGPORT 'rev/@?style=paper' | egrep '^200|changeset 0:'
792 200 Script output follows
791 200 Script output follows
793 changeset 0:<a href="/rev/2ef0ac749a14?style=paper">2ef0ac749a14</a>
792 changeset 0:<a href="/rev/2ef0ac749a14?style=paper">2ef0ac749a14</a>
794
793
795 $ get-with-headers.py localhost:$HGPORT 'rev/%40?style=paper' | egrep '^200|changeset 0:'
794 $ get-with-headers.py localhost:$HGPORT 'rev/%40?style=paper' | egrep '^200|changeset 0:'
796 200 Script output follows
795 200 Script output follows
797 changeset 0:<a href="/rev/2ef0ac749a14?style=paper">2ef0ac749a14</a>
796 changeset 0:<a href="/rev/2ef0ac749a14?style=paper">2ef0ac749a14</a>
798
797
799 $ get-with-headers.py localhost:$HGPORT 'rev/a%20b%20c?style=paper' | egrep '^200|changeset 0:'
798 $ get-with-headers.py localhost:$HGPORT 'rev/a%20b%20c?style=paper' | egrep '^200|changeset 0:'
800 200 Script output follows
799 200 Script output follows
801 changeset 0:<a href="/rev/2ef0ac749a14?style=paper">2ef0ac749a14</a>
800 changeset 0:<a href="/rev/2ef0ac749a14?style=paper">2ef0ac749a14</a>
802
801
803 $ get-with-headers.py localhost:$HGPORT 'rev/d%252Fe%252Ff?style=paper' | egrep '^200|changeset 0:'
802 $ get-with-headers.py localhost:$HGPORT 'rev/d%252Fe%252Ff?style=paper' | egrep '^200|changeset 0:'
804 200 Script output follows
803 200 Script output follows
805 changeset 0:<a href="/rev/2ef0ac749a14?style=paper">2ef0ac749a14</a>
804 changeset 0:<a href="/rev/2ef0ac749a14?style=paper">2ef0ac749a14</a>
806
805
807 no style can be loaded from directories other than the specified paths
806 no style can be loaded from directories other than the specified paths
808
807
809 $ mkdir -p x/templates/fallback
808 $ mkdir -p x/templates/fallback
810 $ cat <<EOF > x/templates/fallback/map
809 $ cat <<EOF > x/templates/fallback/map
811 > default = 'shortlog'
810 > default = 'shortlog'
812 > shortlog = 'fall back to default\n'
811 > shortlog = 'fall back to default\n'
813 > mimetype = 'text/plain'
812 > mimetype = 'text/plain'
814 > EOF
813 > EOF
815 $ cat <<EOF > x/map
814 $ cat <<EOF > x/map
816 > default = 'shortlog'
815 > default = 'shortlog'
817 > shortlog = 'access to outside of templates directory\n'
816 > shortlog = 'access to outside of templates directory\n'
818 > mimetype = 'text/plain'
817 > mimetype = 'text/plain'
819 > EOF
818 > EOF
820
819
821 $ killdaemons.py
820 $ killdaemons.py
822 $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log \
821 $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log \
823 > --config web.style=fallback --config web.templates=x/templates
822 > --config web.style=fallback --config web.templates=x/templates
824 $ cat hg.pid >> $DAEMON_PIDS
823 $ cat hg.pid >> $DAEMON_PIDS
825
824
826 $ get-with-headers.py localhost:$HGPORT "?style=`pwd`/x"
825 $ get-with-headers.py localhost:$HGPORT "?style=`pwd`/x"
827 200 Script output follows
826 200 Script output follows
828
827
829 fall back to default
828 fall back to default
830
829
831 $ get-with-headers.py localhost:$HGPORT '?style=..'
830 $ get-with-headers.py localhost:$HGPORT '?style=..'
832 200 Script output follows
831 200 Script output follows
833
832
834 fall back to default
833 fall back to default
835
834
836 $ get-with-headers.py localhost:$HGPORT '?style=./..'
835 $ get-with-headers.py localhost:$HGPORT '?style=./..'
837 200 Script output follows
836 200 Script output follows
838
837
839 fall back to default
838 fall back to default
840
839
841 $ get-with-headers.py localhost:$HGPORT '?style=.../.../'
840 $ get-with-headers.py localhost:$HGPORT '?style=.../.../'
842 200 Script output follows
841 200 Script output follows
843
842
844 fall back to default
843 fall back to default
845
844
846 errors
845 errors
847
846
848 $ cat errors.log
847 $ cat errors.log
849
848
850 Uncaught exceptions result in a logged error and canned HTTP response
849 Uncaught exceptions result in a logged error and canned HTTP response
851
850
852 $ killdaemons.py
851 $ killdaemons.py
853 $ hg serve --config extensions.hgweberror=$TESTDIR/hgweberror.py -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
852 $ hg serve --config extensions.hgweberror=$TESTDIR/hgweberror.py -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
854 $ cat hg.pid >> $DAEMON_PIDS
853 $ cat hg.pid >> $DAEMON_PIDS
855
854
856 $ get-with-headers.py localhost:$HGPORT 'raiseerror' transfer-encoding content-type
855 $ get-with-headers.py localhost:$HGPORT 'raiseerror' transfer-encoding content-type
857 500 Internal Server Error
856 500 Internal Server Error
858 transfer-encoding: chunked
857 transfer-encoding: chunked
859
858
860 Internal Server Error (no-eol)
859 Internal Server Error (no-eol)
861 [1]
860 [1]
862
861
863 $ killdaemons.py
862 $ killdaemons.py
864 $ head -1 errors.log
863 $ head -1 errors.log
865 .* Exception happened during processing request '/raiseerror': (re)
864 .* Exception happened during processing request '/raiseerror': (re)
866
865
867 Uncaught exception after partial content sent
866 Uncaught exception after partial content sent
868
867
869 $ hg serve --config extensions.hgweberror=$TESTDIR/hgweberror.py -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
868 $ hg serve --config extensions.hgweberror=$TESTDIR/hgweberror.py -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
870 $ cat hg.pid >> $DAEMON_PIDS
869 $ cat hg.pid >> $DAEMON_PIDS
871 $ get-with-headers.py localhost:$HGPORT 'raiseerror?partialresponse=1' transfer-encoding content-type
870 $ get-with-headers.py localhost:$HGPORT 'raiseerror?partialresponse=1' transfer-encoding content-type
872 200 Script output follows
871 200 Script output follows
873 transfer-encoding: chunked
872 transfer-encoding: chunked
874 content-type: text/plain
873 content-type: text/plain
875
874
876 partial content
875 partial content
877 Internal Server Error (no-eol)
876 Internal Server Error (no-eol)
878
877
879 $ killdaemons.py
878 $ killdaemons.py
880 $ cd ..
879 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now