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