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