##// END OF EJS Templates
hgweb: show obsolescence status of a commit...
av6 -
r35088:69ea10d5 default
parent child Browse files
Show More
@@ -1,353 +1,354 b''
1 1 default = 'summary'
2 2 mimetype = 'text/html; charset={encoding}'
3 3 header = header.tmpl
4 4 footer = footer.tmpl
5 5 search = search.tmpl
6 6 changelog = changelog.tmpl
7 7 summary = summary.tmpl
8 8 error = error.tmpl
9 9 notfound = notfound.tmpl
10 10
11 11 help = help.tmpl
12 12 helptopics = helptopics.tmpl
13 13
14 14 helpentry = '
15 15 <tr><td>
16 16 <a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
17 17 {if(basename, '{basename|escape}', '{topic|escape}')}
18 18 </a>
19 19 </td><td>
20 20 {summary|escape}
21 21 </td></tr>'
22 22
23 23 naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
24 24 navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
25 25 navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
26 26 filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
27 27 filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
28 28 filenodelink = '
29 29 <tr class="parity{parity}">
30 30 <td><a class="list" href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
31 31 <td></td>
32 32 <td class="link">
33 33 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
34 34 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
35 35 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
36 36 <a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
37 37 <a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
38 38 </td>
39 39 </tr>'
40 40 filenolink = '
41 41 <tr class="parity{parity}">
42 42 <td><a class="list" href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
43 43 <td></td>
44 44 <td class="link">
45 45 file |
46 46 annotate |
47 47 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
48 48 <a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
49 49 <a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
50 50 </td>
51 51 </tr>'
52 52
53 53 nav = '{before%naventry} {after%naventry}'
54 54 navshort = '{before%navshortentry}{after%navshortentry}'
55 55 navgraph = '{before%navgraphentry}{after%navgraphentry}'
56 56 filenav = '{before%filenaventry}{after%filenaventry}'
57 57
58 58 fileellipses = '...'
59 59 changelogentry = changelogentry.tmpl
60 60 searchentry = changelogentry.tmpl
61 61 changeset = changeset.tmpl
62 62 manifest = manifest.tmpl
63 63 direntry = '
64 64 <tr class="parity{parity}">
65 65 <td style="font-family:monospace">drwxr-xr-x</td>
66 66 <td style="font-family:monospace"></td>
67 67 <td style="font-family:monospace"></td>
68 68 <td>
69 69 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>
70 70 <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">{emptydirs|escape}</a>
71 71 </td>
72 72 <td class="link">
73 73 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">files</a>
74 74 </td>
75 75 </tr>'
76 76 fileentry = '
77 77 <tr class="parity{parity}">
78 78 <td style="font-family:monospace">{permissions|permissions}</td>
79 79 <td style="font-family:monospace" align=right>{date|isodate}</td>
80 80 <td style="font-family:monospace" align=right>{size}</td>
81 81 <td class="list">
82 82 <a class="list" href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>
83 83 </td>
84 84 <td class="link">
85 85 <a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
86 86 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
87 87 <a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
88 88 </td>
89 89 </tr>'
90 90 filerevision = filerevision.tmpl
91 91 fileannotate = fileannotate.tmpl
92 92 filediff = filediff.tmpl
93 93 filecomparison = filecomparison.tmpl
94 94 filelog = filelog.tmpl
95 95 fileline = '
96 96 <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
97 97 annotateline = '
98 98 <tr id="{lineid}" style="font-family:monospace" class="parity{parity}{ifeq(node, originalnode, ' thisrev')}">
99 99 <td class="annotate linenr parity{blockparity}" style="text-align: right;">
100 100 {if(blockhead,
101 101 '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
102 102 {rev}
103 103 </a>')}
104 104 <div class="annotate-info">
105 105 <div>
106 106 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
107 107 {node|short}</a>
108 108 {desc|escape|firstline}
109 109 </div>
110 110 <div><em>{author|obfuscate}</em></div>
111 111 <div>parents: {parents%annotateparent}</div>
112 112 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
113 113 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
114 114 </div>
115 115 </td>
116 116 <td class="followlines-btn-parent"><pre><a class="linenr" href="#{lineid}">{linenumber}</a></pre></td>
117 117 <td><pre>{line|escape}</pre></td>
118 118 </tr>'
119 119 annotateparent = '
120 120 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
121 121 difflineplus = '
122 122 <a href="#{lineid}"></a><span id="{lineid}" class="difflineplus">{strip(line|escape, '\r\n')}</span>'
123 123 difflineminus = '
124 124 <a href="#{lineid}"></a><span id="{lineid}" class="difflineminus">{strip(line|escape, '\r\n')}</span>'
125 125 difflineat = '
126 126 <a href="#{lineid}"></a><span id="{lineid}" class="difflineat">{strip(line|escape, '\r\n')}</span>'
127 127 diffline = '
128 128 <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
129 129
130 130 comparisonblock ='
131 131 <tbody class="block">
132 132 {lines}
133 133 </tbody>'
134 134 comparisonline = '
135 135 <tr id="{lineid}" style="font-family:monospace">
136 136 <td class="{type}"><pre><a class="linenr" href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</pre></td>
137 137 <td class="{type}"><pre><a class="linenr" href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</pre></td>
138 138 </tr>'
139 139
140 140 changesetlink = '<a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
141 141 changesetbranch = '<tr><td>branch</td><td>{name|escape}</td></tr>'
142 142 changesetparent = '
143 143 <tr>
144 144 <td>parent {rev}</td>
145 145 <td style="font-family:monospace">
146 146 {changesetlink}
147 147 </td>
148 148 </tr>'
149 149 changesetparentdiff = '
150 150 <tr>
151 151 <td>parent {rev}</td>
152 152 <td style="font-family:monospace">
153 153 {changesetlink} {ifeq(node, basenode, '(current diff)', '({difffrom})')}
154 154 </td>
155 155 </tr>'
156 156 difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
157 157 filerevbranch = '<tr><td>branch</td><td>{name|escape}</td></tr>'
158 158 filerevparent = '
159 159 <tr>
160 160 <td>parent {rev}</td>
161 161 <td style="font-family:monospace">
162 162 <a class="list" href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
163 163 {rename%filerename}{node|short}
164 164 </a>
165 165 </td>
166 166 </tr>'
167 167 filerename = '{file|escape}@'
168 168 filelogrename = '| <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">base</a>'
169 169 fileannotateparent = '
170 170 <tr>
171 171 <td>parent {rev}</td>
172 172 <td style="font-family:monospace">
173 173 <a class="list" href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
174 174 {rename%filerename}{node|short}
175 175 </a>
176 176 </td>
177 177 </tr>'
178 178 changesetchild = '
179 179 <tr>
180 180 <td>child {rev}</td>
181 181 <td style="font-family:monospace">
182 182 <a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
183 183 </td>
184 184 </tr>'
185 185 filerevchild = '
186 186 <tr>
187 187 <td>child {rev}</td>
188 188 <td style="font-family:monospace">
189 189 <a class="list" href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
190 190 </tr>'
191 191 fileannotatechild = '
192 192 <tr>
193 193 <td>child {rev}</td>
194 194 <td style="font-family:monospace">
195 195 <a class="list" href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
196 196 </tr>'
197 197 tags = tags.tmpl
198 198 tagentry = '
199 199 <tr class="parity{parity}">
200 200 <td class="age"><i class="age">{date|rfc822date}</i></td>
201 201 <td><a class="list" href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}"><b>{tag|escape}</b></a></td>
202 202 <td class="link">
203 203 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
204 204 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
205 205 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
206 206 </td>
207 207 </tr>'
208 208 bookmarks = bookmarks.tmpl
209 209 bookmarkentry = '
210 210 <tr class="parity{parity}">
211 211 <td class="age"><i class="age">{date|rfc822date}</i></td>
212 212 <td><a class="list" href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}"><b>{bookmark|escape}</b></a></td>
213 213 <td class="link">
214 214 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
215 215 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
216 216 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
217 217 </td>
218 218 </tr>'
219 219 branches = branches.tmpl
220 220 branchentry = '
221 221 <tr class="parity{parity}">
222 222 <td class="age"><i class="age">{date|rfc822date}</i></td>
223 223 <td class="{status}"><a class="list" href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}"><b>{branch|escape}</b></a></td>
224 224 <td class="link">
225 225 <a href="{url|urlescape}changeset/{node|short}{sessionvars%urlparameter}">changeset</a> |
226 226 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
227 227 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
228 228 </td>
229 229 </tr>'
230 230 diffblock = '<div class="diffblock"><pre class="sourcelines">{lines}</pre></div>'
231 231 filediffparent = '
232 232 <tr>
233 233 <td>parent {rev}</td>
234 234 <td style="font-family:monospace">
235 235 <a class="list" href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
236 236 {node|short}
237 237 </a>
238 238 </td>
239 239 </tr>'
240 240 filecompparent = '
241 241 <tr>
242 242 <td>parent {rev}</td>
243 243 <td style="font-family:monospace">
244 244 <a class="list" href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
245 245 {node|short}
246 246 </a>
247 247 </td>
248 248 </tr>'
249 249 filediffchild = '
250 250 <tr>
251 251 <td>child {rev}</td>
252 252 <td style="font-family:monospace">
253 253 <a class="list" href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
254 254 </td>
255 255 </tr>'
256 256 filecompchild = '
257 257 <tr>
258 258 <td>child {rev}</td>
259 259 <td style="font-family:monospace">
260 260 <a class="list" href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
261 261 </td>
262 262 </tr>'
263 263 shortlog = shortlog.tmpl
264 264 graph = graph.tmpl
265 265 phasetag = '{ifeq(phase, 'public', '', '<span class="phasetag" title="{phase|escape}">{phase|escape}</span> ')}'
266 obsoletetag = '{if(obsolete, '<span class="obsoletetag" title="obsolete">obsolete</span> ')}'
266 267 tagtag = '<span class="tagtag" title="{name|escape}">{name|escape}</span> '
267 268 branchtag = '<span class="branchtag" title="{name|escape}">{name|escape}</span> '
268 269 inbranchtag = '<span class="inbranchtag" title="{name|escape}">{name|escape}</span> '
269 270 bookmarktag = '<span class="bookmarktag" title="{name|escape}">{name|escape}</span> '
270 alltags = '<span class="logtags">{phasetag}{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>'
271 alltags = '<span class="logtags">{phasetag}{obsoletetag}{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>'
271 272 shortlogentry = '
272 273 <tr class="parity{parity}">
273 274 <td class="age"><i class="age">{date|rfc822date}</i></td>
274 275 <td><i>{author|person}</i></td>
275 276 <td>
276 277 <a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
277 278 <b>{desc|strip|firstline|escape|nonempty}</b>
278 279 {alltags}
279 280 </a>
280 281 </td>
281 282 <td class="link" nowrap>
282 283 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
283 284 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
284 285 </td>
285 286 </tr>'
286 287 filelogentry = '
287 288 <tr class="parity{if(patch, '1', '{parity}')}">
288 289 <td class="age"><i class="age">{date|rfc822date}</i></td>
289 290 <td><i>{author|person}</i></td>
290 291 <td>
291 292 <a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
292 293 <b>{desc|strip|firstline|escape|nonempty}</b>
293 294 {alltags}
294 295 </a>
295 296 </td>
296 297 <td class="link">
297 298 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
298 299 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
299 300 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
300 301 {rename%filelogrename}
301 302 </td>
302 303 </tr>
303 304 {if(patch, '<tr><td colspan="4">{diff}</td></tr>')}'
304 305 archiveentry = ' | <a href="{url|urlescape}archive/{symrev}{extension}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a> '
305 306 indexentry = '
306 307 <tr class="parity{parity}">
307 308 <td>
308 309 <a class="list" href="{url|urlescape}{sessionvars%urlparameter}">
309 310 <b>{name|escape}</b>
310 311 </a>
311 312 </td>
312 313 <td>{description}</td>
313 314 <td>{contact|obfuscate}</td>
314 315 <td class="age">{lastchange|rfc822date}</td>
315 316 <td class="indexlinks">{archives%indexarchiveentry}</td>
316 317 <td>{if(isdirectory, '',
317 318 '<div class="rss_logo">
318 319 <a href="{url|urlescape}rss-log">RSS</a> <a href="{url|urlescape}atom-log">Atom</a>
319 320 </div>'
320 321 )}
321 322 </td>
322 323 </tr>\n'
323 324 indexarchiveentry = ' <a href="{url|urlescape}archive/{node|short}{extension}">{type|escape}</a> '
324 325 index = index.tmpl
325 326 urlparameter = '{separator}{name}={value|urlescape}'
326 327 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
327 328 breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
328 329
329 330 searchform = '
330 331 <div class="search">
331 332 <form id="searchform" action="{url|urlescape}log">
332 333 {sessionvars%hiddenformentry}
333 334 <input name="rev" type="text" value="{query|escape}" size="40" />
334 335 <div id="hint">{searchhint}</div>
335 336 </form>
336 337 </div>'
337 338 searchhint = 'Find changesets by keywords (author, files, the commit message), revision
338 339 number or hash, or <a href="{url|urlescape}help/revsets">revset expression</a>.'
339 340
340 341 diffoptsform = '
341 342 <form id="diffopts-form"
342 343 data-ignorews="{if(get(diffopts, 'ignorews'), '1', '0')}"
343 344 data-ignorewsamount="{if(get(diffopts, 'ignorewsamount'), '1', '0')}"
344 345 data-ignorewseol="{if(get(diffopts, 'ignorewseol'), '1', '0')}"
345 346 data-ignoreblanklines="{if(get(diffopts, 'ignoreblanklines'), '1', '0')}">
346 347 <span>Ignore whitespace changes - </span>
347 348 <span>Everywhere:</span>
348 349 <input id="ignorews-checkbox" type="checkbox" />
349 350 <span>Within whitespace:</span>
350 351 <input id="ignorewsamount-checkbox" type="checkbox" />
351 352 <span>At end of lines:</span>
352 353 <input id="ignorewseol-checkbox" type="checkbox" />
353 354 </form>'
@@ -1,292 +1,293 b''
1 1 default = 'summary'
2 2 mimetype = 'text/html; charset={encoding}'
3 3 header = header.tmpl
4 4 footer = footer.tmpl
5 5 search = search.tmpl
6 6 changelog = changelog.tmpl
7 7 summary = summary.tmpl
8 8 error = error.tmpl
9 9 notfound = notfound.tmpl
10 10
11 11 help = help.tmpl
12 12 helptopics = helptopics.tmpl
13 13
14 14 helpentry = '
15 15 <tr><td>
16 16 <a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
17 17 {if(basename, '{basename|escape}', '{topic|escape}')}
18 18 </a>
19 19 </td><td>
20 20 {summary|escape}
21 21 </td></tr>'
22 22
23 23 naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
24 24 navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
25 25 navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
26 26 filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
27 27 filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
28 28 filenodelink = '
29 29 <tr class="parity{parity}">
30 30 <td><a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
31 31 <td></td>
32 32 <td>
33 33 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
34 34 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
35 35 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
36 36 <a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
37 37 <a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
38 38 </td>
39 39 </tr>'
40 40 filenolink = '
41 41 <tr class="parity{parity}">
42 42 <td><a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
43 43 <td></td>
44 44 <td>
45 45 file |
46 46 annotate |
47 47 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
48 48 <a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
49 49 <a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
50 50 </td>
51 51 </tr>'
52 52
53 53 nav = '{before%naventry} {after%naventry}'
54 54 navshort = '{before%navshortentry}{after%navshortentry}'
55 55 navgraph = '{before%navgraphentry}{after%navgraphentry}'
56 56 filenav = '{before%filenaventry}{after%filenaventry}'
57 57
58 58 fileellipses = '...'
59 59 changelogentry = changelogentry.tmpl
60 60 searchentry = changelogentry.tmpl
61 61 changeset = changeset.tmpl
62 62 manifest = manifest.tmpl
63 63 direntry = '
64 64 <tr class="parity{parity}">
65 65 <td>drwxr-xr-x</td>
66 66 <td></td>
67 67 <td></td>
68 68 <td>
69 69 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>
70 70 <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">{emptydirs|escape}</a>
71 71 </td>
72 72 <td><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">files</a></td>
73 73 </tr>'
74 74 fileentry = '
75 75 <tr class="parity{parity}">
76 76 <td>{permissions|permissions}</td>
77 77 <td>{date|isodate}</td>
78 78 <td>{size}</td>
79 79 <td><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">{basename|escape}</a></td>
80 80 <td>
81 81 <a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
82 82 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
83 83 <a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
84 84 </td>
85 85 </tr>'
86 86 filerevision = filerevision.tmpl
87 87 fileannotate = fileannotate.tmpl
88 88 filediff = filediff.tmpl
89 89 filecomparison = filecomparison.tmpl
90 90 filelog = filelog.tmpl
91 91 fileline = '
92 92 <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
93 93 annotateline = '
94 94 <tr id="{lineid}" class="parity{parity}{ifeq(node, originalnode, ' thisrev')}">
95 95 <td class="annotate linenr parity{blockparity}">
96 96 {if(blockhead,
97 97 '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
98 98 {rev}
99 99 </a>')}
100 100 <div class="annotate-info">
101 101 <div>
102 102 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
103 103 {node|short}</a>
104 104 {desc|escape|firstline}
105 105 </div>
106 106 <div><em>{author|obfuscate}</em></div>
107 107 <div>parents: {parents%annotateparent}</div>
108 108 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
109 109 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
110 110 </div>
111 111 </td>
112 112 <td class="lineno">
113 113 <a href="#{lineid}">{linenumber}</a>
114 114 </td>
115 115 <td class="source">{line|escape}</td>
116 116 </tr>'
117 117 annotateparent = '
118 118 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
119 119 difflineplus = '
120 120 <a href="#{lineid}"></a><span id="{lineid}" class="difflineplus">{strip(line|escape, '\r\n')}</span>'
121 121 difflineminus = '
122 122 <a href="#{lineid}"></a><span id="{lineid}" class="difflineminus">{strip(line|escape, '\r\n')}</span>'
123 123 difflineat = '
124 124 <a href="#{lineid}"></a><span id="{lineid}" class="difflineat">{strip(line|escape, '\r\n')}</span>'
125 125 diffline = '
126 126 <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
127 127
128 128 comparisonblock ='
129 129 <tbody class="block">
130 130 {lines}
131 131 </tbody>'
132 132 comparisonline = '
133 133 <tr id="{lineid}">
134 134 <td class="source {type}"><a class="linenr" href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
135 135 <td class="source {type}"><a class="linenr" href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
136 136 </tr>'
137 137
138 138 changesetlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
139 139 changesetbranch = '<dt>branch</dt><dd>{name|escape}</dd>'
140 140 changesetparent = '
141 141 <dt>parent {rev}</dt>
142 142 <dd>{changesetlink}</dd>'
143 143 changesetparentdiff = '
144 144 <dt>parent {rev}</dt>
145 145 <dd>{changesetlink} {ifeq(node, basenode, '(current diff)', '({difffrom})')}</dd>'
146 146 difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
147 147 filerevbranch = '<dt>branch</dt><dd>{name|escape}</dd>'
148 148 filerevparent = '
149 149 <dt>parent {rev}</dt>
150 150 <dd>
151 151 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
152 152 {rename%filerename}{node|short}
153 153 </a>
154 154 </dd>'
155 155 filerename = '{file|escape}@'
156 156 filelogrename = '| <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">base</a>'
157 157 fileannotateparent = '
158 158 <dt>parent {rev}</dt>
159 159 <dd>
160 160 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
161 161 {rename%filerename}{node|short}
162 162 </a>
163 163 </dd>'
164 164 changesetchild = '
165 165 <dt>child {rev}</dt>
166 166 <dd><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></dd>'
167 167 filerevchild = '
168 168 <dt>child {rev}</dt>
169 169 <dd>
170 170 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
171 171 </dd>'
172 172 fileannotatechild = '
173 173 <dt>child {rev}</dt>
174 174 <dd>
175 175 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
176 176 </dd>'
177 177 tags = tags.tmpl
178 178 tagentry = '
179 179 <tr class="parity{parity}">
180 180 <td class="nowrap age">{date|rfc822date}</td>
181 181 <td><a href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}">{tag|escape}</a></td>
182 182 <td class="nowrap">
183 183 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
184 184 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
185 185 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
186 186 </td>
187 187 </tr>'
188 188 bookmarks = bookmarks.tmpl
189 189 bookmarkentry = '
190 190 <tr class="parity{parity}">
191 191 <td class="nowrap age">{date|rfc822date}</td>
192 192 <td><a href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}">{bookmark|escape}</a></td>
193 193 <td class="nowrap">
194 194 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
195 195 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
196 196 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
197 197 </td>
198 198 </tr>'
199 199 branches = branches.tmpl
200 200 branchentry = '
201 201 <tr class="parity{parity}">
202 202 <td class="nowrap age">{date|rfc822date}</td>
203 203 <td class="{status}"><a href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}">{branch|escape}</a></td>
204 204 <td class="nowrap">
205 205 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
206 206 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
207 207 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
208 208 </td>
209 209 </tr>'
210 210 diffblock = '<div class="diffblock"><pre class="sourcelines">{lines}</pre></div>'
211 211 filediffparent = '
212 212 <dt>parent {rev}</dt>
213 213 <dd><a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
214 214 filecompparent = '
215 215 <dt>parent {rev}</dt>
216 216 <dd><a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
217 217 filediffchild = '
218 218 <dt>child {rev}</dt>
219 219 <dd><a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
220 220 filecompchild = '
221 221 <dt>child {rev}</dt>
222 222 <dd><a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
223 223 shortlog = shortlog.tmpl
224 224 phasetag = '{ifeq(phase, 'public', '', '<span class="phasetag" title="{phase|escape}">{phase|escape}</span> ')}'
225 obsoletetag = '{if(obsolete, '<span class="obsoletetag" title="obsolete">obsolete</span> ')}'
225 226 tagtag = '<span class="tagtag" title="{name|escape}">{name|escape}</span> '
226 227 branchtag = '<span class="branchtag" title="{name|escape}">{name|escape}</span> '
227 228 inbranchtag = '<span class="inbranchtag" title="{name|escape}">{name|escape}</span> '
228 229 bookmarktag = '<span class="bookmarktag" title="{name|escape}">{name|escape}</span> '
229 alltags = '<span class="logtags">{phasetag}{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>'
230 alltags = '<span class="logtags">{phasetag}{obsoletetag}{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>'
230 231 shortlogentry = '
231 232 <tr class="parity{parity}">
232 233 <td class="nowrap age">{date|rfc822date}</td>
233 234 <td>{author|person}</td>
234 235 <td>
235 236 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
236 237 {desc|strip|firstline|escape|nonempty}
237 238 {alltags}
238 239 </a>
239 240 </td>
240 241 <td class="nowrap">
241 242 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
242 243 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
243 244 </td>
244 245 </tr>'
245 246 filelogentry = '
246 247 <tr class="parity{parity}">
247 248 <td class="nowrap age">{date|rfc822date}</td>
248 249 <td>{author|person}</td>
249 250 <td>
250 251 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
251 252 {desc|strip|firstline|escape|nonempty}
252 253 {alltags}
253 254 </a>
254 255 </td>
255 256 <td class="nowrap">
256 257 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
257 258 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
258 259 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
259 260 {rename%filelogrename}
260 261 </td>
261 262 </tr>'
262 263 archiveentry = '<li><a href="{url|urlescape}archive/{symrev}{extension}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a></li>'
263 264 indexentry = '
264 265 <tr class="parity{parity}">
265 266 <td><a href="{url|urlescape}{sessionvars%urlparameter}">{name|escape}</a></td>
266 267 <td>{description}</td>
267 268 <td>{contact|obfuscate}</td>
268 269 <td class="age">{lastchange|rfc822date}</td>
269 270 <td class="indexlinks">{archives%indexarchiveentry}</td>
270 271 <td>
271 272 {if(isdirectory, '',
272 273 '<div class="rss_logo">
273 274 <a href="{url|urlescape}rss-log">RSS</a> <a href="{url|urlescape}atom-log">Atom</a>
274 275 </div>'
275 276 )}
276 277 </td>
277 278 </tr>\n'
278 279 indexarchiveentry = '<a href="{url|urlescape}archive/{node|short}{extension}">{type|escape}</a> '
279 280 index = index.tmpl
280 281 urlparameter = '{separator}{name}={value|urlescape}'
281 282 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
282 283 graph = graph.tmpl
283 284 breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
284 285
285 286 searchform = '
286 287 <form action="{url|urlescape}log">
287 288 {sessionvars%hiddenformentry}
288 289 <dl class="search">
289 290 <dt><label>Search: </label></dt>
290 291 <dd><input type="text" name="rev" value="{query|escape}" /></dd>
291 292 </dl>
292 293 </form>'
@@ -1,270 +1,271 b''
1 1 default = 'shortlog'
2 2
3 3 mimetype = 'text/html; charset={encoding}'
4 4 header = header.tmpl
5 5 footer = footer.tmpl
6 6 search = search.tmpl
7 7
8 8 changelog = shortlog.tmpl
9 9 shortlog = shortlog.tmpl
10 10 shortlogentry = shortlogentry.tmpl
11 11 graph = graph.tmpl
12 12 help = help.tmpl
13 13 helptopics = helptopics.tmpl
14 14
15 15 helpentry = '
16 16 <tr><td>
17 17 <a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
18 18 {if(basename, '{basename|escape}', '{topic|escape}')}
19 19 </a>
20 20 </td><td>
21 21 {summary|escape}
22 22 </td></tr>'
23 23
24 24 naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
25 25 navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
26 26 navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
27 27 filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
28 28 filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
29 29 filenodelink = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
30 30 filenolink = '{file|escape} '
31 31 fileellipses = '...'
32 32 diffstatlink = diffstat.tmpl
33 33 diffstatnolink = diffstat.tmpl
34 34 changelogentry = shortlogentry.tmpl
35 35 searchentry = shortlogentry.tmpl
36 36 changeset = changeset.tmpl
37 37 manifest = manifest.tmpl
38 38
39 39 nav = '{before%naventry} {after%naventry}'
40 40 navshort = '{before%navshortentry}{after%navshortentry}'
41 41 navgraph = '{before%navgraphentry}{after%navgraphentry}'
42 42 filenav = '{before%filenaventry}{after%filenaventry}'
43 43
44 44 direntry = '
45 45 <tr class="fileline">
46 46 <td class="name">
47 47 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">
48 48 <img src="{staticurl|urlescape}coal-folder.png" alt="dir."/> {basename|escape}/
49 49 </a>
50 50 <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
51 51 {emptydirs|escape}
52 52 </a>
53 53 </td>
54 54 <td class="size"></td>
55 55 <td class="permissions">drwxr-xr-x</td>
56 56 </tr>'
57 57
58 58 fileentry = '
59 59 <tr class="fileline">
60 60 <td class="filename">
61 61 <a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">
62 62 <img src="{staticurl|urlescape}coal-file.png" alt="file"/> {basename|escape}
63 63 </a>
64 64 </td>
65 65 <td class="size">{size}</td>
66 66 <td class="permissions">{permissions|permissions}</td>
67 67 </tr>'
68 68
69 69 filerevision = filerevision.tmpl
70 70 fileannotate = fileannotate.tmpl
71 71 filediff = filediff.tmpl
72 72 filecomparison = filecomparison.tmpl
73 73 filelog = filelog.tmpl
74 74 fileline = '
75 75 <span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
76 76 filelogentry = filelogentry.tmpl
77 77
78 78 annotateline = '
79 79 <tr id="{lineid}"{ifeq(node, originalnode, ' class="thisrev"')}>
80 80 <td class="annotate parity{blockparity}">
81 81 {if(blockhead,
82 82 '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
83 83 {rev}
84 84 </a>')}
85 85 <div class="annotate-info">
86 86 <div>
87 87 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
88 88 {node|short}</a>
89 89 {desc|escape|firstline}
90 90 </div>
91 91 <div><em>{author|obfuscate}</em></div>
92 92 <div>parents: {parents%annotateparent}</div>
93 93 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
94 94 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
95 95 </div>
96 96 </td>
97 97 <td class="source followlines-btn-parent"><a href="#{lineid}">{linenumber}</a> {line|escape}</td>
98 98 </tr>'
99 99 annotateparent = '
100 100 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
101 101 diffblock = '<div class="bottomline inc-lineno"><pre class="sourcelines wrap">{lines}</pre></div>'
102 102 difflineplus = '
103 103 <span id="{lineid}" class="plusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
104 104 difflineminus = '
105 105 <span id="{lineid}" class="minusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
106 106 difflineat = '
107 107 <span id="{lineid}" class="atline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
108 108 diffline = '
109 109 <span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
110 110
111 111 comparisonblock ='
112 112 <tbody class="block">
113 113 {lines}
114 114 </tbody>'
115 115 comparisonline = '
116 116 <tr id="{lineid}">
117 117 <td class="source {type}"><a href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
118 118 <td class="source {type}"><a href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
119 119 </tr>'
120 120
121 121 changesetparent = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
122 122
123 123 changesetparentdiff = '
124 124 {changesetparent}
125 125 {ifeq(node, basenode, '(current diff)', '({difffrom})')}'
126 126
127 127 difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
128 128
129 129 filerevparent = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a> '
130 130 filerevchild = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a> '
131 131
132 132 filerename = '{file|escape}@'
133 133 filelogrename = '
134 134 <span class="base">
135 135 base
136 136 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
137 137 {file|escape}@{node|short}
138 138 </a>
139 139 </span>'
140 140 fileannotateparent = '
141 141 <tr>
142 142 <td class="metatag">parent:</td>
143 143 <td>
144 144 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
145 145 {rename%filerename}{node|short}
146 146 </a>
147 147 </td>
148 148 </tr>'
149 149 changesetchild = ' <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
150 150 fileannotatechild = '
151 151 <tr>
152 152 <td class="metatag">child:</td>
153 153 <td>
154 154 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
155 155 {node|short}
156 156 </a>
157 157 </td>
158 158 </tr>'
159 159 tags = tags.tmpl
160 160 tagentry = '
161 161 <tr class="tagEntry">
162 162 <td>
163 163 <a href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}">
164 164 {tag|escape}
165 165 </a>
166 166 </td>
167 167 <td class="node">
168 168 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
169 169 {node|short}
170 170 </a>
171 171 </td>
172 172 </tr>'
173 173 bookmarks = bookmarks.tmpl
174 174 bookmarkentry = '
175 175 <tr class="tagEntry">
176 176 <td>
177 177 <a href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}">
178 178 {bookmark|escape}
179 179 </a>
180 180 </td>
181 181 <td class="node">
182 182 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
183 183 {node|short}
184 184 </a>
185 185 </td>
186 186 </tr>'
187 187 branches = branches.tmpl
188 188 branchentry = '
189 189 <tr class="tagEntry">
190 190 <td>
191 191 <a href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}" class="{status}">
192 192 {branch|escape}
193 193 </a>
194 194 </td>
195 195 <td class="node">
196 196 <a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
197 197 {node|short}
198 198 </a>
199 199 </td>
200 200 </tr>'
201 201 phasetag = '{ifeq(phase, 'public', '', '<span class="phase">{phase|escape}</span> ')}'
202 obsoletetag = '{if(obsolete, '<span class="obsolete">obsolete</span> ')}'
202 203 changelogtag = '<span class="tag">{name|escape}</span> '
203 204 changesettag = '<span class="tag">{tag|escape}</span> '
204 205 changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
205 206 changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
206 207 changelogbranchname = '<span class="branchname">{name|escape}</span> '
207 alltags = '{phasetag}{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags%changelogtag}{bookmarks%changelogtag}'
208 alltags = '{phasetag}{obsoletetag}{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags%changelogtag}{bookmarks%changelogtag}'
208 209
209 210 filediffparent = '
210 211 <tr>
211 212 <th class="parent">parent {rev}:</th>
212 213 <td class="parent"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
213 214 </tr>'
214 215 filediffchild = '
215 216 <tr>
216 217 <th class="child">child {rev}:</th>
217 218 <td class="child"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
218 219 </td>
219 220 </tr>'
220 221
221 222 indexentry = '
222 223 <tr>
223 224 <td><a href="{url|urlescape}{sessionvars%urlparameter}">{name|escape}</a></td>
224 225 <td>{description}</td>
225 226 <td>{contact|obfuscate}</td>
226 227 <td class="age">{lastchange|rfc822date}</td>
227 228 <td class="indexlinks">{archives%indexarchiveentry}</td>
228 229 <td>
229 230 {if(isdirectory, '',
230 231 '<a href="{url|urlescape}atom-log" title="subscribe to repository atom feed">
231 232 <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="subscribe to repository atom feed">
232 233 </a>'
233 234 )}
234 235 </td>
235 236 </tr>\n'
236 237 indexarchiveentry = '<a href="{url|urlescape}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}</a>'
237 238 index = index.tmpl
238 239 archiveentry = '
239 240 <li>
240 241 <a href="{url|urlescape}archive/{symrev}{extension|urlescape}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a>
241 242 </li>'
242 243 notfound = notfound.tmpl
243 244 error = error.tmpl
244 245 urlparameter = '{separator}{name}={value|urlescape}'
245 246 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
246 247 breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
247 248
248 249 searchform = '
249 250 <form class="search" action="{url|urlescape}log">
250 251 {sessionvars%hiddenformentry}
251 252 <p><input name="rev" id="search1" type="text" size="30" value="{query|escape}" /></p>
252 253 <div id="hint">{searchhint}</div>
253 254 </form>'
254 255 searchhint = 'Find changesets by keywords (author, files, the commit message), revision
255 256 number or hash, or <a href="{url|urlescape}help/revsets">revset expression</a>.'
256 257
257 258 diffoptsform = '
258 259 <form id="diffopts-form"
259 260 data-ignorews="{if(get(diffopts, 'ignorews'), '1', '0')}"
260 261 data-ignorewsamount="{if(get(diffopts, 'ignorewsamount'), '1', '0')}"
261 262 data-ignorewseol="{if(get(diffopts, 'ignorewseol'), '1', '0')}"
262 263 data-ignoreblanklines="{if(get(diffopts, 'ignoreblanklines'), '1', '0')}">
263 264 <span>Ignore whitespace changes - </span>
264 265 <span>Everywhere:</span>
265 266 <input id="ignorews-checkbox" type="checkbox" />
266 267 <span>Within whitespace:</span>
267 268 <input id="ignorewsamount-checkbox" type="checkbox" />
268 269 <span>At end of lines:</span>
269 270 <input id="ignorewseol-checkbox" type="checkbox" />
270 271 </form>'
@@ -1,29 +1,33 b''
1 1 <table class="logEntry parity{parity}">
2 2 <tr>
3 3 <th class="label"><span class="age">{date|rfc822date}</span>:</th>
4 4 <th class="firstline">{desc|strip|firstline|escape|nonempty}</th>
5 5 </tr>
6 6 <tr>
7 7 <th class="revision">changeset {rev}:</th>
8 8 <td class="node"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
9 9 </tr>
10 10 {parent%changelogparent}
11 11 {child%changelogchild}
12 12 {changelogtag}
13 13 <tr>
14 14 <th class="author">author:</th>
15 15 <td class="author">{author|obfuscate}</td>
16 16 </tr>
17 17 <tr>
18 18 <th class="date">date:</th>
19 19 <td class="date">{date|rfc822date}</td>
20 20 </tr>
21 21 {ifeq(phase, 'public', '', '<tr>
22 22 <th class="phase">phase:</th>
23 23 <td class="phase">{phase|escape}</td>
24 24 </tr>')}
25 {if(obsolete, '<tr>
26 <th class="obsolete">obsolete:</th>
27 <td class="obsolete">yes</td>
28 </tr>')}
25 29 <tr>
26 30 <th class="files"><a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>:</th>
27 31 <td class="files">{files}</td>
28 32 </tr>
29 33 </table>
@@ -1,56 +1,60 b''
1 1 {header}
2 2 <title>{repo|escape}: changeset {node|short}</title>
3 3 </head>
4 4 <body>
5 5
6 6 <div class="buttons">
7 7 <a href="{url|urlescape}log/{symrev}{sessionvars%urlparameter}">changelog</a>
8 8 <a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">shortlog</a>
9 9 <a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a>
10 10 <a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a>
11 11 <a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a>
12 12 <a href="{url|urlescape}file/{symrev}{sessionvars%urlparameter}">files</a>
13 13 <a href="{url|urlescape}raw-rev/{symrev}">raw</a>
14 14 {archives%archiveentry}
15 15 <a href="{url|urlescape}help{sessionvars%urlparameter}">help</a>
16 16 </div>
17 17
18 18 <h2><a href="/">Mercurial</a> {pathdef%breadcrumb} / changeset: {desc|strip|escape|firstline|nonempty}</h2>
19 19
20 20 <table id="changesetEntry">
21 21 <tr>
22 22 <th class="changeset">changeset {rev}:</th>
23 23 <td class="changeset"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
24 24 </tr>
25 25 {ifeq(count(parent), '2', parent%changesetparentdiff, parent%changesetparent)}
26 26 {child%changesetchild}
27 27 {changesettag}
28 28 <tr>
29 29 <th class="author">author:</th>
30 30 <td class="author">{author|obfuscate}</td>
31 31 </tr>
32 32 <tr>
33 33 <th class="date">date:</th>
34 34 <td class="date age">{date|rfc822date}</td>
35 35 </tr>
36 36 {ifeq(phase, 'public', '', '<tr>
37 37 <th class="phase">phase:</th>
38 38 <td class="phase">{phase|escape}</td>
39 39 </tr>')}
40 {if(obsolete, '<tr>
41 <th class="obsolete">obsolete:</th>
42 <td class="obsolete">yes</td>
43 </tr>')}
40 44 <tr>
41 45 <th class="files">files:</th>
42 46 <td class="files">{files}</td>
43 47 </tr>
44 48 <tr>
45 49 <th class="description">description:</th>
46 50 <td class="description">{desc|strip|escape|websub|addbreaks|nonempty}</td>
47 51 </tr>
48 52 </table>
49 53
50 54 <div id="changesetDiff">
51 55 {diff}
52 56 </div>
53 57
54 58 {footer}
55 59
56 60
@@ -1,393 +1,397 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 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 div.diff_info { font-family:monospace; color:#000099; background-color:#edece6; font-style:italic; }
65 65 div.index_include { border:solid #d9d8d1; border-width:0px 0px 1px; padding:12px 8px; }
66 66
67 67 .search {
68 68 margin-right: 8px;
69 69 }
70 70
71 71 div#hint {
72 72 position: absolute;
73 73 display: none;
74 74 width: 250px;
75 75 padding: 5px;
76 76 background: #ffc;
77 77 border: 1px solid yellow;
78 78 border-radius: 5px;
79 79 }
80 80
81 81 #searchform:hover div#hint { display: block; }
82 82
83 83 tr.thisrev a { color:#999999; text-decoration: none; }
84 84 tr.thisrev pre { color:#009900; }
85 85 td.annotate {
86 86 white-space: nowrap;
87 87 }
88 88 div.annotate-info {
89 89 z-index: 5;
90 90 display: none;
91 91 position: absolute;
92 92 background-color: #FFFFFF;
93 93 border: 1px solid #d9d8d1;
94 94 text-align: left;
95 95 color: #000000;
96 96 padding: 5px;
97 97 }
98 98 div.annotate-info a { color: #0000FF; text-decoration: underline; }
99 99 td.annotate:hover div.annotate-info { display: inline; }
100 100
101 101 #diffopts-form {
102 102 padding-left: 8px;
103 103 display: none;
104 104 }
105 105
106 106 .linenr { color:#999999; text-decoration:none }
107 107 div.rss_logo { float: right; white-space: nowrap; }
108 108 div.rss_logo a {
109 109 padding:3px 6px; line-height:10px;
110 110 border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
111 111 color:#ffffff; background-color:#ff6600;
112 112 font-weight:bold; font-family:sans-serif; font-size:10px;
113 113 text-align:center; text-decoration:none;
114 114 }
115 115 div.rss_logo a:hover { background-color:#ee5500; }
116 116 pre { margin: 0; }
117 117 span.logtags span {
118 118 padding: 0px 4px;
119 119 font-size: 10px;
120 120 font-weight: normal;
121 121 border: 1px solid;
122 122 background-color: #ffaaff;
123 123 border-color: #ffccff #ff00ee #ff00ee #ffccff;
124 124 }
125 125 span.logtags span.phasetag {
126 126 background-color: #dfafff;
127 127 border-color: #e2b8ff #ce48ff #ce48ff #e2b8ff;
128 128 }
129 span.logtags span.obsoletetag {
130 background-color: #dddddd;
131 border-color: #e4e4e4 #a3a3a3 #a3a3a3 #e4e4e4;
132 }
129 133 span.logtags span.tagtag {
130 134 background-color: #ffffaa;
131 135 border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
132 136 }
133 137 span.logtags span.branchtag {
134 138 background-color: #aaffaa;
135 139 border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
136 140 }
137 141 span.logtags span.inbranchtag {
138 142 background-color: #d5dde6;
139 143 border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
140 144 }
141 145 span.logtags span.bookmarktag {
142 146 background-color: #afdffa;
143 147 border-color: #ccecff #46ace6 #46ace6 #ccecff;
144 148 }
145 149 span.difflineplus { color:#008800; }
146 150 span.difflineminus { color:#cc0000; }
147 151 span.difflineat { color:#990099; }
148 152 div.diffblocks { counter-reset: lineno; }
149 153 div.diffblock { counter-increment: lineno; }
150 154 pre.sourcelines { position: relative; counter-reset: lineno; }
151 155 pre.sourcelines > span {
152 156 display: inline-block;
153 157 box-sizing: border-box;
154 158 width: 100%;
155 159 padding: 0 0 0 5em;
156 160 counter-increment: lineno;
157 161 vertical-align: top;
158 162 }
159 163 pre.sourcelines > span:before {
160 164 -moz-user-select: -moz-none;
161 165 -khtml-user-select: none;
162 166 -webkit-user-select: none;
163 167 -ms-user-select: none;
164 168 user-select: none;
165 169 display: inline-block;
166 170 margin-left: -6em;
167 171 width: 4em;
168 172 color: #999;
169 173 text-align: right;
170 174 content: counters(lineno,".");
171 175 float: left;
172 176 }
173 177 pre.sourcelines > a {
174 178 display: inline-block;
175 179 position: absolute;
176 180 left: 0px;
177 181 width: 4em;
178 182 height: 1em;
179 183 }
180 184 tr:target td,
181 185 pre.sourcelines > span:target,
182 186 pre.sourcelines.stripes > span:target {
183 187 background-color: #bfdfff;
184 188 }
185 189
186 190 .description {
187 191 font-family: monospace;
188 192 white-space: pre;
189 193 }
190 194
191 195 /* Followlines */
192 196 tbody.sourcelines > tr.followlines-selected,
193 197 pre.sourcelines > span.followlines-selected {
194 198 background-color: #99C7E9 !important;
195 199 }
196 200
197 201 div#followlines {
198 202 background-color: #FFF;
199 203 border: 1px solid #d9d8d1;
200 204 padding: 5px;
201 205 position: fixed;
202 206 }
203 207
204 208 div.followlines-cancel {
205 209 text-align: right;
206 210 }
207 211
208 212 div.followlines-cancel > button {
209 213 line-height: 80%;
210 214 padding: 0;
211 215 border: 0;
212 216 border-radius: 2px;
213 217 background-color: inherit;
214 218 font-weight: bold;
215 219 }
216 220
217 221 div.followlines-cancel > button:hover {
218 222 color: #FFFFFF;
219 223 background-color: #CF1F1F;
220 224 }
221 225
222 226 div.followlines-link {
223 227 margin: 2px;
224 228 margin-top: 4px;
225 229 font-family: sans-serif;
226 230 }
227 231
228 232 .btn-followlines {
229 233 display: none;
230 234 cursor: pointer;
231 235 box-sizing: content-box;
232 236 font-size: 11px;
233 237 width: 13px;
234 238 height: 13px;
235 239 border-radius: 3px;
236 240 margin: 0px;
237 241 margin-top: -2px;
238 242 padding: 0px;
239 243 background-color: #E5FDE5;
240 244 border: 1px solid #9BC19B;
241 245 font-family: monospace;
242 246 text-align: center;
243 247 line-height: 5px;
244 248 }
245 249
246 250 tr .btn-followlines {
247 251 position: absolute;
248 252 }
249 253
250 254 span .btn-followlines {
251 255 float: left;
252 256 }
253 257
254 258 span.followlines-select .btn-followlines {
255 259 margin-left: -1.6em;
256 260 }
257 261
258 262 .btn-followlines:hover {
259 263 transform: scale(1.1, 1.1);
260 264 }
261 265
262 266 .btn-followlines .followlines-plus {
263 267 color: green;
264 268 }
265 269
266 270 .btn-followlines .followlines-minus {
267 271 color: red;
268 272 }
269 273
270 274 .btn-followlines-end {
271 275 background-color: #ffdcdc;
272 276 }
273 277
274 278 .sourcelines tr:hover .btn-followlines,
275 279 .sourcelines span.followlines-select:hover > .btn-followlines {
276 280 display: inline;
277 281 }
278 282
279 283 .btn-followlines-hidden,
280 284 .sourcelines tr:hover .btn-followlines-hidden {
281 285 display: none;
282 286 }
283 287
284 288 /* Graph */
285 289 div#wrapper {
286 290 position: relative;
287 291 margin: 0;
288 292 padding: 0;
289 293 margin-top: 3px;
290 294 }
291 295
292 296 canvas {
293 297 position: absolute;
294 298 z-index: 5;
295 299 top: -0.9em;
296 300 margin: 0;
297 301 }
298 302
299 303 ul#nodebgs {
300 304 list-style: none inside none;
301 305 padding: 0;
302 306 margin: 0;
303 307 top: -0.7em;
304 308 }
305 309
306 310 ul#graphnodes li, ul#nodebgs li {
307 311 height: 39px;
308 312 }
309 313
310 314 ul#graphnodes {
311 315 position: absolute;
312 316 z-index: 10;
313 317 top: -0.8em;
314 318 list-style: none inside none;
315 319 padding: 0;
316 320 }
317 321
318 322 ul#graphnodes li .info {
319 323 display: block;
320 324 font-size: 100%;
321 325 position: relative;
322 326 top: -3px;
323 327 font-style: italic;
324 328 }
325 329
326 330 /* Comparison */
327 331 .legend {
328 332 padding: 1.5% 0 1.5% 0;
329 333 }
330 334
331 335 .legendinfo {
332 336 border: 1px solid #d9d8d1;
333 337 font-size: 80%;
334 338 text-align: center;
335 339 padding: 0.5%;
336 340 }
337 341
338 342 .equal {
339 343 background-color: #ffffff;
340 344 }
341 345
342 346 .delete {
343 347 background-color: #faa;
344 348 color: #333;
345 349 }
346 350
347 351 .insert {
348 352 background-color: #ffa;
349 353 }
350 354
351 355 .replace {
352 356 background-color: #e8e8e8;
353 357 }
354 358
355 359 .comparison {
356 360 overflow-x: auto;
357 361 }
358 362
359 363 .header th {
360 364 text-align: center;
361 365 }
362 366
363 367 .block {
364 368 border-top: 1px solid #d9d8d1;
365 369 }
366 370
367 371 .scroll-loading {
368 372 -webkit-animation: change_color 1s linear 0s infinite alternate;
369 373 -moz-animation: change_color 1s linear 0s infinite alternate;
370 374 -o-animation: change_color 1s linear 0s infinite alternate;
371 375 animation: change_color 1s linear 0s infinite alternate;
372 376 }
373 377
374 378 @-webkit-keyframes change_color {
375 379 from { background-color: #A0CEFF; } to { }
376 380 }
377 381 @-moz-keyframes change_color {
378 382 from { background-color: #A0CEFF; } to { }
379 383 }
380 384 @-o-keyframes change_color {
381 385 from { background-color: #A0CEFF; } to { }
382 386 }
383 387 @keyframes change_color {
384 388 from { background-color: #A0CEFF; } to { }
385 389 }
386 390
387 391 .scroll-loading-error {
388 392 background-color: #FFCCCC !important;
389 393 }
390 394
391 395 #doc {
392 396 margin: 0 8px;
393 397 }
@@ -1,578 +1,582 b''
1 1 /*** Initial Settings ***/
2 2 * {
3 3 margin: 0;
4 4 padding: 0;
5 5 font-weight: normal;
6 6 font-style: normal;
7 7 }
8 8
9 9 html {
10 10 font-size: 100%;
11 11 font-family: sans-serif;
12 12 }
13 13
14 14 body {
15 15 font-size: 77%;
16 16 margin: 15px 50px;
17 17 background: #4B4B4C;
18 18 }
19 19
20 20 a {
21 21 color:#0000cc;
22 22 text-decoration: none;
23 23 }
24 24 /*** end of Initial Settings ***/
25 25
26 26
27 27 /** common settings **/
28 28 div#container {
29 29 background: #FFFFFF;
30 30 position: relative;
31 31 color: #666;
32 32 }
33 33
34 34 div.page-header {
35 35 padding: 50px 20px 0;
36 36 background: #006699 top left repeat-x;
37 37 position: relative;
38 38 }
39 39 div.page-header h1 {
40 40 margin: 10px 0 30px;
41 41 font-size: 1.8em;
42 42 font-weight: bold;
43 43 font-family: osaka,'MS P Gothic', Georgia, serif;
44 44 letter-spacing: 1px;
45 45 color: #DDD;
46 46 }
47 47 div.page-header h1 a {
48 48 font-weight: bold;
49 49 color: #FFF;
50 50 }
51 51 div.page-header a {
52 52 text-decoration: none;
53 53 }
54 54
55 55 div.page-header form {
56 56 float: right;
57 57 margin-top: -2px;
58 58 }
59 59 div.page-header form label {
60 60 color: #DDD;
61 61 }
62 62 div.page-header form input {
63 63 padding: 2px;
64 64 border: solid 1px #DDD;
65 65 }
66 66 div.page-header form dl {
67 67 overflow: hidden;
68 68 }
69 69 div.page-header form dl dt {
70 70 font-size: 1.2em;
71 71 }
72 72 div.page-header form dl dt,
73 73 div.page-header form dl dd {
74 74 margin: 0 0 0 5px;
75 75 float: left;
76 76 height: 24px;
77 77 line-height: 20px;
78 78 }
79 79
80 80 ul.page-nav {
81 81 margin: 10px 0 0 0;
82 82 list-style-type: none;
83 83 overflow: hidden;
84 84 }
85 85 ul.page-nav li {
86 86 margin: 0 2px 0 0;
87 87 float: left;
88 88 width: 80px;
89 89 height: 24px;
90 90 font-size: 1.1em;
91 91 line-height: 24px;
92 92 text-align: center;
93 93 }
94 94 ul.page-nav li.current {
95 95 background: #FFF;
96 96 }
97 97 ul.page-nav li a {
98 98 height: 24px;
99 99 color: #666;
100 100 background: #DDD;
101 101 display: block;
102 102 text-decoration: none;
103 103 }
104 104 ul.page-nav li a:hover {
105 105 color:#333;
106 106 background: #FFF;
107 107 }
108 108
109 109 ul.submenu {
110 110 margin: 10px 0 -10px 20px;
111 111 list-style-type: none;
112 112 }
113 113 ul.submenu li {
114 114 margin: 0 10px 0 0;
115 115 font-size: 1.2em;
116 116 display: inline;
117 117 }
118 118
119 119 h2 {
120 120 margin: 20px 0 10px;
121 121 height: 30px;
122 122 line-height: 30px;
123 123 text-indent: 20px;
124 124 background: #FFF;
125 125 font-size: 1.2em;
126 126 border-top: dotted 1px #D5E1E6;
127 127 font-weight: bold;
128 128 }
129 129 h2.no-link {
130 130 color:#006699;
131 131 }
132 132 h2.no-border {
133 133 color: #FFF;
134 134 background: #006699;
135 135 border: 0;
136 136 }
137 137 h2 a {
138 138 font-weight:bold;
139 139 color:#006699;
140 140 }
141 141
142 142 div.page-path {
143 143 text-align: right;
144 144 padding: 20px 30px 10px 0;
145 145 border:solid #d9d8d1;
146 146 border-width:0px 0px 1px;
147 147 font-size: 1.2em;
148 148 }
149 149
150 150 div.page-footer {
151 151 margin: 50px 0 0;
152 152 position: relative;
153 153 }
154 154 div.page-footer p {
155 155 position: relative;
156 156 padding-left: 20px;
157 157 bottom: 5px;
158 158 font-size: 1.2em;
159 159 }
160 160
161 161 ul.rss-logo {
162 162 position: absolute;
163 163 top: -10px;
164 164 right: 20px;
165 165 height: 20px;
166 166 list-style-type: none;
167 167 }
168 168 ul.rss-logo li {
169 169 display: inline;
170 170 }
171 171 ul.rss-logo li a {
172 172 padding: 3px 6px;
173 173 line-height: 10px;
174 174 border:1px solid;
175 175 border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
176 176 color:#ffffff;
177 177 background-color:#ff6600;
178 178 font-weight:bold;
179 179 font-family:sans-serif;
180 180 font-size:10px;
181 181 text-align:center;
182 182 text-decoration:none;
183 183 }
184 184 div.rss-logo li a:hover {
185 185 background-color:#ee5500;
186 186 }
187 187
188 188 p.normal {
189 189 margin: 20px 0 20px 30px;
190 190 font-size: 1.2em;
191 191 }
192 192
193 193 table {
194 194 margin: 10px 0 0 20px;
195 195 width: 95%;
196 196 border-collapse: collapse;
197 197 }
198 198 table tr td {
199 199 font-size: 1.1em;
200 200 }
201 201 table tr td.nowrap {
202 202 white-space: nowrap;
203 203 }
204 204 table tr td.closed {
205 205 background-color: #99f;
206 206 }
207 207 /*
208 208 table tr.parity0:hover,
209 209 table tr.parity1:hover {
210 210 background: #D5E1E6;
211 211 }
212 212 */
213 213 table tr.parity0,
214 214 table td.annotate.parity0 {
215 215 background: #F1F6F7;
216 216 }
217 217 table tr.parity1,
218 218 table td.annotate.parity1 {
219 219 background: #FFFFFF;
220 220 }
221 221 table tr td {
222 222 padding: 5px 5px;
223 223 }
224 224 table.annotated tr td {
225 225 padding: 0px 5px;
226 226 }
227 227
228 228 span.logtags span {
229 229 padding: 2px 6px;
230 230 font-weight: normal;
231 231 font-size: 11px;
232 232 border: 1px solid;
233 233 background-color: #ffaaff;
234 234 border-color: #ffccff #ff00ee #ff00ee #ffccff;
235 235 }
236 236 span.logtags span.phasetag {
237 237 background-color: #dfafff;
238 238 border-color: #e2b8ff #ce48ff #ce48ff #e2b8ff;
239 239 }
240 span.logtags span.obsoletetag {
241 background-color: #dddddd;
242 border-color: #e4e4e4 #a3a3a3 #a3a3a3 #e4e4e4;
243 }
240 244 span.logtags span.tagtag {
241 245 background-color: #ffffaa;
242 246 border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
243 247 }
244 248 span.logtags span.branchtag {
245 249 background-color: #aaffaa;
246 250 border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
247 251 }
248 252 span.logtags span.inbranchtag {
249 253 background-color: #d5dde6;
250 254 border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
251 255 }
252 256 span.logtags span.bookmarktag {
253 257 background-color: #afdffa;
254 258 border-color: #ccecff #46ace6 #46ace6 #ccecff;
255 259 }
256 260
257 261 div.diff pre {
258 262 margin: 10px 0 0 0;
259 263 }
260 264 div.diff pre span {
261 265 font-family: monospace;
262 266 white-space: pre;
263 267 font-size: 1.2em;
264 268 }
265 269 div.diffblocks { counter-reset: lineno; }
266 270 div.diffblock { counter-increment: lineno; }
267 271 span.difflineplus { color:#008800; }
268 272 span.difflineminus { color:#cc0000; }
269 273 span.difflineat { color:#990099; }
270 274
271 275 pre.sourcelines {
272 276 position: relative;
273 277 counter-reset: lineno;
274 278 font-size: 1.2em;
275 279 }
276 280 pre.sourcelines > span {
277 281 display: inline-block;
278 282 box-sizing: border-box;
279 283 width: 100%;
280 284 padding: 0 0 0 5em;
281 285 counter-increment: lineno;
282 286 vertical-align: top;
283 287 }
284 288 div.source > pre.sourcelines > span {
285 289 padding: 1px 1px 1px 5em;
286 290 }
287 291 pre.sourcelines > span:before {
288 292 -moz-user-select: -moz-none;
289 293 -khtml-user-select: none;
290 294 -webkit-user-select: none;
291 295 -ms-user-select: none;
292 296 user-select: none;
293 297 display: inline-block;
294 298 margin-left: -5em;
295 299 width: 4em;
296 300 color: #999;
297 301 text-align: right;
298 302 content: counters(lineno,".");
299 303 float: left;
300 304 }
301 305 pre.sourcelines > a {
302 306 display: inline-block;
303 307 position: absolute;
304 308 left: 0px;
305 309 width: 4em;
306 310 height: 1em;
307 311 padding: 0.15em;
308 312 }
309 313 pre.sourcelines.stripes > :nth-child(4n+2) { background-color: #F1F6F7; }
310 314 pre.sourcelines.stripes > :nth-child(4n+4) { background-color: #FFFFFF; }
311 315 pre.sourcelines.stripes > :nth-child(4n+2):hover,
312 316 pre.sourcelines.stripes > :nth-child(4n+4):hover,
313 317 pre.sourcelines.stripes > :nth-child(4n+1):hover + :nth-child(4n+2),
314 318 pre.sourcelines.stripes > :nth-child(4n+3):hover + :nth-child(4n+4) { background-color: #D5E1E6; }
315 319
316 320 pre.sourcelines > span:target,
317 321 pre.sourcelines.stripes > span:target {
318 322 background-color: #bfdfff;
319 323 }
320 324
321 325 td.source {
322 326 white-space: pre;
323 327 margin: 10px 30px 0;
324 328 font-size: 1.2em;
325 329 font-family: monospace;
326 330 }
327 331 .linenr {
328 332 color: #999;
329 333 text-align: right;
330 334 }
331 335 .lineno {
332 336 text-align: right;
333 337 }
334 338 .lineno a {
335 339 color: #999;
336 340 }
337 341 td.linenr {
338 342 width: 60px;
339 343 }
340 344 tr.thisrev a { color:#999999; text-decoration: none; }
341 345 tr.thisrev td.source { color:#009900; }
342 346 td.annotate {
343 347 white-space: nowrap;
344 348 }
345 349 div.annotate-info {
346 350 display: none;
347 351 position: absolute;
348 352 background-color: #FFFFFF;
349 353 border: solid 1px #CCC;
350 354 text-align: left;
351 355 color: #666;
352 356 padding: 5px;
353 357 }
354 358 div.annotate-info a { color: #0000FF; }
355 359 td.annotate:hover div.annotate-info { display: inline; }
356 360
357 361 div#powered-by {
358 362 position: absolute;
359 363 width: 75px;
360 364 top: 15px;
361 365 right: 20px;
362 366 font-size: 1.2em;
363 367 }
364 368 div#powered-by a {
365 369 color: #EEE;
366 370 text-decoration: none;
367 371 }
368 372 div#powered-by a:hover {
369 373 text-decoration: underline;
370 374 }
371 375 /** end of common settings **/
372 376
373 377 /** summary **/
374 378 dl.overview {
375 379 margin: 0 0 0 30px;
376 380 font-size: 1.1em;
377 381 overflow: hidden;
378 382 }
379 383 dl.overview dt,
380 384 dl.overview dd {
381 385 margin: 5px 0;
382 386 float: left;
383 387 }
384 388 dl.overview dt {
385 389 clear: left;
386 390 font-weight: bold;
387 391 width: 150px;
388 392 }
389 393 /** end of summary **/
390 394
391 395 /** chagelog **/
392 396 h3.changelog {
393 397 margin: 20px 0 5px 30px;
394 398 padding: 0 0 2px;
395 399 font-size: 1.4em;
396 400 border-bottom: dotted 1px #D5E1E6;
397 401 }
398 402 ul.changelog-entry {
399 403 margin: 0 0 10px 30px;
400 404 list-style-type: none;
401 405 position: relative;
402 406 }
403 407 ul.changelog-entry li span.revdate {
404 408 font-size: 1.1em;
405 409 }
406 410 ul.changelog-entry li.age {
407 411 position: absolute;
408 412 top: -25px;
409 413 right: 10px;
410 414 font-size: 1.4em;
411 415 color: #CCC;
412 416 font-weight: bold;
413 417 font-style: italic;
414 418 }
415 419 ul.changelog-entry li span.name {
416 420 font-size: 1.2em;
417 421 font-weight: bold;
418 422 }
419 423 ul.changelog-entry li.description {
420 424 margin: 10px 0 0;
421 425 font-size: 1.1em;
422 426 }
423 427 /** end of changelog **/
424 428
425 429 /** file **/
426 430 p.files {
427 431 margin: 0 0 0 20px;
428 432 font-size: 2.0em;
429 433 font-weight: bold;
430 434 }
431 435 /** end of file **/
432 436
433 437 /** changeset **/
434 438 h3.changeset {
435 439 margin: 20px 0 5px 20px;
436 440 padding: 0 0 2px;
437 441 font-size: 1.6em;
438 442 border-bottom: dotted 1px #D5E1E6;
439 443 }
440 444 p.changeset-age {
441 445 position: relative;
442 446 }
443 447 p.changeset-age span {
444 448 position: absolute;
445 449 top: -25px;
446 450 right: 10px;
447 451 font-size: 1.4em;
448 452 color: #CCC;
449 453 font-weight: bold;
450 454 font-style: italic;
451 455 }
452 456 p.description {
453 457 margin: 10px 30px 0 30px;
454 458 padding: 10px;
455 459 border: solid 1px #CCC;
456 460 font-size: 1.2em;
457 461 }
458 462 /** end of changeset **/
459 463
460 464 /** canvas **/
461 465 div#wrapper {
462 466 position: relative;
463 467 font-size: 1.2em;
464 468 }
465 469
466 470 canvas {
467 471 position: absolute;
468 472 z-index: 5;
469 473 top: -0.7em;
470 474 }
471 475
472 476 ul#nodebgs li.parity0 {
473 477 background: #F1F6F7;
474 478 }
475 479
476 480 ul#nodebgs li.parity1 {
477 481 background: #FFFFFF;
478 482 }
479 483
480 484 ul#graphnodes {
481 485 position: absolute;
482 486 z-index: 10;
483 487 top: 7px;
484 488 list-style: none inside none;
485 489 }
486 490
487 491 ul#nodebgs {
488 492 list-style: none inside none;
489 493 }
490 494
491 495 ul#graphnodes li, ul#nodebgs li {
492 496 height: 39px;
493 497 }
494 498
495 499 ul#graphnodes li .info {
496 500 display: block;
497 501 position: relative;
498 502 }
499 503 /** end of canvas **/
500 504
501 505 /** comparison **/
502 506 .legend {
503 507 margin-left: 20px;
504 508 padding: 1.5% 0 1.5% 0;
505 509 }
506 510
507 511 .legendinfo {
508 512 border: 1px solid #999;
509 513 font-size: 80%;
510 514 text-align: center;
511 515 padding: 0.5%;
512 516 }
513 517
514 518 .equal {
515 519 background-color: #ffffff;
516 520 }
517 521
518 522 .delete {
519 523 background-color: #faa;
520 524 color: #333;
521 525 }
522 526
523 527 .insert {
524 528 background-color: #ffa;
525 529 }
526 530
527 531 .replace {
528 532 background-color: #e8e8e8;
529 533 }
530 534
531 535 .comparison {
532 536 overflow-x: auto;
533 537 }
534 538
535 539 .comparison table td {
536 540 padding: 0px 5px;
537 541 }
538 542
539 543 .header th {
540 544 font-weight: bold;
541 545 }
542 546
543 547 .block {
544 548 border-top: 1px solid #999;
545 549 }
546 550 /** end of comparison **/
547 551
548 552 .breadcrumb a:hover {
549 553 text-decoration:underline;
550 554 }
551 555
552 556 .scroll-loading {
553 557 -webkit-animation: change_color 1s linear 0s infinite alternate;
554 558 -moz-animation: change_color 1s linear 0s infinite alternate;
555 559 -o-animation: change_color 1s linear 0s infinite alternate;
556 560 animation: change_color 1s linear 0s infinite alternate;
557 561 }
558 562
559 563 @-webkit-keyframes change_color {
560 564 from { background-color: #A0CEFF; } to { }
561 565 }
562 566 @-moz-keyframes change_color {
563 567 from { background-color: #A0CEFF; } to { }
564 568 }
565 569 @-o-keyframes change_color {
566 570 from { background-color: #A0CEFF; } to { }
567 571 }
568 572 @keyframes change_color {
569 573 from { background-color: #A0CEFF; } to { }
570 574 }
571 575
572 576 .scroll-loading-error {
573 577 background-color: #FFCCCC !important;
574 578 }
575 579
576 580 #doc {
577 581 margin: 0 30px;
578 582 }
@@ -1,541 +1,550 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 93 }
94 94
95 95 form.search:hover div#hint { display: block; }
96 96
97 97 a { text-decoration:none; }
98 98 .age { white-space:nowrap; }
99 99 .date { white-space:nowrap; }
100 100 .indexlinks { white-space:nowrap; }
101 101 .parity0,
102 102 .stripes4 > :nth-child(4n+1),
103 103 .stripes2 > :nth-child(2n+1) { background-color: #f0f0f0; }
104 104 .parity1,
105 105 .stripes4 > :nth-child(4n+3),
106 106 .stripes2 > :nth-child(2n+2) { background-color: white; }
107 107 .plusline { color: green; }
108 108 .minusline { color: #dc143c; } /* crimson */
109 109 .atline { color: purple; }
110 110
111 111 .diffstat-table {
112 112 margin-top: 1em;
113 113 }
114 114 .diffstat-file {
115 115 white-space: nowrap;
116 116 font-size: 90%;
117 117 }
118 118 .diffstat-total {
119 119 white-space: nowrap;
120 120 font-size: 90%;
121 121 }
122 122 .diffstat-graph {
123 123 width: 100%;
124 124 }
125 125 .diffstat-add {
126 126 background-color: green;
127 127 float: left;
128 128 }
129 129 .diffstat-remove {
130 130 background-color: red;
131 131 float: left;
132 132 }
133 133
134 134 .navigate {
135 135 text-align: right;
136 136 font-size: 60%;
137 137 margin: 1em 0;
138 138 }
139 139
140 140 .phase {
141 141 color: #999;
142 142 font-size: 70%;
143 143 border-bottom: 1px dotted #999;
144 144 font-weight: normal;
145 145 margin-left: .5em;
146 146 vertical-align: baseline;
147 147 }
148 148
149 .obsolete {
150 color: #999;
151 font-size: 70%;
152 border-bottom: 1px dashed #999;
153 font-weight: normal;
154 margin-left: .5em;
155 vertical-align: baseline;
156 }
157
149 158 .tag {
150 159 color: #999;
151 160 font-size: 70%;
152 161 font-weight: normal;
153 162 margin-left: .5em;
154 163 vertical-align: baseline;
155 164 }
156 165
157 166 .branchhead {
158 167 color: #000;
159 168 font-size: 80%;
160 169 font-weight: normal;
161 170 margin-left: .5em;
162 171 vertical-align: baseline;
163 172 }
164 173
165 174 ul#graphnodes .branchhead {
166 175 font-size: 75%;
167 176 }
168 177
169 178 .branchname {
170 179 color: #000;
171 180 font-size: 60%;
172 181 font-weight: normal;
173 182 margin-left: .5em;
174 183 vertical-align: baseline;
175 184 }
176 185
177 186 h3 .branchname {
178 187 font-size: 80%;
179 188 }
180 189
181 190 /* Common */
182 191 pre { margin: 0; }
183 192
184 193 h2 { font-size: 120%; border-bottom: 1px solid #999; }
185 194 h2 a { color: #000; }
186 195 h3 {
187 196 margin-top: +.7em;
188 197 font-size: 100%;
189 198 }
190 199
191 200 /* log and tags tables */
192 201 .bigtable {
193 202 border-bottom: 1px solid #999;
194 203 border-collapse: collapse;
195 204 font-size: 90%;
196 205 width: 100%;
197 206 font-weight: normal;
198 207 text-align: left;
199 208 }
200 209
201 210 .bigtable td {
202 211 vertical-align: top;
203 212 }
204 213
205 214 .bigtable th {
206 215 padding: 1px 4px;
207 216 border-bottom: 1px solid #999;
208 217 }
209 218 .bigtable tr { border: none; }
210 219 .bigtable .age { width: 7em; }
211 220 .bigtable .author { width: 15em; }
212 221 .bigtable .description { }
213 222 .bigtable .description .base { font-size: 70%; float: right; line-height: 1.66; }
214 223 .bigtable .node { width: 5em; font-family: monospace;}
215 224 .bigtable .permissions { width: 8em; text-align: left;}
216 225 .bigtable .size { width: 5em; text-align: right; }
217 226 .bigtable .annotate { text-align: right; }
218 227 .bigtable td.annotate { font-size: smaller; }
219 228 .bigtable td.source { font-size: inherit; }
220 229 tr.thisrev a { color:#999999; text-decoration: none; }
221 230 tr.thisrev td.source { color:#009900; }
222 231 td.annotate {
223 232 white-space: nowrap;
224 233 }
225 234 div.annotate-info {
226 235 z-index: 5;
227 236 display: none;
228 237 position: absolute;
229 238 background-color: #FFFFFF;
230 239 border: 1px solid #999;
231 240 text-align: left;
232 241 color: #000000;
233 242 padding: 5px;
234 243 }
235 244 div.annotate-info a { color: #0000FF; }
236 245 td.annotate:hover div.annotate-info { display: inline; }
237 246
238 247 #diffopts-form {
239 248 font-size: smaller;
240 249 color: #424242;
241 250 padding-bottom: 10px;
242 251 display: none;
243 252 }
244 253
245 254 .source, .sourcefirst {
246 255 font-family: monospace;
247 256 white-space: pre;
248 257 padding: 1px 4px;
249 258 font-size: 90%;
250 259 }
251 260 .sourcefirst { border-bottom: 1px solid #999; font-weight: bold; }
252 261 .source a { color: #999; font-size: smaller; font-family: monospace;}
253 262 .bottomline { border-bottom: 1px solid #999; }
254 263
255 264 .sourcelines {
256 265 font-size: 90%;
257 266 position: relative;
258 267 counter-reset: lineno;
259 268 }
260 269
261 270 .wrap > span {
262 271 white-space: pre-wrap;
263 272 }
264 273
265 274 .linewraptoggle {
266 275 float: right;
267 276 }
268 277
269 278 .diffblocks { counter-reset: lineno; }
270 279 .diffblocks > div { counter-increment: lineno; }
271 280
272 281 .sourcelines > span {
273 282 display: inline-block;
274 283 box-sizing: border-box;
275 284 width: 100%;
276 285 padding: 1px 0px 1px 5em;
277 286 counter-increment: lineno;
278 287 }
279 288
280 289 .sourcelines > span:before {
281 290 -moz-user-select: -moz-none;
282 291 -khtml-user-select: none;
283 292 -webkit-user-select: none;
284 293 -ms-user-select: none;
285 294 user-select: none;
286 295 display: inline-block;
287 296 margin-left: -6em;
288 297 width: 4em;
289 298 font-size: smaller;
290 299 color: #999;
291 300 text-align: right;
292 301 content: counters(lineno, ".");
293 302 float: left;
294 303 }
295 304
296 305 .sourcelines > span:target, tr:target td {
297 306 background-color: #bfdfff;
298 307 }
299 308
300 309 /* Followlines */
301 310 tbody.sourcelines > tr.followlines-selected,
302 311 pre.sourcelines > span.followlines-selected {
303 312 background-color: #99C7E9;
304 313 }
305 314
306 315 div#followlines {
307 316 background-color: #FFF;
308 317 border: 1px solid #999;
309 318 padding: 5px;
310 319 position: fixed;
311 320 }
312 321
313 322 div.followlines-cancel {
314 323 text-align: right;
315 324 }
316 325
317 326 div.followlines-cancel > button {
318 327 line-height: 80%;
319 328 padding: 0;
320 329 border: 0;
321 330 border-radius: 2px;
322 331 background-color: inherit;
323 332 font-weight: bold;
324 333 }
325 334
326 335 div.followlines-cancel > button:hover {
327 336 color: #FFFFFF;
328 337 background-color: #CF1F1F;
329 338 }
330 339
331 340 div.followlines-link {
332 341 margin: 2px;
333 342 margin-top: 4px;
334 343 font-family: sans-serif;
335 344 }
336 345
337 346 .btn-followlines {
338 347 display: none;
339 348 cursor: pointer;
340 349 box-sizing: content-box;
341 350 font-size: 12px;
342 351 width: 13px;
343 352 height: 13px;
344 353 border-radius: 3px;
345 354 margin: 0px;
346 355 margin-top: -2px;
347 356 padding: 0px;
348 357 background-color: #E5FDE5;
349 358 border: 1px solid #9BC19B;
350 359 font-family: monospace;
351 360 text-align: center;
352 361 line-height: 5px;
353 362 }
354 363
355 364 tr .btn-followlines {
356 365 position: absolute;
357 366 }
358 367
359 368 span .btn-followlines {
360 369 float: left;
361 370 }
362 371
363 372 span.followlines-select .btn-followlines {
364 373 margin-left: -1.5em;
365 374 }
366 375
367 376 .btn-followlines:hover {
368 377 transform: scale(1.2, 1.2);
369 378 }
370 379
371 380 .btn-followlines .followlines-plus {
372 381 color: green;
373 382 }
374 383
375 384 .btn-followlines .followlines-minus {
376 385 color: red;
377 386 }
378 387
379 388 .btn-followlines-end {
380 389 background-color: #ffdcdc;
381 390 }
382 391
383 392 .sourcelines tr:hover .btn-followlines,
384 393 .sourcelines span.followlines-select:hover > .btn-followlines {
385 394 display: inline;
386 395 }
387 396
388 397 .btn-followlines-hidden,
389 398 .sourcelines tr:hover .btn-followlines-hidden {
390 399 display: none;
391 400 }
392 401
393 402 .sourcelines > a {
394 403 display: inline-block;
395 404 position: absolute;
396 405 left: 0px;
397 406 width: 4em;
398 407 height: 1em;
399 408 }
400 409
401 410 .fileline { font-family: monospace; }
402 411 .fileline img { border: 0; }
403 412
404 413 .tagEntry .closed { color: #99f; }
405 414
406 415 /* Changeset entry */
407 416 #changesetEntry {
408 417 border-collapse: collapse;
409 418 font-size: 90%;
410 419 width: 100%;
411 420 margin-bottom: 1em;
412 421 }
413 422
414 423 #changesetEntry th {
415 424 padding: 1px 4px;
416 425 width: 4em;
417 426 text-align: right;
418 427 font-weight: normal;
419 428 color: #999;
420 429 margin-right: .5em;
421 430 vertical-align: top;
422 431 }
423 432
424 433 div.description {
425 434 border-left: 2px solid #999;
426 435 margin: 1em 0 1em 0;
427 436 padding: .3em;
428 437 white-space: pre;
429 438 font-family: monospace;
430 439 }
431 440
432 441 /* Graph */
433 442 div#wrapper {
434 443 position: relative;
435 444 border-top: 1px solid black;
436 445 border-bottom: 1px solid black;
437 446 margin: 0;
438 447 padding: 0;
439 448 }
440 449
441 450 canvas {
442 451 position: absolute;
443 452 z-index: 5;
444 453 top: -0.7em;
445 454 margin: 0;
446 455 }
447 456
448 457 ul#graphnodes {
449 458 position: absolute;
450 459 z-index: 10;
451 460 top: -1.0em;
452 461 list-style: none inside none;
453 462 padding: 0;
454 463 }
455 464
456 465 ul#nodebgs {
457 466 list-style: none inside none;
458 467 padding: 0;
459 468 margin: 0;
460 469 top: -0.7em;
461 470 }
462 471
463 472 ul#graphnodes li, ul#nodebgs li {
464 473 height: 39px;
465 474 }
466 475
467 476 ul#graphnodes li .info {
468 477 display: block;
469 478 font-size: 70%;
470 479 position: relative;
471 480 top: -3px;
472 481 }
473 482
474 483 /* Comparison */
475 484 .legend {
476 485 padding: 1.5% 0 1.5% 0;
477 486 }
478 487
479 488 .legendinfo {
480 489 border: 1px solid #999;
481 490 font-size: 80%;
482 491 text-align: center;
483 492 padding: 0.5%;
484 493 }
485 494
486 495 .equal {
487 496 background-color: #ffffff;
488 497 }
489 498
490 499 .delete {
491 500 background-color: #faa;
492 501 color: #333;
493 502 }
494 503
495 504 .insert {
496 505 background-color: #ffa;
497 506 }
498 507
499 508 .replace {
500 509 background-color: #e8e8e8;
501 510 }
502 511
503 512 .header {
504 513 text-align: center;
505 514 }
506 515
507 516 .block {
508 517 border-top: 1px solid #999;
509 518 }
510 519
511 520 .breadcrumb {
512 521 color: gray;
513 522 }
514 523
515 524 .breadcrumb a {
516 525 color: blue;
517 526 }
518 527
519 528 .scroll-loading {
520 529 -webkit-animation: change_color 1s linear 0s infinite alternate;
521 530 -moz-animation: change_color 1s linear 0s infinite alternate;
522 531 -o-animation: change_color 1s linear 0s infinite alternate;
523 532 animation: change_color 1s linear 0s infinite alternate;
524 533 }
525 534
526 535 @-webkit-keyframes change_color {
527 536 from { background-color: #A0CEFF; } to { }
528 537 }
529 538 @-moz-keyframes change_color {
530 539 from { background-color: #A0CEFF; } to { }
531 540 }
532 541 @-o-keyframes change_color {
533 542 from { background-color: #A0CEFF; } to { }
534 543 }
535 544 @keyframes change_color {
536 545 from { background-color: #A0CEFF; } to { }
537 546 }
538 547
539 548 .scroll-loading-error {
540 549 background-color: #FFCCCC !important;
541 550 }
@@ -1,883 +1,887 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: 9151
343 content-length: 9261
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 377 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 div.diff_info { font-family:monospace; color:#000099; background-color:#edece6; font-style:italic; }
410 410 div.index_include { border:solid #d9d8d1; border-width:0px 0px 1px; padding:12px 8px; }
411 411
412 412 .search {
413 413 margin-right: 8px;
414 414 }
415 415
416 416 div#hint {
417 417 position: absolute;
418 418 display: none;
419 419 width: 250px;
420 420 padding: 5px;
421 421 background: #ffc;
422 422 border: 1px solid yellow;
423 423 border-radius: 5px;
424 424 }
425 425
426 426 #searchform:hover div#hint { display: block; }
427 427
428 428 tr.thisrev a { color:#999999; text-decoration: none; }
429 429 tr.thisrev pre { color:#009900; }
430 430 td.annotate {
431 431 white-space: nowrap;
432 432 }
433 433 div.annotate-info {
434 434 z-index: 5;
435 435 display: none;
436 436 position: absolute;
437 437 background-color: #FFFFFF;
438 438 border: 1px solid #d9d8d1;
439 439 text-align: left;
440 440 color: #000000;
441 441 padding: 5px;
442 442 }
443 443 div.annotate-info a { color: #0000FF; text-decoration: underline; }
444 444 td.annotate:hover div.annotate-info { display: inline; }
445 445
446 446 #diffopts-form {
447 447 padding-left: 8px;
448 448 display: none;
449 449 }
450 450
451 451 .linenr { color:#999999; text-decoration:none }
452 452 div.rss_logo { float: right; white-space: nowrap; }
453 453 div.rss_logo a {
454 454 padding:3px 6px; line-height:10px;
455 455 border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
456 456 color:#ffffff; background-color:#ff6600;
457 457 font-weight:bold; font-family:sans-serif; font-size:10px;
458 458 text-align:center; text-decoration:none;
459 459 }
460 460 div.rss_logo a:hover { background-color:#ee5500; }
461 461 pre { margin: 0; }
462 462 span.logtags span {
463 463 padding: 0px 4px;
464 464 font-size: 10px;
465 465 font-weight: normal;
466 466 border: 1px solid;
467 467 background-color: #ffaaff;
468 468 border-color: #ffccff #ff00ee #ff00ee #ffccff;
469 469 }
470 470 span.logtags span.phasetag {
471 471 background-color: #dfafff;
472 472 border-color: #e2b8ff #ce48ff #ce48ff #e2b8ff;
473 473 }
474 span.logtags span.obsoletetag {
475 background-color: #dddddd;
476 border-color: #e4e4e4 #a3a3a3 #a3a3a3 #e4e4e4;
477 }
474 478 span.logtags span.tagtag {
475 479 background-color: #ffffaa;
476 480 border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
477 481 }
478 482 span.logtags span.branchtag {
479 483 background-color: #aaffaa;
480 484 border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
481 485 }
482 486 span.logtags span.inbranchtag {
483 487 background-color: #d5dde6;
484 488 border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
485 489 }
486 490 span.logtags span.bookmarktag {
487 491 background-color: #afdffa;
488 492 border-color: #ccecff #46ace6 #46ace6 #ccecff;
489 493 }
490 494 span.difflineplus { color:#008800; }
491 495 span.difflineminus { color:#cc0000; }
492 496 span.difflineat { color:#990099; }
493 497 div.diffblocks { counter-reset: lineno; }
494 498 div.diffblock { counter-increment: lineno; }
495 499 pre.sourcelines { position: relative; counter-reset: lineno; }
496 500 pre.sourcelines > span {
497 501 display: inline-block;
498 502 box-sizing: border-box;
499 503 width: 100%;
500 504 padding: 0 0 0 5em;
501 505 counter-increment: lineno;
502 506 vertical-align: top;
503 507 }
504 508 pre.sourcelines > span:before {
505 509 -moz-user-select: -moz-none;
506 510 -khtml-user-select: none;
507 511 -webkit-user-select: none;
508 512 -ms-user-select: none;
509 513 user-select: none;
510 514 display: inline-block;
511 515 margin-left: -6em;
512 516 width: 4em;
513 517 color: #999;
514 518 text-align: right;
515 519 content: counters(lineno,".");
516 520 float: left;
517 521 }
518 522 pre.sourcelines > a {
519 523 display: inline-block;
520 524 position: absolute;
521 525 left: 0px;
522 526 width: 4em;
523 527 height: 1em;
524 528 }
525 529 tr:target td,
526 530 pre.sourcelines > span:target,
527 531 pre.sourcelines.stripes > span:target {
528 532 background-color: #bfdfff;
529 533 }
530 534
531 535 .description {
532 536 font-family: monospace;
533 537 white-space: pre;
534 538 }
535 539
536 540 /* Followlines */
537 541 tbody.sourcelines > tr.followlines-selected,
538 542 pre.sourcelines > span.followlines-selected {
539 543 background-color: #99C7E9 !important;
540 544 }
541 545
542 546 div#followlines {
543 547 background-color: #FFF;
544 548 border: 1px solid #d9d8d1;
545 549 padding: 5px;
546 550 position: fixed;
547 551 }
548 552
549 553 div.followlines-cancel {
550 554 text-align: right;
551 555 }
552 556
553 557 div.followlines-cancel > button {
554 558 line-height: 80%;
555 559 padding: 0;
556 560 border: 0;
557 561 border-radius: 2px;
558 562 background-color: inherit;
559 563 font-weight: bold;
560 564 }
561 565
562 566 div.followlines-cancel > button:hover {
563 567 color: #FFFFFF;
564 568 background-color: #CF1F1F;
565 569 }
566 570
567 571 div.followlines-link {
568 572 margin: 2px;
569 573 margin-top: 4px;
570 574 font-family: sans-serif;
571 575 }
572 576
573 577 .btn-followlines {
574 578 display: none;
575 579 cursor: pointer;
576 580 box-sizing: content-box;
577 581 font-size: 11px;
578 582 width: 13px;
579 583 height: 13px;
580 584 border-radius: 3px;
581 585 margin: 0px;
582 586 margin-top: -2px;
583 587 padding: 0px;
584 588 background-color: #E5FDE5;
585 589 border: 1px solid #9BC19B;
586 590 font-family: monospace;
587 591 text-align: center;
588 592 line-height: 5px;
589 593 }
590 594
591 595 tr .btn-followlines {
592 596 position: absolute;
593 597 }
594 598
595 599 span .btn-followlines {
596 600 float: left;
597 601 }
598 602
599 603 span.followlines-select .btn-followlines {
600 604 margin-left: -1.6em;
601 605 }
602 606
603 607 .btn-followlines:hover {
604 608 transform: scale(1.1, 1.1);
605 609 }
606 610
607 611 .btn-followlines .followlines-plus {
608 612 color: green;
609 613 }
610 614
611 615 .btn-followlines .followlines-minus {
612 616 color: red;
613 617 }
614 618
615 619 .btn-followlines-end {
616 620 background-color: #ffdcdc;
617 621 }
618 622
619 623 .sourcelines tr:hover .btn-followlines,
620 624 .sourcelines span.followlines-select:hover > .btn-followlines {
621 625 display: inline;
622 626 }
623 627
624 628 .btn-followlines-hidden,
625 629 .sourcelines tr:hover .btn-followlines-hidden {
626 630 display: none;
627 631 }
628 632
629 633 /* Graph */
630 634 div#wrapper {
631 635 position: relative;
632 636 margin: 0;
633 637 padding: 0;
634 638 margin-top: 3px;
635 639 }
636 640
637 641 canvas {
638 642 position: absolute;
639 643 z-index: 5;
640 644 top: -0.9em;
641 645 margin: 0;
642 646 }
643 647
644 648 ul#nodebgs {
645 649 list-style: none inside none;
646 650 padding: 0;
647 651 margin: 0;
648 652 top: -0.7em;
649 653 }
650 654
651 655 ul#graphnodes li, ul#nodebgs li {
652 656 height: 39px;
653 657 }
654 658
655 659 ul#graphnodes {
656 660 position: absolute;
657 661 z-index: 10;
658 662 top: -0.8em;
659 663 list-style: none inside none;
660 664 padding: 0;
661 665 }
662 666
663 667 ul#graphnodes li .info {
664 668 display: block;
665 669 font-size: 100%;
666 670 position: relative;
667 671 top: -3px;
668 672 font-style: italic;
669 673 }
670 674
671 675 /* Comparison */
672 676 .legend {
673 677 padding: 1.5% 0 1.5% 0;
674 678 }
675 679
676 680 .legendinfo {
677 681 border: 1px solid #d9d8d1;
678 682 font-size: 80%;
679 683 text-align: center;
680 684 padding: 0.5%;
681 685 }
682 686
683 687 .equal {
684 688 background-color: #ffffff;
685 689 }
686 690
687 691 .delete {
688 692 background-color: #faa;
689 693 color: #333;
690 694 }
691 695
692 696 .insert {
693 697 background-color: #ffa;
694 698 }
695 699
696 700 .replace {
697 701 background-color: #e8e8e8;
698 702 }
699 703
700 704 .comparison {
701 705 overflow-x: auto;
702 706 }
703 707
704 708 .header th {
705 709 text-align: center;
706 710 }
707 711
708 712 .block {
709 713 border-top: 1px solid #d9d8d1;
710 714 }
711 715
712 716 .scroll-loading {
713 717 -webkit-animation: change_color 1s linear 0s infinite alternate;
714 718 -moz-animation: change_color 1s linear 0s infinite alternate;
715 719 -o-animation: change_color 1s linear 0s infinite alternate;
716 720 animation: change_color 1s linear 0s infinite alternate;
717 721 }
718 722
719 723 @-webkit-keyframes change_color {
720 724 from { background-color: #A0CEFF; } to { }
721 725 }
722 726 @-moz-keyframes change_color {
723 727 from { background-color: #A0CEFF; } to { }
724 728 }
725 729 @-o-keyframes change_color {
726 730 from { background-color: #A0CEFF; } to { }
727 731 }
728 732 @keyframes change_color {
729 733 from { background-color: #A0CEFF; } to { }
730 734 }
731 735
732 736 .scroll-loading-error {
733 737 background-color: #FFCCCC !important;
734 738 }
735 739
736 740 #doc {
737 741 margin: 0 8px;
738 742 }
739 743 304 Not Modified
740 744
741 745
742 746 phase changes are refreshed (issue4061)
743 747
744 748 $ echo bar >> foo
745 749 $ hg ci -msecret --secret
746 750 $ get-with-headers.py localhost:$HGPORT 'log?style=raw'
747 751 200 Script output follows
748 752
749 753
750 754 # HG changelog
751 755 # Node ID 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
752 756
753 757 changeset: 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
754 758 revision: 0
755 759 user: test
756 760 date: Thu, 01 Jan 1970 00:00:00 +0000
757 761 summary: base
758 762 branch: default
759 763 tag: tip
760 764 bookmark: @
761 765 bookmark: a b c
762 766 bookmark: d/e/f
763 767
764 768
765 769 $ hg phase --draft tip
766 770 $ get-with-headers.py localhost:$HGPORT 'log?style=raw'
767 771 200 Script output follows
768 772
769 773
770 774 # HG changelog
771 775 # Node ID a084749e708a9c4c0a5b652a2a446322ce290e04
772 776
773 777 changeset: a084749e708a9c4c0a5b652a2a446322ce290e04
774 778 revision: 1
775 779 user: test
776 780 date: Thu, 01 Jan 1970 00:00:00 +0000
777 781 summary: secret
778 782 branch: default
779 783 tag: tip
780 784
781 785 changeset: 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
782 786 revision: 0
783 787 user: test
784 788 date: Thu, 01 Jan 1970 00:00:00 +0000
785 789 summary: base
786 790 bookmark: @
787 791 bookmark: a b c
788 792 bookmark: d/e/f
789 793
790 794
791 795
792 796 access bookmarks
793 797
794 798 $ get-with-headers.py localhost:$HGPORT 'rev/@?style=paper' | egrep '^200|changeset 0:'
795 799 200 Script output follows
796 800 changeset 0:<a href="/rev/2ef0ac749a14?style=paper">2ef0ac749a14</a>
797 801
798 802 $ get-with-headers.py localhost:$HGPORT 'rev/%40?style=paper' | egrep '^200|changeset 0:'
799 803 200 Script output follows
800 804 changeset 0:<a href="/rev/2ef0ac749a14?style=paper">2ef0ac749a14</a>
801 805
802 806 $ get-with-headers.py localhost:$HGPORT 'rev/a%20b%20c?style=paper' | egrep '^200|changeset 0:'
803 807 200 Script output follows
804 808 changeset 0:<a href="/rev/2ef0ac749a14?style=paper">2ef0ac749a14</a>
805 809
806 810 $ get-with-headers.py localhost:$HGPORT 'rev/d%252Fe%252Ff?style=paper' | egrep '^200|changeset 0:'
807 811 200 Script output follows
808 812 changeset 0:<a href="/rev/2ef0ac749a14?style=paper">2ef0ac749a14</a>
809 813
810 814 no style can be loaded from directories other than the specified paths
811 815
812 816 $ mkdir -p x/templates/fallback
813 817 $ cat <<EOF > x/templates/fallback/map
814 818 > default = 'shortlog'
815 819 > shortlog = 'fall back to default\n'
816 820 > mimetype = 'text/plain'
817 821 > EOF
818 822 $ cat <<EOF > x/map
819 823 > default = 'shortlog'
820 824 > shortlog = 'access to outside of templates directory\n'
821 825 > mimetype = 'text/plain'
822 826 > EOF
823 827
824 828 $ killdaemons.py
825 829 $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log \
826 830 > --config web.style=fallback --config web.templates=x/templates
827 831 $ cat hg.pid >> $DAEMON_PIDS
828 832
829 833 $ get-with-headers.py localhost:$HGPORT "?style=`pwd`/x"
830 834 200 Script output follows
831 835
832 836 fall back to default
833 837
834 838 $ get-with-headers.py localhost:$HGPORT '?style=..'
835 839 200 Script output follows
836 840
837 841 fall back to default
838 842
839 843 $ get-with-headers.py localhost:$HGPORT '?style=./..'
840 844 200 Script output follows
841 845
842 846 fall back to default
843 847
844 848 $ get-with-headers.py localhost:$HGPORT '?style=.../.../'
845 849 200 Script output follows
846 850
847 851 fall back to default
848 852
849 853 errors
850 854
851 855 $ cat errors.log
852 856
853 857 Uncaught exceptions result in a logged error and canned HTTP response
854 858
855 859 $ killdaemons.py
856 860 $ hg serve --config extensions.hgweberror=$TESTDIR/hgweberror.py -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
857 861 $ cat hg.pid >> $DAEMON_PIDS
858 862
859 863 $ get-with-headers.py localhost:$HGPORT 'raiseerror' transfer-encoding content-type
860 864 500 Internal Server Error
861 865 transfer-encoding: chunked
862 866
863 867 Internal Server Error (no-eol)
864 868 [1]
865 869
866 870 $ killdaemons.py
867 871 $ head -1 errors.log
868 872 .* Exception happened during processing request '/raiseerror': (re)
869 873
870 874 Uncaught exception after partial content sent
871 875
872 876 $ hg serve --config extensions.hgweberror=$TESTDIR/hgweberror.py -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
873 877 $ cat hg.pid >> $DAEMON_PIDS
874 878 $ get-with-headers.py localhost:$HGPORT 'raiseerror?partialresponse=1' transfer-encoding content-type
875 879 200 Script output follows
876 880 transfer-encoding: chunked
877 881 content-type: text/plain
878 882
879 883 partial content
880 884 Internal Server Error (no-eol)
881 885
882 886 $ killdaemons.py
883 887 $ cd ..
@@ -1,1512 +1,1536 b''
1 1 $ cat >> $HGRCPATH << EOF
2 2 > [phases]
3 3 > # public changeset are not obsolete
4 4 > publish=false
5 5 > [ui]
6 6 > logtemplate="{rev}:{node|short} ({phase}{if(obsolete, ' *{obsolete}*')}{if(instabilities, ' {instabilities}')}) [{tags} {bookmarks}] {desc|firstline}{if(obsfate, " [{join(obsfate, "; ")}]")}\n"
7 7 > EOF
8 8 $ mkcommit() {
9 9 > echo "$1" > "$1"
10 10 > hg add "$1"
11 11 > hg ci -m "add $1"
12 12 > }
13 13 $ getid() {
14 14 > hg log -T "{node}\n" --hidden -r "desc('$1')"
15 15 > }
16 16
17 17 $ cat > debugkeys.py <<EOF
18 18 > def reposetup(ui, repo):
19 19 > class debugkeysrepo(repo.__class__):
20 20 > def listkeys(self, namespace):
21 21 > ui.write('listkeys %s\n' % (namespace,))
22 22 > return super(debugkeysrepo, self).listkeys(namespace)
23 23 >
24 24 > if repo.local():
25 25 > repo.__class__ = debugkeysrepo
26 26 > EOF
27 27
28 28 $ hg init tmpa
29 29 $ cd tmpa
30 30 $ mkcommit kill_me
31 31
32 32 Checking that the feature is properly disabled
33 33
34 34 $ hg debugobsolete -d '0 0' `getid kill_me` -u babar
35 35 abort: creating obsolete markers is not enabled on this repo
36 36 [255]
37 37
38 38 Enabling it
39 39
40 40 $ cat >> $HGRCPATH << EOF
41 41 > [experimental]
42 42 > evolution=exchange
43 43 > evolution.createmarkers=True
44 44 > EOF
45 45
46 46 Killing a single changeset without replacement
47 47
48 48 $ hg debugobsolete 0
49 49 abort: changeset references must be full hexadecimal node identifiers
50 50 [255]
51 51 $ hg debugobsolete '00'
52 52 abort: changeset references must be full hexadecimal node identifiers
53 53 [255]
54 54 $ hg debugobsolete -d '0 0' `getid kill_me` -u babar
55 55 obsoleted 1 changesets
56 56 $ hg debugobsolete
57 57 97b7c2d76b1845ed3eb988cd612611e72406cef0 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'babar'}
58 58
59 59 (test that mercurial is not confused)
60 60
61 61 $ hg up null --quiet # having 0 as parent prevents it to be hidden
62 62 $ hg tip
63 63 -1:000000000000 (public) [tip ]
64 64 $ hg up --hidden tip --quiet
65 65
66 66 Killing a single changeset with itself should fail
67 67 (simple local safeguard)
68 68
69 69 $ hg debugobsolete `getid kill_me` `getid kill_me`
70 70 abort: bad obsmarker input: in-marker cycle with 97b7c2d76b1845ed3eb988cd612611e72406cef0
71 71 [255]
72 72
73 73 $ cd ..
74 74
75 75 Killing a single changeset with replacement
76 76 (and testing the format option)
77 77
78 78 $ hg init tmpb
79 79 $ cd tmpb
80 80 $ mkcommit a
81 81 $ mkcommit b
82 82 $ mkcommit original_c
83 83 $ hg up "desc('b')"
84 84 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
85 85 $ mkcommit new_c
86 86 created new head
87 87 $ hg log -r 'hidden()' --template '{rev}:{node|short} {desc}\n' --hidden
88 88 $ hg debugobsolete --config format.obsstore-version=0 --flag 12 `getid original_c` `getid new_c` -d '121 120'
89 89 obsoleted 1 changesets
90 90 $ hg log -r 'hidden()' --template '{rev}:{node|short} {desc}\n' --hidden
91 91 2:245bde4270cd add original_c
92 92 $ hg debugrevlog -cd
93 93 # rev p1rev p2rev start end deltastart base p1 p2 rawsize totalsize compression heads chainlen
94 94 0 -1 -1 0 59 0 0 0 0 58 58 0 1 0
95 95 1 0 -1 59 118 59 59 0 0 58 116 0 1 0
96 96 2 1 -1 118 193 118 118 59 0 76 192 0 1 0
97 97 3 1 -1 193 260 193 193 59 0 66 258 0 2 0
98 98 $ hg debugobsolete
99 99 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
100 100
101 101 (check for version number of the obsstore)
102 102
103 103 $ dd bs=1 count=1 if=.hg/store/obsstore 2>/dev/null
104 104 \x00 (no-eol) (esc)
105 105
106 106 do it again (it read the obsstore before adding new changeset)
107 107
108 108 $ hg up '.^'
109 109 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
110 110 $ mkcommit new_2_c
111 111 created new head
112 112 $ hg debugobsolete -d '1337 0' `getid new_c` `getid new_2_c`
113 113 obsoleted 1 changesets
114 114 $ hg debugobsolete
115 115 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
116 116 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
117 117
118 118 Register two markers with a missing node
119 119
120 120 $ hg up '.^'
121 121 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
122 122 $ mkcommit new_3_c
123 123 created new head
124 124 $ hg debugobsolete -d '1338 0' `getid new_2_c` 1337133713371337133713371337133713371337
125 125 obsoleted 1 changesets
126 126 $ hg debugobsolete -d '1339 0' 1337133713371337133713371337133713371337 `getid new_3_c`
127 127 $ hg debugobsolete
128 128 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
129 129 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
130 130 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
131 131 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
132 132
133 133 Test the --index option of debugobsolete command
134 134 $ hg debugobsolete --index
135 135 0 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
136 136 1 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
137 137 2 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
138 138 3 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
139 139
140 140 Refuse pathological nullid successors
141 141 $ hg debugobsolete -d '9001 0' 1337133713371337133713371337133713371337 0000000000000000000000000000000000000000
142 142 transaction abort!
143 143 rollback completed
144 144 abort: bad obsolescence marker detected: invalid successors nullid
145 145 [255]
146 146
147 147 Check that graphlog detect that a changeset is obsolete:
148 148
149 149 $ hg log -G
150 150 @ 5:5601fb93a350 (draft) [tip ] add new_3_c
151 151 |
152 152 o 1:7c3bad9141dc (draft) [ ] add b
153 153 |
154 154 o 0:1f0dee641bb7 (draft) [ ] add a
155 155
156 156
157 157 check that heads does not report them
158 158
159 159 $ hg heads
160 160 5:5601fb93a350 (draft) [tip ] add new_3_c
161 161 $ hg heads --hidden
162 162 5:5601fb93a350 (draft) [tip ] add new_3_c
163 163 4:ca819180edb9 (draft *obsolete*) [ ] add new_2_c [rewritten as 5:5601fb93a350]
164 164 3:cdbce2fbb163 (draft *obsolete*) [ ] add new_c [rewritten as 4:ca819180edb9]
165 165 2:245bde4270cd (draft *obsolete*) [ ] add original_c [rewritten as 3:cdbce2fbb163]
166 166
167 167
168 168 check that summary does not report them
169 169
170 170 $ hg init ../sink
171 171 $ echo '[paths]' >> .hg/hgrc
172 172 $ echo 'default=../sink' >> .hg/hgrc
173 173 $ hg summary --remote
174 174 parent: 5:5601fb93a350 tip
175 175 add new_3_c
176 176 branch: default
177 177 commit: (clean)
178 178 update: (current)
179 179 phases: 3 draft
180 180 remote: 3 outgoing
181 181
182 182 $ hg summary --remote --hidden
183 183 parent: 5:5601fb93a350 tip
184 184 add new_3_c
185 185 branch: default
186 186 commit: (clean)
187 187 update: 3 new changesets, 4 branch heads (merge)
188 188 phases: 6 draft
189 189 remote: 3 outgoing
190 190
191 191 check that various commands work well with filtering
192 192
193 193 $ hg tip
194 194 5:5601fb93a350 (draft) [tip ] add new_3_c
195 195 $ hg log -r 6
196 196 abort: unknown revision '6'!
197 197 [255]
198 198 $ hg log -r 4
199 199 abort: hidden revision '4'!
200 200 (use --hidden to access hidden revisions)
201 201 [255]
202 202 $ hg debugrevspec 'rev(6)'
203 203 $ hg debugrevspec 'rev(4)'
204 204 $ hg debugrevspec 'null'
205 205 -1
206 206
207 207 Check that public changeset are not accounted as obsolete:
208 208
209 209 $ hg --hidden phase --public 2
210 210 $ hg log -G
211 211 @ 5:5601fb93a350 (draft phase-divergent) [tip ] add new_3_c
212 212 |
213 213 | o 2:245bde4270cd (public) [ ] add original_c
214 214 |/
215 215 o 1:7c3bad9141dc (public) [ ] add b
216 216 |
217 217 o 0:1f0dee641bb7 (public) [ ] add a
218 218
219 219
220 220 And that bumped changeset are detected
221 221 --------------------------------------
222 222
223 223 If we didn't filtered obsolete changesets out, 3 and 4 would show up too. Also
224 224 note that the bumped changeset (5:5601fb93a350) is not a direct successor of
225 225 the public changeset
226 226
227 227 $ hg log --hidden -r 'phasedivergent()'
228 228 5:5601fb93a350 (draft phase-divergent) [tip ] add new_3_c
229 229
230 230 And that we can't push bumped changeset
231 231
232 232 $ hg push ../tmpa -r 0 --force #(make repo related)
233 233 pushing to ../tmpa
234 234 searching for changes
235 235 warning: repository is unrelated
236 236 adding changesets
237 237 adding manifests
238 238 adding file changes
239 239 added 1 changesets with 1 changes to 1 files (+1 heads)
240 240 $ hg push ../tmpa
241 241 pushing to ../tmpa
242 242 searching for changes
243 243 abort: push includes phase-divergent changeset: 5601fb93a350!
244 244 [255]
245 245
246 246 Fixing "bumped" situation
247 247 We need to create a clone of 5 and add a special marker with a flag
248 248
249 249 $ hg summary
250 250 parent: 5:5601fb93a350 tip (phase-divergent)
251 251 add new_3_c
252 252 branch: default
253 253 commit: (clean)
254 254 update: 1 new changesets, 2 branch heads (merge)
255 255 phases: 1 draft
256 256 phase-divergent: 1 changesets
257 257 $ hg up '5^'
258 258 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
259 259 $ hg revert -ar 5
260 260 adding new_3_c
261 261 $ hg ci -m 'add n3w_3_c'
262 262 created new head
263 263 $ hg debugobsolete -d '1338 0' --flags 1 `getid new_3_c` `getid n3w_3_c`
264 264 obsoleted 1 changesets
265 265 $ hg log -r 'phasedivergent()'
266 266 $ hg log -G
267 267 @ 6:6f9641995072 (draft) [tip ] add n3w_3_c
268 268 |
269 269 | o 2:245bde4270cd (public) [ ] add original_c
270 270 |/
271 271 o 1:7c3bad9141dc (public) [ ] add b
272 272 |
273 273 o 0:1f0dee641bb7 (public) [ ] add a
274 274
275 275
276 276 Basic exclusive testing
277 277
278 278 $ hg log -G --hidden
279 279 @ 6:6f9641995072 (draft) [tip ] add n3w_3_c
280 280 |
281 281 | x 5:5601fb93a350 (draft *obsolete*) [ ] add new_3_c [rewritten as 6:6f9641995072]
282 282 |/
283 283 | x 4:ca819180edb9 (draft *obsolete*) [ ] add new_2_c [rewritten as 5:5601fb93a350]
284 284 |/
285 285 | x 3:cdbce2fbb163 (draft *obsolete*) [ ] add new_c [rewritten as 4:ca819180edb9]
286 286 |/
287 287 | o 2:245bde4270cd (public) [ ] add original_c
288 288 |/
289 289 o 1:7c3bad9141dc (public) [ ] add b
290 290 |
291 291 o 0:1f0dee641bb7 (public) [ ] add a
292 292
293 293 $ hg debugobsolete --rev 6f9641995072
294 294 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
295 295 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
296 296 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
297 297 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
298 298 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
299 299 $ hg debugobsolete --rev 6f9641995072 --exclusive
300 300 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
301 301 $ hg debugobsolete --rev 5601fb93a350 --hidden
302 302 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
303 303 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
304 304 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
305 305 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
306 306 $ hg debugobsolete --rev 5601fb93a350 --hidden --exclusive
307 307 $ hg debugobsolete --rev 5601fb93a350+6f9641995072 --hidden --exclusive
308 308 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
309 309 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
310 310 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
311 311
312 312 $ cd ..
313 313
314 314 Revision 0 is hidden
315 315 --------------------
316 316
317 317 $ hg init rev0hidden
318 318 $ cd rev0hidden
319 319
320 320 $ mkcommit kill0
321 321 $ hg up -q null
322 322 $ hg debugobsolete `getid kill0`
323 323 obsoleted 1 changesets
324 324 $ mkcommit a
325 325 $ mkcommit b
326 326
327 327 Should pick the first visible revision as "repo" node
328 328
329 329 $ hg archive ../archive-null
330 330 $ cat ../archive-null/.hg_archival.txt
331 331 repo: 1f0dee641bb7258c56bd60e93edfa2405381c41e
332 332 node: 7c3bad9141dcb46ff89abf5f61856facd56e476c
333 333 branch: default
334 334 latesttag: null
335 335 latesttagdistance: 2
336 336 changessincelatesttag: 2
337 337
338 338
339 339 $ cd ..
340 340
341 341 Exchange Test
342 342 ============================
343 343
344 344 Destination repo does not have any data
345 345 ---------------------------------------
346 346
347 347 Simple incoming test
348 348
349 349 $ hg init tmpc
350 350 $ cd tmpc
351 351 $ hg incoming ../tmpb
352 352 comparing with ../tmpb
353 353 0:1f0dee641bb7 (public) [ ] add a
354 354 1:7c3bad9141dc (public) [ ] add b
355 355 2:245bde4270cd (public) [ ] add original_c
356 356 6:6f9641995072 (draft) [tip ] add n3w_3_c
357 357
358 358 Try to pull markers
359 359 (extinct changeset are excluded but marker are pushed)
360 360
361 361 $ hg pull ../tmpb
362 362 pulling from ../tmpb
363 363 requesting all changes
364 364 adding changesets
365 365 adding manifests
366 366 adding file changes
367 367 added 4 changesets with 4 changes to 4 files (+1 heads)
368 368 5 new obsolescence markers
369 369 new changesets 1f0dee641bb7:6f9641995072
370 370 (run 'hg heads' to see heads, 'hg merge' to merge)
371 371 $ hg debugobsolete
372 372 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
373 373 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
374 374 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
375 375 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
376 376 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
377 377
378 378 Rollback//Transaction support
379 379
380 380 $ hg debugobsolete -d '1340 0' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
381 381 $ hg debugobsolete
382 382 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
383 383 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
384 384 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
385 385 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
386 386 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
387 387 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 (Thu Jan 01 00:22:20 1970 +0000) {'user': 'test'}
388 388 $ hg rollback -n
389 389 repository tip rolled back to revision 3 (undo debugobsolete)
390 390 $ hg rollback
391 391 repository tip rolled back to revision 3 (undo debugobsolete)
392 392 $ hg debugobsolete
393 393 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
394 394 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
395 395 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
396 396 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
397 397 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
398 398
399 399 $ cd ..
400 400
401 401 Try to push markers
402 402
403 403 $ hg init tmpd
404 404 $ hg -R tmpb push tmpd
405 405 pushing to tmpd
406 406 searching for changes
407 407 adding changesets
408 408 adding manifests
409 409 adding file changes
410 410 added 4 changesets with 4 changes to 4 files (+1 heads)
411 411 5 new obsolescence markers
412 412 $ hg -R tmpd debugobsolete | sort
413 413 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
414 414 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
415 415 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
416 416 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
417 417 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
418 418
419 419 Check obsolete keys are exchanged only if source has an obsolete store
420 420
421 421 $ hg init empty
422 422 $ hg --config extensions.debugkeys=debugkeys.py -R empty push tmpd
423 423 pushing to tmpd
424 424 listkeys phases
425 425 listkeys bookmarks
426 426 no changes found
427 427 listkeys phases
428 428 [1]
429 429
430 430 clone support
431 431 (markers are copied and extinct changesets are included to allow hardlinks)
432 432
433 433 $ hg clone tmpb clone-dest
434 434 updating to branch default
435 435 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
436 436 $ hg -R clone-dest log -G --hidden
437 437 @ 6:6f9641995072 (draft) [tip ] add n3w_3_c
438 438 |
439 439 | x 5:5601fb93a350 (draft *obsolete*) [ ] add new_3_c [rewritten as 6:6f9641995072]
440 440 |/
441 441 | x 4:ca819180edb9 (draft *obsolete*) [ ] add new_2_c [rewritten as 5:5601fb93a350]
442 442 |/
443 443 | x 3:cdbce2fbb163 (draft *obsolete*) [ ] add new_c [rewritten as 4:ca819180edb9]
444 444 |/
445 445 | o 2:245bde4270cd (public) [ ] add original_c
446 446 |/
447 447 o 1:7c3bad9141dc (public) [ ] add b
448 448 |
449 449 o 0:1f0dee641bb7 (public) [ ] add a
450 450
451 451 $ hg -R clone-dest debugobsolete
452 452 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
453 453 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
454 454 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
455 455 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
456 456 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
457 457
458 458
459 459 Destination repo have existing data
460 460 ---------------------------------------
461 461
462 462 On pull
463 463
464 464 $ hg init tmpe
465 465 $ cd tmpe
466 466 $ hg debugobsolete -d '1339 0' 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00
467 467 $ hg pull ../tmpb
468 468 pulling from ../tmpb
469 469 requesting all changes
470 470 adding changesets
471 471 adding manifests
472 472 adding file changes
473 473 added 4 changesets with 4 changes to 4 files (+1 heads)
474 474 5 new obsolescence markers
475 475 new changesets 1f0dee641bb7:6f9641995072
476 476 (run 'hg heads' to see heads, 'hg merge' to merge)
477 477 $ hg debugobsolete
478 478 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
479 479 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
480 480 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
481 481 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
482 482 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
483 483 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
484 484
485 485
486 486 On push
487 487
488 488 $ hg push ../tmpc
489 489 pushing to ../tmpc
490 490 searching for changes
491 491 no changes found
492 492 1 new obsolescence markers
493 493 [1]
494 494 $ hg -R ../tmpc debugobsolete
495 495 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
496 496 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
497 497 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
498 498 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
499 499 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
500 500 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
501 501
502 502 detect outgoing obsolete and unstable
503 503 ---------------------------------------
504 504
505 505
506 506 $ hg log -G
507 507 o 3:6f9641995072 (draft) [tip ] add n3w_3_c
508 508 |
509 509 | o 2:245bde4270cd (public) [ ] add original_c
510 510 |/
511 511 o 1:7c3bad9141dc (public) [ ] add b
512 512 |
513 513 o 0:1f0dee641bb7 (public) [ ] add a
514 514
515 515 $ hg up 'desc("n3w_3_c")'
516 516 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
517 517 $ mkcommit original_d
518 518 $ mkcommit original_e
519 519 $ hg debugobsolete --record-parents `getid original_d` -d '0 0'
520 520 obsoleted 1 changesets
521 521 $ hg debugobsolete | grep `getid original_d`
522 522 94b33453f93bdb8d457ef9b770851a618bf413e1 0 {6f96419950729f3671185b847352890f074f7557} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
523 523 $ hg log -r 'obsolete()'
524 524 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
525 525 $ hg summary
526 526 parent: 5:cda648ca50f5 tip (orphan)
527 527 add original_e
528 528 branch: default
529 529 commit: (clean)
530 530 update: 1 new changesets, 2 branch heads (merge)
531 531 phases: 3 draft
532 532 orphan: 1 changesets
533 533 $ hg log -G -r '::orphan()'
534 534 @ 5:cda648ca50f5 (draft orphan) [tip ] add original_e
535 535 |
536 536 x 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
537 537 |
538 538 o 3:6f9641995072 (draft) [ ] add n3w_3_c
539 539 |
540 540 o 1:7c3bad9141dc (public) [ ] add b
541 541 |
542 542 o 0:1f0dee641bb7 (public) [ ] add a
543 543
544 544
545 545 refuse to push obsolete changeset
546 546
547 547 $ hg push ../tmpc/ -r 'desc("original_d")'
548 548 pushing to ../tmpc/
549 549 searching for changes
550 550 abort: push includes obsolete changeset: 94b33453f93b!
551 551 [255]
552 552
553 553 refuse to push unstable changeset
554 554
555 555 $ hg push ../tmpc/
556 556 pushing to ../tmpc/
557 557 searching for changes
558 558 abort: push includes orphan changeset: cda648ca50f5!
559 559 [255]
560 560
561 561 Test that extinct changeset are properly detected
562 562
563 563 $ hg log -r 'extinct()'
564 564
565 565 Don't try to push extinct changeset
566 566
567 567 $ hg init ../tmpf
568 568 $ hg out ../tmpf
569 569 comparing with ../tmpf
570 570 searching for changes
571 571 0:1f0dee641bb7 (public) [ ] add a
572 572 1:7c3bad9141dc (public) [ ] add b
573 573 2:245bde4270cd (public) [ ] add original_c
574 574 3:6f9641995072 (draft) [ ] add n3w_3_c
575 575 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
576 576 5:cda648ca50f5 (draft orphan) [tip ] add original_e
577 577 $ hg push ../tmpf -f # -f because be push unstable too
578 578 pushing to ../tmpf
579 579 searching for changes
580 580 adding changesets
581 581 adding manifests
582 582 adding file changes
583 583 added 6 changesets with 6 changes to 6 files (+1 heads)
584 584 7 new obsolescence markers
585 585
586 586 no warning displayed
587 587
588 588 $ hg push ../tmpf
589 589 pushing to ../tmpf
590 590 searching for changes
591 591 no changes found
592 592 [1]
593 593
594 594 Do not warn about new head when the new head is a successors of a remote one
595 595
596 596 $ hg log -G
597 597 @ 5:cda648ca50f5 (draft orphan) [tip ] add original_e
598 598 |
599 599 x 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
600 600 |
601 601 o 3:6f9641995072 (draft) [ ] add n3w_3_c
602 602 |
603 603 | o 2:245bde4270cd (public) [ ] add original_c
604 604 |/
605 605 o 1:7c3bad9141dc (public) [ ] add b
606 606 |
607 607 o 0:1f0dee641bb7 (public) [ ] add a
608 608
609 609 $ hg up -q 'desc(n3w_3_c)'
610 610 $ mkcommit obsolete_e
611 611 created new head
612 612 $ hg debugobsolete `getid 'original_e'` `getid 'obsolete_e'` \
613 613 > -u 'test <test@example.net>'
614 614 obsoleted 1 changesets
615 615 $ hg outgoing ../tmpf # parasite hg outgoing testin
616 616 comparing with ../tmpf
617 617 searching for changes
618 618 6:3de5eca88c00 (draft) [tip ] add obsolete_e
619 619 $ hg push ../tmpf
620 620 pushing to ../tmpf
621 621 searching for changes
622 622 adding changesets
623 623 adding manifests
624 624 adding file changes
625 625 added 1 changesets with 1 changes to 1 files (+1 heads)
626 626 1 new obsolescence markers
627 627 obsoleted 1 changesets
628 628
629 629 test relevance computation
630 630 ---------------------------------------
631 631
632 632 Checking simple case of "marker relevance".
633 633
634 634
635 635 Reminder of the repo situation
636 636
637 637 $ hg log --hidden --graph
638 638 @ 6:3de5eca88c00 (draft) [tip ] add obsolete_e
639 639 |
640 640 | x 5:cda648ca50f5 (draft *obsolete*) [ ] add original_e [rewritten as 6:3de5eca88c00 by test <test@example.net>]
641 641 | |
642 642 | x 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
643 643 |/
644 644 o 3:6f9641995072 (draft) [ ] add n3w_3_c
645 645 |
646 646 | o 2:245bde4270cd (public) [ ] add original_c
647 647 |/
648 648 o 1:7c3bad9141dc (public) [ ] add b
649 649 |
650 650 o 0:1f0dee641bb7 (public) [ ] add a
651 651
652 652
653 653 List of all markers
654 654
655 655 $ hg debugobsolete
656 656 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
657 657 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
658 658 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
659 659 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
660 660 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
661 661 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
662 662 94b33453f93bdb8d457ef9b770851a618bf413e1 0 {6f96419950729f3671185b847352890f074f7557} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
663 663 cda648ca50f50482b7055c0b0c4c117bba6733d9 3de5eca88c00aa039da7399a220f4a5221faa585 0 (*) {'user': 'test <test@example.net>'} (glob)
664 664
665 665 List of changesets with no chain
666 666
667 667 $ hg debugobsolete --hidden --rev ::2
668 668
669 669 List of changesets that are included on marker chain
670 670
671 671 $ hg debugobsolete --hidden --rev 6
672 672 cda648ca50f50482b7055c0b0c4c117bba6733d9 3de5eca88c00aa039da7399a220f4a5221faa585 0 (*) {'user': 'test <test@example.net>'} (glob)
673 673
674 674 List of changesets with a longer chain, (including a pruned children)
675 675
676 676 $ hg debugobsolete --hidden --rev 3
677 677 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
678 678 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
679 679 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
680 680 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
681 681 94b33453f93bdb8d457ef9b770851a618bf413e1 0 {6f96419950729f3671185b847352890f074f7557} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
682 682 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
683 683 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
684 684
685 685 List of both
686 686
687 687 $ hg debugobsolete --hidden --rev 3::6
688 688 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
689 689 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
690 690 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
691 691 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
692 692 94b33453f93bdb8d457ef9b770851a618bf413e1 0 {6f96419950729f3671185b847352890f074f7557} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
693 693 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
694 694 cda648ca50f50482b7055c0b0c4c117bba6733d9 3de5eca88c00aa039da7399a220f4a5221faa585 0 (*) {'user': 'test <test@example.net>'} (glob)
695 695 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
696 696
697 697 List of all markers in JSON
698 698
699 699 $ hg debugobsolete -Tjson
700 700 [
701 701 {
702 702 "date": [1339.0, 0],
703 703 "flag": 0,
704 704 "metadata": {"user": "test"},
705 705 "prednode": "1339133913391339133913391339133913391339",
706 706 "succnodes": ["ca819180edb99ed25ceafb3e9584ac287e240b00"]
707 707 },
708 708 {
709 709 "date": [1339.0, 0],
710 710 "flag": 0,
711 711 "metadata": {"user": "test"},
712 712 "prednode": "1337133713371337133713371337133713371337",
713 713 "succnodes": ["5601fb93a350734d935195fee37f4054c529ff39"]
714 714 },
715 715 {
716 716 "date": [121.0, 120],
717 717 "flag": 12,
718 718 "metadata": {"user": "test"},
719 719 "prednode": "245bde4270cd1072a27757984f9cda8ba26f08ca",
720 720 "succnodes": ["cdbce2fbb16313928851e97e0d85413f3f7eb77f"]
721 721 },
722 722 {
723 723 "date": [1338.0, 0],
724 724 "flag": 1,
725 725 "metadata": {"user": "test"},
726 726 "prednode": "5601fb93a350734d935195fee37f4054c529ff39",
727 727 "succnodes": ["6f96419950729f3671185b847352890f074f7557"]
728 728 },
729 729 {
730 730 "date": [1338.0, 0],
731 731 "flag": 0,
732 732 "metadata": {"user": "test"},
733 733 "prednode": "ca819180edb99ed25ceafb3e9584ac287e240b00",
734 734 "succnodes": ["1337133713371337133713371337133713371337"]
735 735 },
736 736 {
737 737 "date": [1337.0, 0],
738 738 "flag": 0,
739 739 "metadata": {"user": "test"},
740 740 "prednode": "cdbce2fbb16313928851e97e0d85413f3f7eb77f",
741 741 "succnodes": ["ca819180edb99ed25ceafb3e9584ac287e240b00"]
742 742 },
743 743 {
744 744 "date": [0.0, 0],
745 745 "flag": 0,
746 746 "metadata": {"user": "test"},
747 747 "parentnodes": ["6f96419950729f3671185b847352890f074f7557"],
748 748 "prednode": "94b33453f93bdb8d457ef9b770851a618bf413e1",
749 749 "succnodes": []
750 750 },
751 751 {
752 752 "date": *, (glob)
753 753 "flag": 0,
754 754 "metadata": {"user": "test <test@example.net>"},
755 755 "prednode": "cda648ca50f50482b7055c0b0c4c117bba6733d9",
756 756 "succnodes": ["3de5eca88c00aa039da7399a220f4a5221faa585"]
757 757 }
758 758 ]
759 759
760 760 Template keywords
761 761
762 762 $ hg debugobsolete -r6 -T '{succnodes % "{node|short}"} {date|shortdate}\n'
763 763 3de5eca88c00 ????-??-?? (glob)
764 764 $ hg debugobsolete -r6 -T '{join(metadata % "{key}={value}", " ")}\n'
765 765 user=test <test@example.net>
766 766 $ hg debugobsolete -r6 -T '{metadata}\n{metadata}\n'
767 767 'user': 'test <test@example.net>'
768 768 'user': 'test <test@example.net>'
769 769 $ hg debugobsolete -r6 -T '{succnodes}\n{succnodes}\n'
770 770 3de5eca88c00aa039da7399a220f4a5221faa585
771 771 3de5eca88c00aa039da7399a220f4a5221faa585
772 772 $ hg debugobsolete -r6 -T '{flag} {get(metadata, "user")}\n'
773 773 0 test <test@example.net>
774 774
775 775 Test the debug output for exchange
776 776 ----------------------------------
777 777
778 778 $ hg pull ../tmpb --config 'experimental.obsmarkers-exchange-debug=True' # bundle2
779 779 pulling from ../tmpb
780 780 searching for changes
781 781 no changes found
782 782 obsmarker-exchange: 346 bytes received
783 783
784 784 check hgweb does not explode
785 785 ====================================
786 786
787 787 $ hg unbundle $TESTDIR/bundles/hgweb+obs.hg
788 788 adding changesets
789 789 adding manifests
790 790 adding file changes
791 791 added 62 changesets with 63 changes to 9 files (+60 heads)
792 792 new changesets 50c51b361e60:c15e9edfca13
793 793 (run 'hg heads .' to see heads, 'hg merge' to merge)
794 794 $ for node in `hg log -r 'desc(babar_)' --template '{node}\n'`;
795 795 > do
796 796 > hg debugobsolete $node
797 797 > done
798 798 obsoleted 1 changesets
799 799 obsoleted 1 changesets
800 800 obsoleted 1 changesets
801 801 obsoleted 1 changesets
802 802 obsoleted 1 changesets
803 803 obsoleted 1 changesets
804 804 obsoleted 1 changesets
805 805 obsoleted 1 changesets
806 806 obsoleted 1 changesets
807 807 obsoleted 1 changesets
808 808 obsoleted 1 changesets
809 809 obsoleted 1 changesets
810 810 obsoleted 1 changesets
811 811 obsoleted 1 changesets
812 812 obsoleted 1 changesets
813 813 obsoleted 1 changesets
814 814 obsoleted 1 changesets
815 815 obsoleted 1 changesets
816 816 obsoleted 1 changesets
817 817 obsoleted 1 changesets
818 818 obsoleted 1 changesets
819 819 obsoleted 1 changesets
820 820 obsoleted 1 changesets
821 821 obsoleted 1 changesets
822 822 obsoleted 1 changesets
823 823 obsoleted 1 changesets
824 824 obsoleted 1 changesets
825 825 obsoleted 1 changesets
826 826 obsoleted 1 changesets
827 827 obsoleted 1 changesets
828 828 obsoleted 1 changesets
829 829 obsoleted 1 changesets
830 830 obsoleted 1 changesets
831 831 obsoleted 1 changesets
832 832 obsoleted 1 changesets
833 833 obsoleted 1 changesets
834 834 obsoleted 1 changesets
835 835 obsoleted 1 changesets
836 836 obsoleted 1 changesets
837 837 obsoleted 1 changesets
838 838 obsoleted 1 changesets
839 839 obsoleted 1 changesets
840 840 obsoleted 1 changesets
841 841 obsoleted 1 changesets
842 842 obsoleted 1 changesets
843 843 obsoleted 1 changesets
844 844 obsoleted 1 changesets
845 845 obsoleted 1 changesets
846 846 obsoleted 1 changesets
847 847 obsoleted 1 changesets
848 848 obsoleted 1 changesets
849 849 obsoleted 1 changesets
850 850 obsoleted 1 changesets
851 851 obsoleted 1 changesets
852 852 obsoleted 1 changesets
853 853 obsoleted 1 changesets
854 854 obsoleted 1 changesets
855 855 obsoleted 1 changesets
856 856 obsoleted 1 changesets
857 857 obsoleted 1 changesets
858 858 $ hg up tip
859 859 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
860 860
861 861 #if serve
862 862
863 863 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
864 864 $ cat hg.pid >> $DAEMON_PIDS
865 865
866 866 check changelog view
867 867
868 868 $ get-with-headers.py --headeronly localhost:$HGPORT 'shortlog/'
869 869 200 Script output follows
870 870
871 871 check graph view
872 872
873 873 $ get-with-headers.py --headeronly localhost:$HGPORT 'graph'
874 874 200 Script output follows
875 875
876 876 check filelog view
877 877
878 878 $ get-with-headers.py --headeronly localhost:$HGPORT 'log/'`hg log -r . -T "{node}"`/'babar'
879 879 200 Script output follows
880 880
881 881 $ get-with-headers.py --headeronly localhost:$HGPORT 'rev/68'
882 882 200 Script output follows
883 883 $ get-with-headers.py --headeronly localhost:$HGPORT 'rev/67'
884 884 404 Not Found
885 885 [1]
886 886
887 887 check that web.view config option:
888 888
889 889 $ killdaemons.py hg.pid
890 890 $ cat >> .hg/hgrc << EOF
891 891 > [web]
892 892 > view=all
893 893 > EOF
894 894 $ wait
895 895 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
896 896 $ get-with-headers.py --headeronly localhost:$HGPORT 'rev/67'
897 897 200 Script output follows
898 898 $ killdaemons.py hg.pid
899 899
900 900 Checking _enable=False warning if obsolete marker exists
901 901
902 902 $ echo '[experimental]' >> $HGRCPATH
903 903 $ echo "evolution=" >> $HGRCPATH
904 904 $ hg log -r tip
905 905 68:c15e9edfca13 (draft) [tip ] add celestine
906 906
907 907 reenable for later test
908 908
909 909 $ echo '[experimental]' >> $HGRCPATH
910 910 $ echo "evolution.exchange=True" >> $HGRCPATH
911 911 $ echo "evolution.createmarkers=True" >> $HGRCPATH
912 912
913 913 $ rm hg.pid access.log errors.log
914 914 #endif
915 915
916 916 Several troubles on the same changeset (create an unstable and bumped changeset)
917 917
918 918 $ hg debugobsolete `getid obsolete_e`
919 919 obsoleted 1 changesets
920 920 $ hg debugobsolete `getid original_c` `getid babar`
921 921 $ hg log --config ui.logtemplate= -r 'phasedivergent() and orphan()'
922 922 changeset: 7:50c51b361e60
923 923 user: test
924 924 date: Thu Jan 01 00:00:00 1970 +0000
925 925 instability: orphan, phase-divergent
926 926 summary: add babar
927 927
928 928
929 929 test the "obsolete" templatekw
930 930
931 931 $ hg log -r 'obsolete()'
932 932 6:3de5eca88c00 (draft *obsolete*) [ ] add obsolete_e [pruned]
933 933
934 934 test the "troubles" templatekw
935 935
936 936 $ hg log -r 'phasedivergent() and orphan()'
937 937 7:50c51b361e60 (draft orphan phase-divergent) [ ] add babar
938 938
939 939 test the default cmdline template
940 940
941 941 $ hg log -T default -r 'phasedivergent()'
942 942 changeset: 7:50c51b361e60
943 943 user: test
944 944 date: Thu Jan 01 00:00:00 1970 +0000
945 945 instability: orphan, phase-divergent
946 946 summary: add babar
947 947
948 948 $ hg log -T default -r 'obsolete()'
949 949 changeset: 6:3de5eca88c00
950 950 parent: 3:6f9641995072
951 951 user: test
952 952 date: Thu Jan 01 00:00:00 1970 +0000
953 953 obsolete: pruned
954 954 summary: add obsolete_e
955 955
956 956
957 957 test the obsolete labels
958 958
959 959 $ hg log --config ui.logtemplate= --color=debug -r 'phasedivergent()'
960 960 [log.changeset changeset.draft changeset.unstable instability.orphan instability.phase-divergent|changeset: 7:50c51b361e60]
961 961 [log.user|user: test]
962 962 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
963 963 [log.instability|instability: orphan, phase-divergent]
964 964 [log.summary|summary: add babar]
965 965
966 966
967 967 $ hg log -T default -r 'phasedivergent()' --color=debug
968 968 [log.changeset changeset.draft changeset.unstable instability.orphan instability.phase-divergent|changeset: 7:50c51b361e60]
969 969 [log.user|user: test]
970 970 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
971 971 [log.instability|instability: orphan, phase-divergent]
972 972 [log.summary|summary: add babar]
973 973
974 974
975 975 $ hg log --config ui.logtemplate= --color=debug -r "obsolete()"
976 976 [log.changeset changeset.draft changeset.obsolete|changeset: 6:3de5eca88c00]
977 977 [log.parent changeset.draft|parent: 3:6f9641995072]
978 978 [log.user|user: test]
979 979 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
980 980 [log.obsfate|obsolete: pruned]
981 981 [log.summary|summary: add obsolete_e]
982 982
983 983
984 984 $ hg log -T default -r 'obsolete()' --color=debug
985 985 [log.changeset changeset.draft changeset.obsolete|changeset: 6:3de5eca88c00]
986 986 [log.parent changeset.draft|parent: 3:6f9641995072]
987 987 [log.user|user: test]
988 988 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
989 989 [log.obsfate|obsolete: pruned]
990 990 [log.summary|summary: add obsolete_e]
991 991
992 992
993 993 test summary output
994 994
995 995 $ hg up -r 'phasedivergent() and orphan()'
996 996 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
997 997 $ hg summary
998 998 parent: 7:50c51b361e60 (orphan, phase-divergent)
999 999 add babar
1000 1000 branch: default
1001 1001 commit: (clean)
1002 1002 update: 2 new changesets (update)
1003 1003 phases: 4 draft
1004 1004 orphan: 2 changesets
1005 1005 phase-divergent: 1 changesets
1006 1006 $ hg up -r 'obsolete()'
1007 1007 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1008 1008 $ hg summary
1009 1009 parent: 6:3de5eca88c00 (obsolete)
1010 1010 add obsolete_e
1011 1011 branch: default
1012 1012 commit: (clean)
1013 1013 update: 3 new changesets (update)
1014 1014 phases: 4 draft
1015 1015 orphan: 2 changesets
1016 1016 phase-divergent: 1 changesets
1017 1017
1018 #if serve
1019
1020 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1021 $ cat hg.pid >> $DAEMON_PIDS
1022
1023 check obsolete changeset
1024
1025 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=paper' | grep '<span class="obsolete">'
1026 <span class="phase">draft</span> <span class="obsolete">obsolete</span>
1027 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=coal' | grep '<span class="obsolete">'
1028 <span class="phase">draft</span> <span class="obsolete">obsolete</span>
1029 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=gitweb' | grep '<span class="logtags">'
1030 <span class="logtags"><span class="phasetag" title="draft">draft</span> <span class="obsoletetag" title="obsolete">obsolete</span> </span>
1031 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=monoblue' | grep '<span class="logtags">'
1032 <span class="logtags"><span class="phasetag" title="draft">draft</span> <span class="obsoletetag" title="obsolete">obsolete</span> </span>
1033 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=spartan' | grep 'class="obsolete"'
1034 <th class="obsolete">obsolete:</th>
1035 <td class="obsolete">yes</td>
1036
1037 $ killdaemons.py
1038
1039 $ rm hg.pid access.log errors.log
1040 #endif
1041
1018 1042 Test incoming/outcoming with changesets obsoleted remotely, known locally
1019 1043 ===============================================================================
1020 1044
1021 1045 This test issue 3805
1022 1046
1023 1047 $ hg init repo-issue3805
1024 1048 $ cd repo-issue3805
1025 1049 $ echo "base" > base
1026 1050 $ hg ci -Am "base"
1027 1051 adding base
1028 1052 $ echo "foo" > foo
1029 1053 $ hg ci -Am "A"
1030 1054 adding foo
1031 1055 $ hg clone . ../other-issue3805
1032 1056 updating to branch default
1033 1057 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1034 1058 $ echo "bar" >> foo
1035 1059 $ hg ci --amend
1036 1060 $ cd ../other-issue3805
1037 1061 $ hg log -G
1038 1062 @ 1:29f0c6921ddd (draft) [tip ] A
1039 1063 |
1040 1064 o 0:d20a80d4def3 (draft) [ ] base
1041 1065
1042 1066 $ hg log -G -R ../repo-issue3805
1043 1067 @ 2:323a9c3ddd91 (draft) [tip ] A
1044 1068 |
1045 1069 o 0:d20a80d4def3 (draft) [ ] base
1046 1070
1047 1071 $ hg incoming
1048 1072 comparing with $TESTTMP/tmpe/repo-issue3805 (glob)
1049 1073 searching for changes
1050 1074 2:323a9c3ddd91 (draft) [tip ] A
1051 1075 $ hg incoming --bundle ../issue3805.hg
1052 1076 comparing with $TESTTMP/tmpe/repo-issue3805 (glob)
1053 1077 searching for changes
1054 1078 2:323a9c3ddd91 (draft) [tip ] A
1055 1079 $ hg outgoing
1056 1080 comparing with $TESTTMP/tmpe/repo-issue3805 (glob)
1057 1081 searching for changes
1058 1082 1:29f0c6921ddd (draft) [tip ] A
1059 1083
1060 1084 #if serve
1061 1085
1062 1086 $ hg serve -R ../repo-issue3805 -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1063 1087 $ cat hg.pid >> $DAEMON_PIDS
1064 1088
1065 1089 $ hg incoming http://localhost:$HGPORT
1066 1090 comparing with http://localhost:$HGPORT/
1067 1091 searching for changes
1068 1092 2:323a9c3ddd91 (draft) [tip ] A
1069 1093 $ hg outgoing http://localhost:$HGPORT
1070 1094 comparing with http://localhost:$HGPORT/
1071 1095 searching for changes
1072 1096 1:29f0c6921ddd (draft) [tip ] A
1073 1097
1074 1098 $ killdaemons.py
1075 1099
1076 1100 #endif
1077 1101
1078 1102 This test issue 3814
1079 1103
1080 1104 (nothing to push but locally hidden changeset)
1081 1105
1082 1106 $ cd ..
1083 1107 $ hg init repo-issue3814
1084 1108 $ cd repo-issue3805
1085 1109 $ hg push -r 323a9c3ddd91 ../repo-issue3814
1086 1110 pushing to ../repo-issue3814
1087 1111 searching for changes
1088 1112 adding changesets
1089 1113 adding manifests
1090 1114 adding file changes
1091 1115 added 2 changesets with 2 changes to 2 files
1092 1116 1 new obsolescence markers
1093 1117 $ hg out ../repo-issue3814
1094 1118 comparing with ../repo-issue3814
1095 1119 searching for changes
1096 1120 no changes found
1097 1121 [1]
1098 1122
1099 1123 Test that a local tag blocks a changeset from being hidden
1100 1124
1101 1125 $ hg tag -l visible -r 1 --hidden
1102 1126 $ hg log -G
1103 1127 @ 2:323a9c3ddd91 (draft) [tip ] A
1104 1128 |
1105 1129 | x 1:29f0c6921ddd (draft *obsolete*) [visible ] A [rewritten using amend as 2:323a9c3ddd91]
1106 1130 |/
1107 1131 o 0:d20a80d4def3 (draft) [ ] base
1108 1132
1109 1133 Test that removing a local tag does not cause some commands to fail
1110 1134
1111 1135 $ hg tag -l -r tip tiptag
1112 1136 $ hg tags
1113 1137 tiptag 2:323a9c3ddd91
1114 1138 tip 2:323a9c3ddd91
1115 1139 visible 1:29f0c6921ddd
1116 1140 $ hg --config extensions.strip= strip -r tip --no-backup
1117 1141 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1118 1142 $ hg tags
1119 1143 visible 1:29f0c6921ddd
1120 1144 tip 1:29f0c6921ddd
1121 1145
1122 1146 Test bundle overlay onto hidden revision
1123 1147
1124 1148 $ cd ..
1125 1149 $ hg init repo-bundleoverlay
1126 1150 $ cd repo-bundleoverlay
1127 1151 $ echo "A" > foo
1128 1152 $ hg ci -Am "A"
1129 1153 adding foo
1130 1154 $ echo "B" >> foo
1131 1155 $ hg ci -m "B"
1132 1156 $ hg up 0
1133 1157 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1134 1158 $ echo "C" >> foo
1135 1159 $ hg ci -m "C"
1136 1160 created new head
1137 1161 $ hg log -G
1138 1162 @ 2:c186d7714947 (draft) [tip ] C
1139 1163 |
1140 1164 | o 1:44526ebb0f98 (draft) [ ] B
1141 1165 |/
1142 1166 o 0:4b34ecfb0d56 (draft) [ ] A
1143 1167
1144 1168
1145 1169 $ hg clone -r1 . ../other-bundleoverlay
1146 1170 adding changesets
1147 1171 adding manifests
1148 1172 adding file changes
1149 1173 added 2 changesets with 2 changes to 1 files
1150 1174 new changesets 4b34ecfb0d56:44526ebb0f98
1151 1175 updating to branch default
1152 1176 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1153 1177 $ cd ../other-bundleoverlay
1154 1178 $ echo "B+" >> foo
1155 1179 $ hg ci --amend -m "B+"
1156 1180 $ hg log -G --hidden
1157 1181 @ 2:b7d587542d40 (draft) [tip ] B+
1158 1182 |
1159 1183 | x 1:44526ebb0f98 (draft *obsolete*) [ ] B [rewritten using amend as 2:b7d587542d40]
1160 1184 |/
1161 1185 o 0:4b34ecfb0d56 (draft) [ ] A
1162 1186
1163 1187
1164 1188 $ hg incoming ../repo-bundleoverlay --bundle ../bundleoverlay.hg
1165 1189 comparing with ../repo-bundleoverlay
1166 1190 searching for changes
1167 1191 1:44526ebb0f98 (draft) [ ] B
1168 1192 2:c186d7714947 (draft) [tip ] C
1169 1193 $ hg log -G -R ../bundleoverlay.hg
1170 1194 o 3:c186d7714947 (draft) [tip ] C
1171 1195 |
1172 1196 | @ 2:b7d587542d40 (draft) [ ] B+
1173 1197 |/
1174 1198 o 0:4b34ecfb0d56 (draft) [ ] A
1175 1199
1176 1200
1177 1201 #if serve
1178 1202
1179 1203 Test issue 4506
1180 1204
1181 1205 $ cd ..
1182 1206 $ hg init repo-issue4506
1183 1207 $ cd repo-issue4506
1184 1208 $ echo "0" > foo
1185 1209 $ hg add foo
1186 1210 $ hg ci -m "content-0"
1187 1211
1188 1212 $ hg up null
1189 1213 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1190 1214 $ echo "1" > bar
1191 1215 $ hg add bar
1192 1216 $ hg ci -m "content-1"
1193 1217 created new head
1194 1218 $ hg up 0
1195 1219 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1196 1220 $ hg graft 1
1197 1221 grafting 1:1c9eddb02162 "content-1" (tip)
1198 1222
1199 1223 $ hg debugobsolete `hg log -r1 -T'{node}'` `hg log -r2 -T'{node}'`
1200 1224 obsoleted 1 changesets
1201 1225
1202 1226 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1203 1227 $ cat hg.pid >> $DAEMON_PIDS
1204 1228
1205 1229 $ get-with-headers.py --headeronly localhost:$HGPORT 'rev/1'
1206 1230 404 Not Found
1207 1231 [1]
1208 1232 $ get-with-headers.py --headeronly localhost:$HGPORT 'file/tip/bar'
1209 1233 200 Script output follows
1210 1234 $ get-with-headers.py --headeronly localhost:$HGPORT 'annotate/tip/bar'
1211 1235 200 Script output follows
1212 1236
1213 1237 $ killdaemons.py
1214 1238
1215 1239 #endif
1216 1240
1217 1241 Test heads computation on pending index changes with obsolescence markers
1218 1242 $ cd ..
1219 1243 $ cat >$TESTTMP/test_extension.py << EOF
1220 1244 > from __future__ import absolute_import
1221 1245 > from mercurial.i18n import _
1222 1246 > from mercurial import cmdutil, registrar
1223 1247 >
1224 1248 > cmdtable = {}
1225 1249 > command = registrar.command(cmdtable)
1226 1250 > @command(b"amendtransient",[], _('hg amendtransient [rev]'))
1227 1251 > def amend(ui, repo, *pats, **opts):
1228 1252 > opts['message'] = 'Test'
1229 1253 > opts['logfile'] = None
1230 1254 > cmdutil.amend(ui, repo, repo['.'], {}, pats, opts)
1231 1255 > ui.write('%s\n' % repo.changelog.headrevs())
1232 1256 > EOF
1233 1257 $ cat >> $HGRCPATH << EOF
1234 1258 > [extensions]
1235 1259 > testextension=$TESTTMP/test_extension.py
1236 1260 > EOF
1237 1261 $ hg init repo-issue-nativerevs-pending-changes
1238 1262 $ cd repo-issue-nativerevs-pending-changes
1239 1263 $ mkcommit a
1240 1264 $ mkcommit b
1241 1265 $ hg up ".^"
1242 1266 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1243 1267 $ echo aa > a
1244 1268 $ hg amendtransient
1245 1269 [1, 2]
1246 1270
1247 1271 Test cache consistency for the visible filter
1248 1272 1) We want to make sure that the cached filtered revs are invalidated when
1249 1273 bookmarks change
1250 1274 $ cd ..
1251 1275 $ cat >$TESTTMP/test_extension.py << EOF
1252 1276 > from __future__ import absolute_import, print_function
1253 1277 > import weakref
1254 1278 > from mercurial import (
1255 1279 > bookmarks,
1256 1280 > cmdutil,
1257 1281 > extensions,
1258 1282 > repoview,
1259 1283 > )
1260 1284 > def _bookmarkchanged(orig, bkmstoreinst, *args, **kwargs):
1261 1285 > reporef = weakref.ref(bkmstoreinst._repo)
1262 1286 > def trhook(tr):
1263 1287 > repo = reporef()
1264 1288 > hidden1 = repoview.computehidden(repo)
1265 1289 > hidden = repoview.filterrevs(repo, 'visible')
1266 1290 > if sorted(hidden1) != sorted(hidden):
1267 1291 > print("cache inconsistency")
1268 1292 > bkmstoreinst._repo.currenttransaction().addpostclose('test_extension', trhook)
1269 1293 > orig(bkmstoreinst, *args, **kwargs)
1270 1294 > def extsetup(ui):
1271 1295 > extensions.wrapfunction(bookmarks.bmstore, '_recordchange',
1272 1296 > _bookmarkchanged)
1273 1297 > EOF
1274 1298
1275 1299 $ hg init repo-cache-inconsistency
1276 1300 $ cd repo-issue-nativerevs-pending-changes
1277 1301 $ mkcommit a
1278 1302 a already tracked!
1279 1303 $ mkcommit b
1280 1304 $ hg id
1281 1305 13bedc178fce tip
1282 1306 $ echo "hello" > b
1283 1307 $ hg commit --amend -m "message"
1284 1308 $ hg book bookb -r 13bedc178fce --hidden
1285 1309 $ hg log -r 13bedc178fce
1286 1310 4:13bedc178fce (draft *obsolete*) [ bookb] add b [rewritten using amend as 5:a9b1f8652753]
1287 1311 $ hg book -d bookb
1288 1312 $ hg log -r 13bedc178fce
1289 1313 abort: hidden revision '13bedc178fce'!
1290 1314 (use --hidden to access hidden revisions)
1291 1315 [255]
1292 1316
1293 1317 Empty out the test extension, as it isn't compatible with later parts
1294 1318 of the test.
1295 1319 $ echo > $TESTTMP/test_extension.py
1296 1320
1297 1321 Test ability to pull changeset with locally applying obsolescence markers
1298 1322 (issue4945)
1299 1323
1300 1324 $ cd ..
1301 1325 $ hg init issue4845
1302 1326 $ cd issue4845
1303 1327
1304 1328 $ echo foo > f0
1305 1329 $ hg add f0
1306 1330 $ hg ci -m '0'
1307 1331 $ echo foo > f1
1308 1332 $ hg add f1
1309 1333 $ hg ci -m '1'
1310 1334 $ echo foo > f2
1311 1335 $ hg add f2
1312 1336 $ hg ci -m '2'
1313 1337
1314 1338 $ echo bar > f2
1315 1339 $ hg commit --amend --config experimental.evolution.createmarkers=True
1316 1340 $ hg log -G
1317 1341 @ 3:b0551702f918 (draft) [tip ] 2
1318 1342 |
1319 1343 o 1:e016b03fd86f (draft) [ ] 1
1320 1344 |
1321 1345 o 0:a78f55e5508c (draft) [ ] 0
1322 1346
1323 1347 $ hg log -G --hidden
1324 1348 @ 3:b0551702f918 (draft) [tip ] 2
1325 1349 |
1326 1350 | x 2:e008cf283490 (draft *obsolete*) [ ] 2 [rewritten using amend as 3:b0551702f918]
1327 1351 |/
1328 1352 o 1:e016b03fd86f (draft) [ ] 1
1329 1353 |
1330 1354 o 0:a78f55e5508c (draft) [ ] 0
1331 1355
1332 1356
1333 1357 $ hg strip --hidden -r 2 --config extensions.strip= --config devel.strip-obsmarkers=no
1334 1358 saved backup bundle to $TESTTMP/tmpe/issue4845/.hg/strip-backup/e008cf283490-ede36964-backup.hg (glob)
1335 1359 $ hg debugobsolete
1336 1360 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
1337 1361 $ hg log -G
1338 1362 @ 2:b0551702f918 (draft) [tip ] 2
1339 1363 |
1340 1364 o 1:e016b03fd86f (draft) [ ] 1
1341 1365 |
1342 1366 o 0:a78f55e5508c (draft) [ ] 0
1343 1367
1344 1368 $ hg log -G --hidden
1345 1369 @ 2:b0551702f918 (draft) [tip ] 2
1346 1370 |
1347 1371 o 1:e016b03fd86f (draft) [ ] 1
1348 1372 |
1349 1373 o 0:a78f55e5508c (draft) [ ] 0
1350 1374
1351 1375 $ hg debugbundle .hg/strip-backup/e008cf283490-*-backup.hg
1352 1376 Stream params: {Compression: BZ}
1353 1377 changegroup -- {nbchanges: 1, version: 02}
1354 1378 e008cf2834908e5d6b0f792a9d4b0e2272260fb8
1355 1379 phase-heads -- {}
1356 1380 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 draft
1357 1381
1358 1382 $ hg pull .hg/strip-backup/e008cf283490-*-backup.hg
1359 1383 pulling from .hg/strip-backup/e008cf283490-ede36964-backup.hg
1360 1384 searching for changes
1361 1385 no changes found
1362 1386 $ hg debugobsolete
1363 1387 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
1364 1388 $ hg log -G
1365 1389 @ 2:b0551702f918 (draft) [tip ] 2
1366 1390 |
1367 1391 o 1:e016b03fd86f (draft) [ ] 1
1368 1392 |
1369 1393 o 0:a78f55e5508c (draft) [ ] 0
1370 1394
1371 1395 $ hg log -G --hidden
1372 1396 @ 2:b0551702f918 (draft) [tip ] 2
1373 1397 |
1374 1398 o 1:e016b03fd86f (draft) [ ] 1
1375 1399 |
1376 1400 o 0:a78f55e5508c (draft) [ ] 0
1377 1401
1378 1402
1379 1403 Testing that strip remove markers:
1380 1404
1381 1405 $ hg strip -r 1 --config extensions.strip=
1382 1406 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1383 1407 saved backup bundle to $TESTTMP/tmpe/issue4845/.hg/strip-backup/e016b03fd86f-65ede734-backup.hg (glob)
1384 1408 $ hg debugobsolete
1385 1409 $ hg log -G
1386 1410 @ 0:a78f55e5508c (draft) [tip ] 0
1387 1411
1388 1412 $ hg log -G --hidden
1389 1413 @ 0:a78f55e5508c (draft) [tip ] 0
1390 1414
1391 1415 $ hg debugbundle .hg/strip-backup/e016b03fd86f-*-backup.hg
1392 1416 Stream params: {Compression: BZ}
1393 1417 changegroup -- {nbchanges: 2, version: 02}
1394 1418 e016b03fd86fcccc54817d120b90b751aaf367d6
1395 1419 b0551702f918510f01ae838ab03a463054c67b46
1396 1420 obsmarkers -- {}
1397 1421 version: 1 (92 bytes)
1398 1422 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
1399 1423 phase-heads -- {}
1400 1424 b0551702f918510f01ae838ab03a463054c67b46 draft
1401 1425
1402 1426 $ hg unbundle .hg/strip-backup/e016b03fd86f-*-backup.hg
1403 1427 adding changesets
1404 1428 adding manifests
1405 1429 adding file changes
1406 1430 added 2 changesets with 2 changes to 2 files
1407 1431 1 new obsolescence markers
1408 1432 new changesets e016b03fd86f:b0551702f918
1409 1433 (run 'hg update' to get a working copy)
1410 1434 $ hg debugobsolete | sort
1411 1435 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
1412 1436 $ hg log -G
1413 1437 o 2:b0551702f918 (draft) [tip ] 2
1414 1438 |
1415 1439 o 1:e016b03fd86f (draft) [ ] 1
1416 1440 |
1417 1441 @ 0:a78f55e5508c (draft) [ ] 0
1418 1442
1419 1443 $ hg log -G --hidden
1420 1444 o 2:b0551702f918 (draft) [tip ] 2
1421 1445 |
1422 1446 o 1:e016b03fd86f (draft) [ ] 1
1423 1447 |
1424 1448 @ 0:a78f55e5508c (draft) [ ] 0
1425 1449
1426 1450 Test that 'hg debugobsolete --index --rev' can show indices of obsmarkers when
1427 1451 only a subset of those are displayed (because of --rev option)
1428 1452 $ hg init doindexrev
1429 1453 $ cd doindexrev
1430 1454 $ echo a > a
1431 1455 $ hg ci -Am a
1432 1456 adding a
1433 1457 $ hg ci --amend -m aa
1434 1458 $ echo b > b
1435 1459 $ hg ci -Am b
1436 1460 adding b
1437 1461 $ hg ci --amend -m bb
1438 1462 $ echo c > c
1439 1463 $ hg ci -Am c
1440 1464 adding c
1441 1465 $ hg ci --amend -m cc
1442 1466 $ echo d > d
1443 1467 $ hg ci -Am d
1444 1468 adding d
1445 1469 $ hg ci --amend -m dd --config experimental.evolution.track-operation=1
1446 1470 $ hg debugobsolete --index --rev "3+7"
1447 1471 1 6fdef60fcbabbd3d50e9b9cbc2a240724b91a5e1 d27fb9b066076fd921277a4b9e8b9cb48c95bc6a 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1448 1472 3 4715cf767440ed891755448016c2b8cf70760c30 7ae79c5d60f049c7b0dd02f5f25b9d60aaf7b36d 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1449 1473 $ hg debugobsolete --index --rev "3+7" -Tjson
1450 1474 [
1451 1475 {
1452 1476 "date": [0.0, 0],
1453 1477 "flag": 0,
1454 1478 "index": 1,
1455 1479 "metadata": {"ef1": "1", "operation": "amend", "user": "test"},
1456 1480 "prednode": "6fdef60fcbabbd3d50e9b9cbc2a240724b91a5e1",
1457 1481 "succnodes": ["d27fb9b066076fd921277a4b9e8b9cb48c95bc6a"]
1458 1482 },
1459 1483 {
1460 1484 "date": [0.0, 0],
1461 1485 "flag": 0,
1462 1486 "index": 3,
1463 1487 "metadata": {"ef1": "1", "operation": "amend", "user": "test"},
1464 1488 "prednode": "4715cf767440ed891755448016c2b8cf70760c30",
1465 1489 "succnodes": ["7ae79c5d60f049c7b0dd02f5f25b9d60aaf7b36d"]
1466 1490 }
1467 1491 ]
1468 1492
1469 1493 Test the --delete option of debugobsolete command
1470 1494 $ hg debugobsolete --index
1471 1495 0 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b f9bd49731b0b175e42992a3c8fa6c678b2bc11f1 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1472 1496 1 6fdef60fcbabbd3d50e9b9cbc2a240724b91a5e1 d27fb9b066076fd921277a4b9e8b9cb48c95bc6a 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1473 1497 2 1ab51af8f9b41ef8c7f6f3312d4706d870b1fb74 29346082e4a9e27042b62d2da0e2de211c027621 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1474 1498 3 4715cf767440ed891755448016c2b8cf70760c30 7ae79c5d60f049c7b0dd02f5f25b9d60aaf7b36d 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1475 1499 $ hg debugobsolete --delete 1 --delete 3
1476 1500 deleted 2 obsolescence markers
1477 1501 $ hg debugobsolete
1478 1502 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b f9bd49731b0b175e42992a3c8fa6c678b2bc11f1 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1479 1503 1ab51af8f9b41ef8c7f6f3312d4706d870b1fb74 29346082e4a9e27042b62d2da0e2de211c027621 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1480 1504
1481 1505 Test adding changeset after obsmarkers affecting it
1482 1506 (eg: during pull, or unbundle)
1483 1507
1484 1508 $ mkcommit e
1485 1509 $ hg bundle -r . --base .~1 ../bundle-2.hg
1486 1510 1 changesets found
1487 1511 $ getid .
1488 1512 $ hg --config extensions.strip= strip -r .
1489 1513 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1490 1514 saved backup bundle to $TESTTMP/tmpe/issue4845/doindexrev/.hg/strip-backup/9bc153528424-ee80edd4-backup.hg (glob)
1491 1515 $ hg debugobsolete 9bc153528424ea266d13e57f9ff0d799dfe61e4b
1492 1516 $ hg unbundle ../bundle-2.hg
1493 1517 adding changesets
1494 1518 adding manifests
1495 1519 adding file changes
1496 1520 added 1 changesets with 1 changes to 1 files
1497 1521 (run 'hg update' to get a working copy)
1498 1522 $ hg log -G
1499 1523 @ 7:7ae79c5d60f0 (draft) [tip ] dd
1500 1524 |
1501 1525 | o 6:4715cf767440 (draft) [ ] d
1502 1526 |/
1503 1527 o 5:29346082e4a9 (draft) [ ] cc
1504 1528 |
1505 1529 o 3:d27fb9b06607 (draft) [ ] bb
1506 1530 |
1507 1531 | o 2:6fdef60fcbab (draft) [ ] b
1508 1532 |/
1509 1533 o 1:f9bd49731b0b (draft) [ ] aa
1510 1534
1511 1535
1512 1536 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now