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