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