##// END OF EJS Templates
py3: use pycompat.bytestr() on extra values because it can be int...
Pulkit Goyal -
r41715:b436059c default
parent child Browse files
Show More
@@ -1,765 +1,766 b''
1 test-abort-checkin.t
1 test-abort-checkin.t
2 test-absorb-edit-lines.t
2 test-absorb-edit-lines.t
3 test-absorb-filefixupstate.py
3 test-absorb-filefixupstate.py
4 test-absorb-phase.t
4 test-absorb-phase.t
5 test-absorb-rename.t
5 test-absorb-rename.t
6 test-absorb-strip.t
6 test-absorb-strip.t
7 test-absorb.t
7 test-absorb.t
8 test-acl.t
8 test-acl.t
9 test-add.t
9 test-add.t
10 test-addremove-similar.t
10 test-addremove-similar.t
11 test-addremove.t
11 test-addremove.t
12 test-alias.t
12 test-alias.t
13 test-amend-subrepo.t
13 test-amend-subrepo.t
14 test-amend.t
14 test-amend.t
15 test-ancestor.py
15 test-ancestor.py
16 test-annotate.py
16 test-annotate.py
17 test-annotate.t
17 test-annotate.t
18 test-arbitraryfilectx.t
18 test-arbitraryfilectx.t
19 test-archive-symlinks.t
19 test-archive-symlinks.t
20 test-archive.t
20 test-archive.t
21 test-atomictempfile.py
21 test-atomictempfile.py
22 test-audit-path.t
22 test-audit-path.t
23 test-audit-subrepo.t
23 test-audit-subrepo.t
24 test-automv.t
24 test-automv.t
25 test-backout.t
25 test-backout.t
26 test-backwards-remove.t
26 test-backwards-remove.t
27 test-bad-extension.t
27 test-bad-extension.t
28 test-bad-pull.t
28 test-bad-pull.t
29 test-basic.t
29 test-basic.t
30 test-batching.py
30 test-batching.py
31 test-bdiff.py
31 test-bdiff.py
32 test-bheads.t
32 test-bheads.t
33 test-bisect.t
33 test-bisect.t
34 test-bisect2.t
34 test-bisect2.t
35 test-bisect3.t
35 test-bisect3.t
36 test-blackbox.t
36 test-blackbox.t
37 test-bookflow.t
37 test-bookflow.t
38 test-bookmarks-current.t
38 test-bookmarks-current.t
39 test-bookmarks-merge.t
39 test-bookmarks-merge.t
40 test-bookmarks-pushpull.t
40 test-bookmarks-pushpull.t
41 test-bookmarks-rebase.t
41 test-bookmarks-rebase.t
42 test-bookmarks-strip.t
42 test-bookmarks-strip.t
43 test-bookmarks.t
43 test-bookmarks.t
44 test-branch-change.t
44 test-branch-change.t
45 test-branch-option.t
45 test-branch-option.t
46 test-branch-tag-confict.t
46 test-branch-tag-confict.t
47 test-branches.t
47 test-branches.t
48 test-bugzilla.t
48 test-bugzilla.t
49 test-bundle-phases.t
49 test-bundle-phases.t
50 test-bundle-r.t
50 test-bundle-r.t
51 test-bundle-type.t
51 test-bundle-type.t
52 test-bundle-vs-outgoing.t
52 test-bundle-vs-outgoing.t
53 test-bundle.t
53 test-bundle.t
54 test-bundle2-exchange.t
54 test-bundle2-exchange.t
55 test-bundle2-format.t
55 test-bundle2-format.t
56 test-bundle2-multiple-changegroups.t
56 test-bundle2-multiple-changegroups.t
57 test-bundle2-pushback.t
57 test-bundle2-pushback.t
58 test-bundle2-remote-changegroup.t
58 test-bundle2-remote-changegroup.t
59 test-cache-abuse.t
59 test-cache-abuse.t
60 test-cappedreader.py
60 test-cappedreader.py
61 test-casecollision-merge.t
61 test-casecollision-merge.t
62 test-casecollision.t
62 test-casecollision.t
63 test-casefolding.t
63 test-casefolding.t
64 test-cat.t
64 test-cat.t
65 test-cbor.py
65 test-cbor.py
66 test-censor.t
66 test-censor.t
67 test-changelog-exec.t
67 test-changelog-exec.t
68 test-check-code.t
68 test-check-code.t
69 test-check-commit.t
69 test-check-commit.t
70 test-check-config.py
70 test-check-config.py
71 test-check-config.t
71 test-check-config.t
72 test-check-execute.t
72 test-check-execute.t
73 test-check-help.t
73 test-check-help.t
74 test-check-interfaces.py
74 test-check-interfaces.py
75 test-check-module-imports.t
75 test-check-module-imports.t
76 test-check-py3-compat.t
76 test-check-py3-compat.t
77 test-check-pyflakes.t
77 test-check-pyflakes.t
78 test-check-pylint.t
78 test-check-pylint.t
79 test-check-shbang.t
79 test-check-shbang.t
80 test-children.t
80 test-children.t
81 test-churn.t
81 test-churn.t
82 test-clone-cgi.t
82 test-clone-cgi.t
83 test-clone-pull-corruption.t
83 test-clone-pull-corruption.t
84 test-clone-r.t
84 test-clone-r.t
85 test-clone-uncompressed.t
85 test-clone-uncompressed.t
86 test-clone-update-order.t
86 test-clone-update-order.t
87 test-clone.t
87 test-clone.t
88 test-clonebundles.t
88 test-clonebundles.t
89 test-close-head.t
89 test-close-head.t
90 test-commandserver.t
90 test-commandserver.t
91 test-commit-amend.t
91 test-commit-amend.t
92 test-commit-interactive.t
92 test-commit-interactive.t
93 test-commit-multiple.t
93 test-commit-multiple.t
94 test-commit-unresolved.t
94 test-commit-unresolved.t
95 test-commit.t
95 test-commit.t
96 test-committer.t
96 test-committer.t
97 test-completion.t
97 test-completion.t
98 test-config-env.py
98 test-config-env.py
99 test-config.t
99 test-config.t
100 test-conflict.t
100 test-conflict.t
101 test-confused-revert.t
101 test-confused-revert.t
102 test-context-metadata.t
102 test-context-metadata.t
103 test-context.py
103 test-context.py
104 test-contrib-check-code.t
104 test-contrib-check-code.t
105 test-contrib-check-commit.t
105 test-contrib-check-commit.t
106 test-contrib-dumprevlog.t
106 test-contrib-dumprevlog.t
107 test-contrib-perf.t
107 test-contrib-perf.t
108 test-contrib-relnotes.t
108 test-contrib-relnotes.t
109 test-contrib-testparseutil.t
109 test-contrib-testparseutil.t
110 test-contrib.t
110 test-contrib.t
111 test-convert-authormap.t
111 test-convert-authormap.t
112 test-convert-clonebranches.t
112 test-convert-clonebranches.t
113 test-convert-cvs-branch.t
113 test-convert-cvs-branch.t
114 test-convert-cvs-detectmerge.t
114 test-convert-cvs-detectmerge.t
115 test-convert-cvs-synthetic.t
115 test-convert-cvs-synthetic.t
116 test-convert-cvs.t
116 test-convert-cvs.t
117 test-convert-cvsnt-mergepoints.t
117 test-convert-cvsnt-mergepoints.t
118 test-convert-datesort.t
118 test-convert-datesort.t
119 test-convert-filemap.t
119 test-convert-filemap.t
120 test-convert-git.t
120 test-convert-git.t
121 test-convert-hg-sink.t
121 test-convert-hg-sink.t
122 test-convert-hg-source.t
122 test-convert-hg-source.t
123 test-convert-hg-startrev.t
123 test-convert-hg-startrev.t
124 test-convert-mtn.t
124 test-convert-splicemap.t
125 test-convert-splicemap.t
125 test-convert-svn-sink.t
126 test-convert-svn-sink.t
126 test-convert-tagsbranch-topology.t
127 test-convert-tagsbranch-topology.t
127 test-convert.t
128 test-convert.t
128 test-copy-move-merge.t
129 test-copy-move-merge.t
129 test-copy.t
130 test-copy.t
130 test-copytrace-heuristics.t
131 test-copytrace-heuristics.t
131 test-custom-filters.t
132 test-custom-filters.t
132 test-debugbuilddag.t
133 test-debugbuilddag.t
133 test-debugbundle.t
134 test-debugbundle.t
134 test-debugcommands.t
135 test-debugcommands.t
135 test-debugextensions.t
136 test-debugextensions.t
136 test-debugindexdot.t
137 test-debugindexdot.t
137 test-debugrename.t
138 test-debugrename.t
138 test-default-push.t
139 test-default-push.t
139 test-demandimport.py
140 test-demandimport.py
140 test-diff-antipatience.t
141 test-diff-antipatience.t
141 test-diff-binary-file.t
142 test-diff-binary-file.t
142 test-diff-change.t
143 test-diff-change.t
143 test-diff-color.t
144 test-diff-color.t
144 test-diff-copy-depth.t
145 test-diff-copy-depth.t
145 test-diff-hashes.t
146 test-diff-hashes.t
146 test-diff-ignore-whitespace.t
147 test-diff-ignore-whitespace.t
147 test-diff-indent-heuristic.t
148 test-diff-indent-heuristic.t
148 test-diff-issue2761.t
149 test-diff-issue2761.t
149 test-diff-newlines.t
150 test-diff-newlines.t
150 test-diff-reverse.t
151 test-diff-reverse.t
151 test-diff-subdir.t
152 test-diff-subdir.t
152 test-diff-unified.t
153 test-diff-unified.t
153 test-diff-upgrade.t
154 test-diff-upgrade.t
154 test-diffdir.t
155 test-diffdir.t
155 test-diffstat.t
156 test-diffstat.t
156 test-directaccess.t
157 test-directaccess.t
157 test-dirstate-backup.t
158 test-dirstate-backup.t
158 test-dirstate-nonnormalset.t
159 test-dirstate-nonnormalset.t
159 test-dirstate-race.t
160 test-dirstate-race.t
160 test-dirstate.t
161 test-dirstate.t
161 test-dispatch.py
162 test-dispatch.py
162 test-dispatch.t
163 test-dispatch.t
163 test-doctest.py
164 test-doctest.py
164 test-double-merge.t
165 test-double-merge.t
165 test-drawdag.t
166 test-drawdag.t
166 test-duplicateoptions.py
167 test-duplicateoptions.py
167 test-editor-filename.t
168 test-editor-filename.t
168 test-empty-dir.t
169 test-empty-dir.t
169 test-empty-file.t
170 test-empty-file.t
170 test-empty-group.t
171 test-empty-group.t
171 test-empty.t
172 test-empty.t
172 test-encode.t
173 test-encode.t
173 test-encoding-align.t
174 test-encoding-align.t
174 test-encoding-func.py
175 test-encoding-func.py
175 test-encoding-textwrap.t
176 test-encoding-textwrap.t
176 test-encoding.t
177 test-encoding.t
177 test-eol-add.t
178 test-eol-add.t
178 test-eol-clone.t
179 test-eol-clone.t
179 test-eol-hook.t
180 test-eol-hook.t
180 test-eol-patch.t
181 test-eol-patch.t
181 test-eol-tag.t
182 test-eol-tag.t
182 test-eol-update.t
183 test-eol-update.t
183 test-eol.t
184 test-eol.t
184 test-eolfilename.t
185 test-eolfilename.t
185 test-excessive-merge.t
186 test-excessive-merge.t
186 test-exchange-obsmarkers-case-A1.t
187 test-exchange-obsmarkers-case-A1.t
187 test-exchange-obsmarkers-case-A2.t
188 test-exchange-obsmarkers-case-A2.t
188 test-exchange-obsmarkers-case-A3.t
189 test-exchange-obsmarkers-case-A3.t
189 test-exchange-obsmarkers-case-A4.t
190 test-exchange-obsmarkers-case-A4.t
190 test-exchange-obsmarkers-case-A5.t
191 test-exchange-obsmarkers-case-A5.t
191 test-exchange-obsmarkers-case-A6.t
192 test-exchange-obsmarkers-case-A6.t
192 test-exchange-obsmarkers-case-A7.t
193 test-exchange-obsmarkers-case-A7.t
193 test-exchange-obsmarkers-case-B1.t
194 test-exchange-obsmarkers-case-B1.t
194 test-exchange-obsmarkers-case-B2.t
195 test-exchange-obsmarkers-case-B2.t
195 test-exchange-obsmarkers-case-B3.t
196 test-exchange-obsmarkers-case-B3.t
196 test-exchange-obsmarkers-case-B4.t
197 test-exchange-obsmarkers-case-B4.t
197 test-exchange-obsmarkers-case-B5.t
198 test-exchange-obsmarkers-case-B5.t
198 test-exchange-obsmarkers-case-B6.t
199 test-exchange-obsmarkers-case-B6.t
199 test-exchange-obsmarkers-case-B7.t
200 test-exchange-obsmarkers-case-B7.t
200 test-exchange-obsmarkers-case-C1.t
201 test-exchange-obsmarkers-case-C1.t
201 test-exchange-obsmarkers-case-C2.t
202 test-exchange-obsmarkers-case-C2.t
202 test-exchange-obsmarkers-case-C3.t
203 test-exchange-obsmarkers-case-C3.t
203 test-exchange-obsmarkers-case-C4.t
204 test-exchange-obsmarkers-case-C4.t
204 test-exchange-obsmarkers-case-D1.t
205 test-exchange-obsmarkers-case-D1.t
205 test-exchange-obsmarkers-case-D2.t
206 test-exchange-obsmarkers-case-D2.t
206 test-exchange-obsmarkers-case-D3.t
207 test-exchange-obsmarkers-case-D3.t
207 test-exchange-obsmarkers-case-D4.t
208 test-exchange-obsmarkers-case-D4.t
208 test-execute-bit.t
209 test-execute-bit.t
209 test-export.t
210 test-export.t
210 test-extdata.t
211 test-extdata.t
211 test-extdiff.t
212 test-extdiff.t
212 test-extension-timing.t
213 test-extension-timing.t
213 test-extension.t
214 test-extension.t
214 test-extensions-afterloaded.t
215 test-extensions-afterloaded.t
215 test-extensions-wrapfunction.py
216 test-extensions-wrapfunction.py
216 test-extra-filelog-entry.t
217 test-extra-filelog-entry.t
217 test-fastannotate-corrupt.t
218 test-fastannotate-corrupt.t
218 test-fastannotate-diffopts.t
219 test-fastannotate-diffopts.t
219 test-fastannotate-hg.t
220 test-fastannotate-hg.t
220 test-fastannotate-perfhack.t
221 test-fastannotate-perfhack.t
221 test-fastannotate-protocol.t
222 test-fastannotate-protocol.t
222 test-fastannotate-renames.t
223 test-fastannotate-renames.t
223 test-fastannotate-revmap.py
224 test-fastannotate-revmap.py
224 test-fastannotate.t
225 test-fastannotate.t
225 test-fetch.t
226 test-fetch.t
226 test-filebranch.t
227 test-filebranch.t
227 test-filecache.py
228 test-filecache.py
228 test-filelog.py
229 test-filelog.py
229 test-fileset-generated.t
230 test-fileset-generated.t
230 test-fileset.t
231 test-fileset.t
231 test-fix-topology.t
232 test-fix-topology.t
232 test-fix.t
233 test-fix.t
233 test-flagprocessor.t
234 test-flagprocessor.t
234 test-flags.t
235 test-flags.t
235 test-fncache.t
236 test-fncache.t
236 test-gendoc-da.t
237 test-gendoc-da.t
237 test-gendoc-de.t
238 test-gendoc-de.t
238 test-gendoc-el.t
239 test-gendoc-el.t
239 test-gendoc-fr.t
240 test-gendoc-fr.t
240 test-gendoc-it.t
241 test-gendoc-it.t
241 test-gendoc-ja.t
242 test-gendoc-ja.t
242 test-gendoc-pt_BR.t
243 test-gendoc-pt_BR.t
243 test-gendoc-ro.t
244 test-gendoc-ro.t
244 test-gendoc-ru.t
245 test-gendoc-ru.t
245 test-gendoc-sv.t
246 test-gendoc-sv.t
246 test-gendoc-zh_CN.t
247 test-gendoc-zh_CN.t
247 test-gendoc-zh_TW.t
248 test-gendoc-zh_TW.t
248 test-gendoc.t
249 test-gendoc.t
249 test-generaldelta.t
250 test-generaldelta.t
250 test-getbundle.t
251 test-getbundle.t
251 test-git-export.t
252 test-git-export.t
252 test-githelp.t
253 test-githelp.t
253 test-globalopts.t
254 test-globalopts.t
254 test-glog-beautifygraph.t
255 test-glog-beautifygraph.t
255 test-glog-topological.t
256 test-glog-topological.t
256 test-glog.t
257 test-glog.t
257 test-gpg.t
258 test-gpg.t
258 test-graft.t
259 test-graft.t
259 test-grep.t
260 test-grep.t
260 test-hardlinks.t
261 test-hardlinks.t
261 test-help-hide.t
262 test-help-hide.t
262 test-help.t
263 test-help.t
263 test-hg-parseurl.py
264 test-hg-parseurl.py
264 test-hghave.t
265 test-hghave.t
265 test-hgignore.t
266 test-hgignore.t
266 test-hgk.t
267 test-hgk.t
267 test-hgrc.t
268 test-hgrc.t
268 test-hgweb-annotate-whitespace.t
269 test-hgweb-annotate-whitespace.t
269 test-hgweb-auth.py
270 test-hgweb-auth.py
270 test-hgweb-bundle.t
271 test-hgweb-bundle.t
271 test-hgweb-commands.t
272 test-hgweb-commands.t
272 test-hgweb-csp.t
273 test-hgweb-csp.t
273 test-hgweb-descend-empties.t
274 test-hgweb-descend-empties.t
274 test-hgweb-diffs.t
275 test-hgweb-diffs.t
275 test-hgweb-empty.t
276 test-hgweb-empty.t
276 test-hgweb-filelog.t
277 test-hgweb-filelog.t
277 test-hgweb-json.t
278 test-hgweb-json.t
278 test-hgweb-no-path-info.t
279 test-hgweb-no-path-info.t
279 test-hgweb-no-request-uri.t
280 test-hgweb-no-request-uri.t
280 test-hgweb-non-interactive.t
281 test-hgweb-non-interactive.t
281 test-hgweb-raw.t
282 test-hgweb-raw.t
282 test-hgweb-removed.t
283 test-hgweb-removed.t
283 test-hgweb-symrev.t
284 test-hgweb-symrev.t
284 test-hgweb.t
285 test-hgweb.t
285 test-hgwebdir-paths.py
286 test-hgwebdir-paths.py
286 test-hgwebdir.t
287 test-hgwebdir.t
287 test-hgwebdirsym.t
288 test-hgwebdirsym.t
288 test-histedit-arguments.t
289 test-histedit-arguments.t
289 test-histedit-base.t
290 test-histedit-base.t
290 test-histedit-bookmark-motion.t
291 test-histedit-bookmark-motion.t
291 test-histedit-commute.t
292 test-histedit-commute.t
292 test-histedit-drop.t
293 test-histedit-drop.t
293 test-histedit-edit.t
294 test-histedit-edit.t
294 test-histedit-fold-non-commute.t
295 test-histedit-fold-non-commute.t
295 test-histedit-fold.t
296 test-histedit-fold.t
296 test-histedit-no-backup.t
297 test-histedit-no-backup.t
297 test-histedit-no-change.t
298 test-histedit-no-change.t
298 test-histedit-non-commute-abort.t
299 test-histedit-non-commute-abort.t
299 test-histedit-non-commute.t
300 test-histedit-non-commute.t
300 test-histedit-obsolete.t
301 test-histedit-obsolete.t
301 test-histedit-outgoing.t
302 test-histedit-outgoing.t
302 test-histedit-templates.t
303 test-histedit-templates.t
303 test-http-api-httpv2.t
304 test-http-api-httpv2.t
304 test-http-api.t
305 test-http-api.t
305 test-http-bad-server.t
306 test-http-bad-server.t
306 test-http-branchmap.t
307 test-http-branchmap.t
307 test-http-bundle1.t
308 test-http-bundle1.t
308 test-http-clone-r.t
309 test-http-clone-r.t
309 test-http-permissions.t
310 test-http-permissions.t
310 test-http-protocol.t
311 test-http-protocol.t
311 test-http.t
312 test-http.t
312 test-https.t
313 test-https.t
313 test-hybridencode.py
314 test-hybridencode.py
314 test-i18n.t
315 test-i18n.t
315 test-identify.t
316 test-identify.t
316 test-impexp-branch.t
317 test-impexp-branch.t
317 test-import-bypass.t
318 test-import-bypass.t
318 test-import-context.t
319 test-import-context.t
319 test-import-eol.t
320 test-import-eol.t
320 test-import-git.t
321 test-import-git.t
321 test-import-merge.t
322 test-import-merge.t
322 test-import-unknown.t
323 test-import-unknown.t
323 test-import.t
324 test-import.t
324 test-imports-checker.t
325 test-imports-checker.t
325 test-incoming-outgoing.t
326 test-incoming-outgoing.t
326 test-infinitepush-bundlestore.t
327 test-infinitepush-bundlestore.t
327 test-infinitepush-ci.t
328 test-infinitepush-ci.t
328 test-infinitepush.t
329 test-infinitepush.t
329 test-inherit-mode.t
330 test-inherit-mode.t
330 test-init.t
331 test-init.t
331 test-install.t
332 test-install.t
332 test-issue1089.t
333 test-issue1089.t
333 test-issue1102.t
334 test-issue1102.t
334 test-issue1175.t
335 test-issue1175.t
335 test-issue1306.t
336 test-issue1306.t
336 test-issue1438.t
337 test-issue1438.t
337 test-issue1502.t
338 test-issue1502.t
338 test-issue1802.t
339 test-issue1802.t
339 test-issue1877.t
340 test-issue1877.t
340 test-issue1993.t
341 test-issue1993.t
341 test-issue2137.t
342 test-issue2137.t
342 test-issue3084.t
343 test-issue3084.t
343 test-issue4074.t
344 test-issue4074.t
344 test-issue522.t
345 test-issue522.t
345 test-issue586.t
346 test-issue586.t
346 test-issue5979.t
347 test-issue5979.t
347 test-issue612.t
348 test-issue612.t
348 test-issue619.t
349 test-issue619.t
349 test-issue660.t
350 test-issue660.t
350 test-issue672.t
351 test-issue672.t
351 test-issue842.t
352 test-issue842.t
352 test-journal-exists.t
353 test-journal-exists.t
353 test-journal-share.t
354 test-journal-share.t
354 test-journal.t
355 test-journal.t
355 test-keyword.t
356 test-keyword.t
356 test-known.t
357 test-known.t
357 test-largefiles-cache.t
358 test-largefiles-cache.t
358 test-largefiles-misc.t
359 test-largefiles-misc.t
359 test-largefiles-small-disk.t
360 test-largefiles-small-disk.t
360 test-largefiles-update.t
361 test-largefiles-update.t
361 test-largefiles-wireproto.t
362 test-largefiles-wireproto.t
362 test-largefiles.t
363 test-largefiles.t
363 test-lfconvert.t
364 test-lfconvert.t
364 test-lfs-bundle.t
365 test-lfs-bundle.t
365 test-lfs-largefiles.t
366 test-lfs-largefiles.t
366 test-lfs-pointer.py
367 test-lfs-pointer.py
367 test-lfs-test-server.t
368 test-lfs-test-server.t
368 test-lfs.t
369 test-lfs.t
369 test-linelog.py
370 test-linelog.py
370 test-linerange.py
371 test-linerange.py
371 test-locate.t
372 test-locate.t
372 test-lock-badness.t
373 test-lock-badness.t
373 test-lock.py
374 test-lock.py
374 test-log-exthook.t
375 test-log-exthook.t
375 test-log-linerange.t
376 test-log-linerange.t
376 test-log.t
377 test-log.t
377 test-logexchange.t
378 test-logexchange.t
378 test-logtoprocess.t
379 test-logtoprocess.t
379 test-lrucachedict.py
380 test-lrucachedict.py
380 test-mactext.t
381 test-mactext.t
381 test-mailmap.t
382 test-mailmap.t
382 test-manifest-merging.t
383 test-manifest-merging.t
383 test-manifest.py
384 test-manifest.py
384 test-manifest.t
385 test-manifest.t
385 test-match.py
386 test-match.py
386 test-mdiff.py
387 test-mdiff.py
387 test-merge-changedelete.t
388 test-merge-changedelete.t
388 test-merge-closedheads.t
389 test-merge-closedheads.t
389 test-merge-commit.t
390 test-merge-commit.t
390 test-merge-criss-cross.t
391 test-merge-criss-cross.t
391 test-merge-default.t
392 test-merge-default.t
392 test-merge-force.t
393 test-merge-force.t
393 test-merge-halt.t
394 test-merge-halt.t
394 test-merge-internal-tools-pattern.t
395 test-merge-internal-tools-pattern.t
395 test-merge-local.t
396 test-merge-local.t
396 test-merge-no-file-change.t
397 test-merge-no-file-change.t
397 test-merge-remove.t
398 test-merge-remove.t
398 test-merge-revert.t
399 test-merge-revert.t
399 test-merge-revert2.t
400 test-merge-revert2.t
400 test-merge-subrepos.t
401 test-merge-subrepos.t
401 test-merge-symlinks.t
402 test-merge-symlinks.t
402 test-merge-tools.t
403 test-merge-tools.t
403 test-merge-types.t
404 test-merge-types.t
404 test-merge1.t
405 test-merge1.t
405 test-merge10.t
406 test-merge10.t
406 test-merge2.t
407 test-merge2.t
407 test-merge4.t
408 test-merge4.t
408 test-merge5.t
409 test-merge5.t
409 test-merge6.t
410 test-merge6.t
410 test-merge7.t
411 test-merge7.t
411 test-merge8.t
412 test-merge8.t
412 test-merge9.t
413 test-merge9.t
413 test-minifileset.py
414 test-minifileset.py
414 test-minirst.py
415 test-minirst.py
415 test-missing-capability.t
416 test-missing-capability.t
416 test-mq-eol.t
417 test-mq-eol.t
417 test-mq-git.t
418 test-mq-git.t
418 test-mq-guards.t
419 test-mq-guards.t
419 test-mq-header-date.t
420 test-mq-header-date.t
420 test-mq-header-from.t
421 test-mq-header-from.t
421 test-mq-merge.t
422 test-mq-merge.t
422 test-mq-missingfiles.t
423 test-mq-missingfiles.t
423 test-mq-pull-from-bundle.t
424 test-mq-pull-from-bundle.t
424 test-mq-qclone-http.t
425 test-mq-qclone-http.t
425 test-mq-qdelete.t
426 test-mq-qdelete.t
426 test-mq-qdiff.t
427 test-mq-qdiff.t
427 test-mq-qfold.t
428 test-mq-qfold.t
428 test-mq-qgoto.t
429 test-mq-qgoto.t
429 test-mq-qimport-fail-cleanup.t
430 test-mq-qimport-fail-cleanup.t
430 test-mq-qimport.t
431 test-mq-qimport.t
431 test-mq-qnew.t
432 test-mq-qnew.t
432 test-mq-qpush-exact.t
433 test-mq-qpush-exact.t
433 test-mq-qpush-fail.t
434 test-mq-qpush-fail.t
434 test-mq-qqueue.t
435 test-mq-qqueue.t
435 test-mq-qrefresh-interactive.t
436 test-mq-qrefresh-interactive.t
436 test-mq-qrefresh-replace-log-message.t
437 test-mq-qrefresh-replace-log-message.t
437 test-mq-qrefresh.t
438 test-mq-qrefresh.t
438 test-mq-qrename.t
439 test-mq-qrename.t
439 test-mq-qsave.t
440 test-mq-qsave.t
440 test-mq-safety.t
441 test-mq-safety.t
441 test-mq-subrepo-svn.t
442 test-mq-subrepo-svn.t
442 test-mq-subrepo.t
443 test-mq-subrepo.t
443 test-mq-symlinks.t
444 test-mq-symlinks.t
444 test-mq.t
445 test-mq.t
445 test-mv-cp-st-diff.t
446 test-mv-cp-st-diff.t
446 test-narrow-acl.t
447 test-narrow-acl.t
447 test-narrow-archive.t
448 test-narrow-archive.t
448 test-narrow-clone-no-ellipsis.t
449 test-narrow-clone-no-ellipsis.t
449 test-narrow-clone-non-narrow-server.t
450 test-narrow-clone-non-narrow-server.t
450 test-narrow-clone-nonlinear.t
451 test-narrow-clone-nonlinear.t
451 test-narrow-clone-stream.t
452 test-narrow-clone-stream.t
452 test-narrow-clone.t
453 test-narrow-clone.t
453 test-narrow-commit.t
454 test-narrow-commit.t
454 test-narrow-copies.t
455 test-narrow-copies.t
455 test-narrow-debugcommands.t
456 test-narrow-debugcommands.t
456 test-narrow-debugrebuilddirstate.t
457 test-narrow-debugrebuilddirstate.t
457 test-narrow-exchange-merges.t
458 test-narrow-exchange-merges.t
458 test-narrow-exchange.t
459 test-narrow-exchange.t
459 test-narrow-expanddirstate.t
460 test-narrow-expanddirstate.t
460 test-narrow-merge.t
461 test-narrow-merge.t
461 test-narrow-patch.t
462 test-narrow-patch.t
462 test-narrow-patterns.t
463 test-narrow-patterns.t
463 test-narrow-pull.t
464 test-narrow-pull.t
464 test-narrow-rebase.t
465 test-narrow-rebase.t
465 test-narrow-shallow-merges.t
466 test-narrow-shallow-merges.t
466 test-narrow-shallow.t
467 test-narrow-shallow.t
467 test-narrow-share.t
468 test-narrow-share.t
468 test-narrow-sparse.t
469 test-narrow-sparse.t
469 test-narrow-strip.t
470 test-narrow-strip.t
470 test-narrow-trackedcmd.t
471 test-narrow-trackedcmd.t
471 test-narrow-update.t
472 test-narrow-update.t
472 test-narrow-widen-no-ellipsis.t
473 test-narrow-widen-no-ellipsis.t
473 test-narrow-widen.t
474 test-narrow-widen.t
474 test-narrow.t
475 test-narrow.t
475 test-nested-repo.t
476 test-nested-repo.t
476 test-newbranch.t
477 test-newbranch.t
477 test-newcgi.t
478 test-newcgi.t
478 test-newercgi.t
479 test-newercgi.t
479 test-nointerrupt.t
480 test-nointerrupt.t
480 test-notify-changegroup.t
481 test-notify-changegroup.t
481 test-obshistory.t
482 test-obshistory.t
482 test-obsmarker-template.t
483 test-obsmarker-template.t
483 test-obsmarkers-effectflag.t
484 test-obsmarkers-effectflag.t
484 test-obsolete-bounds-checking.t
485 test-obsolete-bounds-checking.t
485 test-obsolete-bundle-strip.t
486 test-obsolete-bundle-strip.t
486 test-obsolete-changeset-exchange.t
487 test-obsolete-changeset-exchange.t
487 test-obsolete-checkheads.t
488 test-obsolete-checkheads.t
488 test-obsolete-distributed.t
489 test-obsolete-distributed.t
489 test-obsolete-divergent.t
490 test-obsolete-divergent.t
490 test-obsolete-tag-cache.t
491 test-obsolete-tag-cache.t
491 test-obsolete.t
492 test-obsolete.t
492 test-oldcgi.t
493 test-oldcgi.t
493 test-origbackup-conflict.t
494 test-origbackup-conflict.t
494 test-pager-legacy.t
495 test-pager-legacy.t
495 test-pager.t
496 test-pager.t
496 test-parents.t
497 test-parents.t
497 test-parse-date.t
498 test-parse-date.t
498 test-parseindex.t
499 test-parseindex.t
499 test-parseindex2.py
500 test-parseindex2.py
500 test-patch-offset.t
501 test-patch-offset.t
501 test-patch.t
502 test-patch.t
502 test-patchbomb-bookmark.t
503 test-patchbomb-bookmark.t
503 test-patchbomb-tls.t
504 test-patchbomb-tls.t
504 test-patchbomb.t
505 test-patchbomb.t
505 test-pathconflicts-basic.t
506 test-pathconflicts-basic.t
506 test-pathconflicts-merge.t
507 test-pathconflicts-merge.t
507 test-pathconflicts-update.t
508 test-pathconflicts-update.t
508 test-pathencode.py
509 test-pathencode.py
509 test-pending.t
510 test-pending.t
510 test-permissions.t
511 test-permissions.t
511 test-phases-exchange.t
512 test-phases-exchange.t
512 test-phases.t
513 test-phases.t
513 test-profile.t
514 test-profile.t
514 test-progress.t
515 test-progress.t
515 test-propertycache.py
516 test-propertycache.py
516 test-pull-branch.t
517 test-pull-branch.t
517 test-pull-bundle.t
518 test-pull-bundle.t
518 test-pull-http.t
519 test-pull-http.t
519 test-pull-permission.t
520 test-pull-permission.t
520 test-pull-pull-corruption.t
521 test-pull-pull-corruption.t
521 test-pull-r.t
522 test-pull-r.t
522 test-pull-update.t
523 test-pull-update.t
523 test-pull.t
524 test-pull.t
524 test-purge.t
525 test-purge.t
525 test-push-cgi.t
526 test-push-cgi.t
526 test-push-checkheads-partial-C1.t
527 test-push-checkheads-partial-C1.t
527 test-push-checkheads-partial-C2.t
528 test-push-checkheads-partial-C2.t
528 test-push-checkheads-partial-C3.t
529 test-push-checkheads-partial-C3.t
529 test-push-checkheads-partial-C4.t
530 test-push-checkheads-partial-C4.t
530 test-push-checkheads-pruned-B1.t
531 test-push-checkheads-pruned-B1.t
531 test-push-checkheads-pruned-B2.t
532 test-push-checkheads-pruned-B2.t
532 test-push-checkheads-pruned-B3.t
533 test-push-checkheads-pruned-B3.t
533 test-push-checkheads-pruned-B4.t
534 test-push-checkheads-pruned-B4.t
534 test-push-checkheads-pruned-B5.t
535 test-push-checkheads-pruned-B5.t
535 test-push-checkheads-pruned-B6.t
536 test-push-checkheads-pruned-B6.t
536 test-push-checkheads-pruned-B7.t
537 test-push-checkheads-pruned-B7.t
537 test-push-checkheads-pruned-B8.t
538 test-push-checkheads-pruned-B8.t
538 test-push-checkheads-superceed-A1.t
539 test-push-checkheads-superceed-A1.t
539 test-push-checkheads-superceed-A2.t
540 test-push-checkheads-superceed-A2.t
540 test-push-checkheads-superceed-A3.t
541 test-push-checkheads-superceed-A3.t
541 test-push-checkheads-superceed-A4.t
542 test-push-checkheads-superceed-A4.t
542 test-push-checkheads-superceed-A5.t
543 test-push-checkheads-superceed-A5.t
543 test-push-checkheads-superceed-A6.t
544 test-push-checkheads-superceed-A6.t
544 test-push-checkheads-superceed-A7.t
545 test-push-checkheads-superceed-A7.t
545 test-push-checkheads-superceed-A8.t
546 test-push-checkheads-superceed-A8.t
546 test-push-checkheads-unpushed-D1.t
547 test-push-checkheads-unpushed-D1.t
547 test-push-checkheads-unpushed-D2.t
548 test-push-checkheads-unpushed-D2.t
548 test-push-checkheads-unpushed-D3.t
549 test-push-checkheads-unpushed-D3.t
549 test-push-checkheads-unpushed-D4.t
550 test-push-checkheads-unpushed-D4.t
550 test-push-checkheads-unpushed-D5.t
551 test-push-checkheads-unpushed-D5.t
551 test-push-checkheads-unpushed-D6.t
552 test-push-checkheads-unpushed-D6.t
552 test-push-checkheads-unpushed-D7.t
553 test-push-checkheads-unpushed-D7.t
553 test-push-http.t
554 test-push-http.t
554 test-push-race.t
555 test-push-race.t
555 test-push-warn.t
556 test-push-warn.t
556 test-push.t
557 test-push.t
557 test-pushvars.t
558 test-pushvars.t
558 test-qrecord.t
559 test-qrecord.t
559 test-rebase-abort.t
560 test-rebase-abort.t
560 test-rebase-backup.t
561 test-rebase-backup.t
561 test-rebase-base-flag.t
562 test-rebase-base-flag.t
562 test-rebase-bookmarks.t
563 test-rebase-bookmarks.t
563 test-rebase-brute-force.t
564 test-rebase-brute-force.t
564 test-rebase-cache.t
565 test-rebase-cache.t
565 test-rebase-check-restore.t
566 test-rebase-check-restore.t
566 test-rebase-collapse.t
567 test-rebase-collapse.t
567 test-rebase-conflicts.t
568 test-rebase-conflicts.t
568 test-rebase-dest.t
569 test-rebase-dest.t
569 test-rebase-detach.t
570 test-rebase-detach.t
570 test-rebase-emptycommit.t
571 test-rebase-emptycommit.t
571 test-rebase-inmemory.t
572 test-rebase-inmemory.t
572 test-rebase-interruptions.t
573 test-rebase-interruptions.t
573 test-rebase-issue-noparam-single-rev.t
574 test-rebase-issue-noparam-single-rev.t
574 test-rebase-legacy.t
575 test-rebase-legacy.t
575 test-rebase-mq-skip.t
576 test-rebase-mq-skip.t
576 test-rebase-mq.t
577 test-rebase-mq.t
577 test-rebase-named-branches.t
578 test-rebase-named-branches.t
578 test-rebase-newancestor.t
579 test-rebase-newancestor.t
579 test-rebase-obsolete.t
580 test-rebase-obsolete.t
580 test-rebase-parameters.t
581 test-rebase-parameters.t
581 test-rebase-partial.t
582 test-rebase-partial.t
582 test-rebase-pull.t
583 test-rebase-pull.t
583 test-rebase-rename.t
584 test-rebase-rename.t
584 test-rebase-scenario-global.t
585 test-rebase-scenario-global.t
585 test-rebase-templates.t
586 test-rebase-templates.t
586 test-rebase-transaction.t
587 test-rebase-transaction.t
587 test-rebuildstate.t
588 test-rebuildstate.t
588 test-record.t
589 test-record.t
589 test-releasenotes-formatting.t
590 test-releasenotes-formatting.t
590 test-releasenotes-merging.t
591 test-releasenotes-merging.t
591 test-releasenotes-parsing.t
592 test-releasenotes-parsing.t
592 test-relink.t
593 test-relink.t
593 test-remotefilelog-bad-configs.t
594 test-remotefilelog-bad-configs.t
594 test-remotefilelog-bgprefetch.t
595 test-remotefilelog-bgprefetch.t
595 test-remotefilelog-blame.t
596 test-remotefilelog-blame.t
596 test-remotefilelog-bundle2.t
597 test-remotefilelog-bundle2.t
597 test-remotefilelog-bundles.t
598 test-remotefilelog-bundles.t
598 test-remotefilelog-cacheprocess.t
599 test-remotefilelog-cacheprocess.t
599 test-remotefilelog-clone-tree.t
600 test-remotefilelog-clone-tree.t
600 test-remotefilelog-clone.t
601 test-remotefilelog-clone.t
601 test-remotefilelog-corrupt-cache.t
602 test-remotefilelog-corrupt-cache.t
602 test-remotefilelog-datapack.py
603 test-remotefilelog-datapack.py
603 test-remotefilelog-gc.t
604 test-remotefilelog-gc.t
604 test-remotefilelog-gcrepack.t
605 test-remotefilelog-gcrepack.t
605 test-remotefilelog-histpack.py
606 test-remotefilelog-histpack.py
606 test-remotefilelog-http.t
607 test-remotefilelog-http.t
607 test-remotefilelog-keepset.t
608 test-remotefilelog-keepset.t
608 test-remotefilelog-local.t
609 test-remotefilelog-local.t
609 test-remotefilelog-log.t
610 test-remotefilelog-log.t
610 test-remotefilelog-partial-shallow.t
611 test-remotefilelog-partial-shallow.t
611 test-remotefilelog-permissions.t
612 test-remotefilelog-permissions.t
612 test-remotefilelog-permisssions.t
613 test-remotefilelog-permisssions.t
613 test-remotefilelog-prefetch.t
614 test-remotefilelog-prefetch.t
614 test-remotefilelog-pull-noshallow.t
615 test-remotefilelog-pull-noshallow.t
615 test-remotefilelog-repack-fast.t
616 test-remotefilelog-repack-fast.t
616 test-remotefilelog-repack.t
617 test-remotefilelog-repack.t
617 test-remotefilelog-share.t
618 test-remotefilelog-share.t
618 test-remotefilelog-sparse.t
619 test-remotefilelog-sparse.t
619 test-remotefilelog-tags.t
620 test-remotefilelog-tags.t
620 test-remotefilelog-wireproto.t
621 test-remotefilelog-wireproto.t
621 test-remove.t
622 test-remove.t
622 test-removeemptydirs.t
623 test-removeemptydirs.t
623 test-rename-after-merge.t
624 test-rename-after-merge.t
624 test-rename-dir-merge.t
625 test-rename-dir-merge.t
625 test-rename-merge1.t
626 test-rename-merge1.t
626 test-rename-merge2.t
627 test-rename-merge2.t
627 test-rename.t
628 test-rename.t
628 test-repair-strip.t
629 test-repair-strip.t
629 test-repo-compengines.t
630 test-repo-compengines.t
630 test-requires.t
631 test-requires.t
631 test-resolve.t
632 test-resolve.t
632 test-revert-flags.t
633 test-revert-flags.t
633 test-revert-interactive.t
634 test-revert-interactive.t
634 test-revert-unknown.t
635 test-revert-unknown.t
635 test-revert.t
636 test-revert.t
636 test-revisions.t
637 test-revisions.t
637 test-revlog-ancestry.py
638 test-revlog-ancestry.py
638 test-revlog-group-emptyiter.t
639 test-revlog-group-emptyiter.t
639 test-revlog-mmapindex.t
640 test-revlog-mmapindex.t
640 test-revlog-packentry.t
641 test-revlog-packentry.t
641 test-revlog-raw.py
642 test-revlog-raw.py
642 test-revlog-v2.t
643 test-revlog-v2.t
643 test-revlog.t
644 test-revlog.t
644 test-revset-dirstate-parents.t
645 test-revset-dirstate-parents.t
645 test-revset-legacy-lookup.t
646 test-revset-legacy-lookup.t
646 test-revset-outgoing.t
647 test-revset-outgoing.t
647 test-revset2.t
648 test-revset2.t
648 test-rollback.t
649 test-rollback.t
649 test-run-tests.py
650 test-run-tests.py
650 test-run-tests.t
651 test-run-tests.t
651 test-rust-ancestor.py
652 test-rust-ancestor.py
652 test-schemes.t
653 test-schemes.t
653 test-serve.t
654 test-serve.t
654 test-setdiscovery.t
655 test-setdiscovery.t
655 test-share.t
656 test-share.t
656 test-shelve.t
657 test-shelve.t
657 test-shelve2.t
658 test-shelve2.t
658 test-show-stack.t
659 test-show-stack.t
659 test-show-work.t
660 test-show-work.t
660 test-show.t
661 test-show.t
661 test-simple-update.t
662 test-simple-update.t
662 test-simplekeyvaluefile.py
663 test-simplekeyvaluefile.py
663 test-simplemerge.py
664 test-simplemerge.py
664 test-single-head.t
665 test-single-head.t
665 test-sparse-clear.t
666 test-sparse-clear.t
666 test-sparse-clone.t
667 test-sparse-clone.t
667 test-sparse-import.t
668 test-sparse-import.t
668 test-sparse-merges.t
669 test-sparse-merges.t
669 test-sparse-profiles.t
670 test-sparse-profiles.t
670 test-sparse-requirement.t
671 test-sparse-requirement.t
671 test-sparse-verbose-json.t
672 test-sparse-verbose-json.t
672 test-sparse.t
673 test-sparse.t
673 test-split.t
674 test-split.t
674 test-ssh-bundle1.t
675 test-ssh-bundle1.t
675 test-ssh-clone-r.t
676 test-ssh-clone-r.t
676 test-ssh-proto-unbundle.t
677 test-ssh-proto-unbundle.t
677 test-ssh-proto.t
678 test-ssh-proto.t
678 test-ssh-repoerror.t
679 test-ssh-repoerror.t
679 test-ssh.t
680 test-ssh.t
680 test-sshserver.py
681 test-sshserver.py
681 test-stack.t
682 test-stack.t
682 test-static-http.t
683 test-static-http.t
683 test-status-color.t
684 test-status-color.t
684 test-status-inprocess.py
685 test-status-inprocess.py
685 test-status-rev.t
686 test-status-rev.t
686 test-status-terse.t
687 test-status-terse.t
687 test-status.t
688 test-status.t
688 test-storage.py
689 test-storage.py
689 test-stream-bundle-v2.t
690 test-stream-bundle-v2.t
690 test-strict.t
691 test-strict.t
691 test-strip-cross.t
692 test-strip-cross.t
692 test-strip.t
693 test-strip.t
693 test-subrepo-deep-nested-change.t
694 test-subrepo-deep-nested-change.t
694 test-subrepo-git.t
695 test-subrepo-git.t
695 test-subrepo-missing.t
696 test-subrepo-missing.t
696 test-subrepo-paths.t
697 test-subrepo-paths.t
697 test-subrepo-recursion.t
698 test-subrepo-recursion.t
698 test-subrepo-relative-path.t
699 test-subrepo-relative-path.t
699 test-subrepo-svn.t
700 test-subrepo-svn.t
700 test-subrepo.t
701 test-subrepo.t
701 test-symlink-os-yes-fs-no.py
702 test-symlink-os-yes-fs-no.py
702 test-symlink-placeholder.t
703 test-symlink-placeholder.t
703 test-symlinks.t
704 test-symlinks.t
704 test-tag.t
705 test-tag.t
705 test-tags.t
706 test-tags.t
706 test-template-basic.t
707 test-template-basic.t
707 test-template-functions.t
708 test-template-functions.t
708 test-template-keywords.t
709 test-template-keywords.t
709 test-template-map.t
710 test-template-map.t
710 test-tools.t
711 test-tools.t
711 test-transplant.t
712 test-transplant.t
712 test-treediscovery-legacy.t
713 test-treediscovery-legacy.t
713 test-treediscovery.t
714 test-treediscovery.t
714 test-treemanifest.t
715 test-treemanifest.t
715 test-trusted.py
716 test-trusted.py
716 test-ui-color.py
717 test-ui-color.py
717 test-ui-config.py
718 test-ui-config.py
718 test-ui-verbosity.py
719 test-ui-verbosity.py
719 test-unamend.t
720 test-unamend.t
720 test-unbundlehash.t
721 test-unbundlehash.t
721 test-uncommit.t
722 test-uncommit.t
722 test-unified-test.t
723 test-unified-test.t
723 test-unionrepo.t
724 test-unionrepo.t
724 test-unrelated-pull.t
725 test-unrelated-pull.t
725 test-up-local-change.t
726 test-up-local-change.t
726 test-update-atomic.t
727 test-update-atomic.t
727 test-update-branches.t
728 test-update-branches.t
728 test-update-dest.t
729 test-update-dest.t
729 test-update-issue1456.t
730 test-update-issue1456.t
730 test-update-names.t
731 test-update-names.t
731 test-update-reverse.t
732 test-update-reverse.t
732 test-upgrade-repo.t
733 test-upgrade-repo.t
733 test-url-download.t
734 test-url-download.t
734 test-url-rev.t
735 test-url-rev.t
735 test-url.py
736 test-url.py
736 test-username-newline.t
737 test-username-newline.t
737 test-util.py
738 test-util.py
738 test-verify.t
739 test-verify.t
739 test-walk.t
740 test-walk.t
740 test-walkrepo.py
741 test-walkrepo.py
741 test-websub.t
742 test-websub.t
742 test-win32text.t
743 test-win32text.t
743 test-wireproto-caching.t
744 test-wireproto-caching.t
744 test-wireproto-clientreactor.py
745 test-wireproto-clientreactor.py
745 test-wireproto-command-branchmap.t
746 test-wireproto-command-branchmap.t
746 test-wireproto-command-capabilities.t
747 test-wireproto-command-capabilities.t
747 test-wireproto-command-changesetdata.t
748 test-wireproto-command-changesetdata.t
748 test-wireproto-command-filedata.t
749 test-wireproto-command-filedata.t
749 test-wireproto-command-filesdata.t
750 test-wireproto-command-filesdata.t
750 test-wireproto-command-heads.t
751 test-wireproto-command-heads.t
751 test-wireproto-command-known.t
752 test-wireproto-command-known.t
752 test-wireproto-command-listkeys.t
753 test-wireproto-command-listkeys.t
753 test-wireproto-command-lookup.t
754 test-wireproto-command-lookup.t
754 test-wireproto-command-manifestdata.t
755 test-wireproto-command-manifestdata.t
755 test-wireproto-command-pushkey.t
756 test-wireproto-command-pushkey.t
756 test-wireproto-command-rawstorefiledata.t
757 test-wireproto-command-rawstorefiledata.t
757 test-wireproto-content-redirects.t
758 test-wireproto-content-redirects.t
758 test-wireproto-exchangev2.t
759 test-wireproto-exchangev2.t
759 test-wireproto-framing.py
760 test-wireproto-framing.py
760 test-wireproto-serverreactor.py
761 test-wireproto-serverreactor.py
761 test-wireproto.py
762 test-wireproto.py
762 test-wireproto.t
763 test-wireproto.t
763 test-worker.t
764 test-worker.t
764 test-wsgirequest.py
765 test-wsgirequest.py
765 test-xdg.t
766 test-xdg.t
@@ -1,555 +1,558 b''
1 # changelog.py - changelog class for mercurial
1 # changelog.py - changelog class for mercurial
2 #
2 #
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 from .i18n import _
10 from .i18n import _
11 from .node import (
11 from .node import (
12 bin,
12 bin,
13 hex,
13 hex,
14 nullid,
14 nullid,
15 )
15 )
16 from .thirdparty import (
16 from .thirdparty import (
17 attr,
17 attr,
18 )
18 )
19
19
20 from . import (
20 from . import (
21 encoding,
21 encoding,
22 error,
22 error,
23 pycompat,
23 pycompat,
24 revlog,
24 revlog,
25 )
25 )
26 from .utils import (
26 from .utils import (
27 dateutil,
27 dateutil,
28 stringutil,
28 stringutil,
29 )
29 )
30
30
31 _defaultextra = {'branch': 'default'}
31 _defaultextra = {'branch': 'default'}
32
32
33 def _string_escape(text):
33 def _string_escape(text):
34 """
34 """
35 >>> from .pycompat import bytechr as chr
35 >>> from .pycompat import bytechr as chr
36 >>> d = {b'nl': chr(10), b'bs': chr(92), b'cr': chr(13), b'nul': chr(0)}
36 >>> d = {b'nl': chr(10), b'bs': chr(92), b'cr': chr(13), b'nul': chr(0)}
37 >>> s = b"ab%(nl)scd%(bs)s%(bs)sn%(nul)sab%(cr)scd%(bs)s%(nl)s" % d
37 >>> s = b"ab%(nl)scd%(bs)s%(bs)sn%(nul)sab%(cr)scd%(bs)s%(nl)s" % d
38 >>> s
38 >>> s
39 'ab\\ncd\\\\\\\\n\\x00ab\\rcd\\\\\\n'
39 'ab\\ncd\\\\\\\\n\\x00ab\\rcd\\\\\\n'
40 >>> res = _string_escape(s)
40 >>> res = _string_escape(s)
41 >>> s == stringutil.unescapestr(res)
41 >>> s == stringutil.unescapestr(res)
42 True
42 True
43 """
43 """
44 # subset of the string_escape codec
44 # subset of the string_escape codec
45 text = text.replace('\\', '\\\\').replace('\n', '\\n').replace('\r', '\\r')
45 text = text.replace('\\', '\\\\').replace('\n', '\\n').replace('\r', '\\r')
46 return text.replace('\0', '\\0')
46 return text.replace('\0', '\\0')
47
47
48 def decodeextra(text):
48 def decodeextra(text):
49 """
49 """
50 >>> from .pycompat import bytechr as chr
50 >>> from .pycompat import bytechr as chr
51 >>> sorted(decodeextra(encodeextra({b'foo': b'bar', b'baz': chr(0) + b'2'})
51 >>> sorted(decodeextra(encodeextra({b'foo': b'bar', b'baz': chr(0) + b'2'})
52 ... ).items())
52 ... ).items())
53 [('baz', '\\x002'), ('branch', 'default'), ('foo', 'bar')]
53 [('baz', '\\x002'), ('branch', 'default'), ('foo', 'bar')]
54 >>> sorted(decodeextra(encodeextra({b'foo': b'bar',
54 >>> sorted(decodeextra(encodeextra({b'foo': b'bar',
55 ... b'baz': chr(92) + chr(0) + b'2'})
55 ... b'baz': chr(92) + chr(0) + b'2'})
56 ... ).items())
56 ... ).items())
57 [('baz', '\\\\\\x002'), ('branch', 'default'), ('foo', 'bar')]
57 [('baz', '\\\\\\x002'), ('branch', 'default'), ('foo', 'bar')]
58 """
58 """
59 extra = _defaultextra.copy()
59 extra = _defaultextra.copy()
60 for l in text.split('\0'):
60 for l in text.split('\0'):
61 if l:
61 if l:
62 if '\\0' in l:
62 if '\\0' in l:
63 # fix up \0 without getting into trouble with \\0
63 # fix up \0 without getting into trouble with \\0
64 l = l.replace('\\\\', '\\\\\n')
64 l = l.replace('\\\\', '\\\\\n')
65 l = l.replace('\\0', '\0')
65 l = l.replace('\\0', '\0')
66 l = l.replace('\n', '')
66 l = l.replace('\n', '')
67 k, v = stringutil.unescapestr(l).split(':', 1)
67 k, v = stringutil.unescapestr(l).split(':', 1)
68 extra[k] = v
68 extra[k] = v
69 return extra
69 return extra
70
70
71 def encodeextra(d):
71 def encodeextra(d):
72 # keys must be sorted to produce a deterministic changelog entry
72 # keys must be sorted to produce a deterministic changelog entry
73 items = [_string_escape('%s:%s' % (k, d[k])) for k in sorted(d)]
73 items = [
74 _string_escape('%s:%s' % (k, pycompat.bytestr(d[k])))
75 for k in sorted(d)
76 ]
74 return "\0".join(items)
77 return "\0".join(items)
75
78
76 def stripdesc(desc):
79 def stripdesc(desc):
77 """strip trailing whitespace and leading and trailing empty lines"""
80 """strip trailing whitespace and leading and trailing empty lines"""
78 return '\n'.join([l.rstrip() for l in desc.splitlines()]).strip('\n')
81 return '\n'.join([l.rstrip() for l in desc.splitlines()]).strip('\n')
79
82
80 class appender(object):
83 class appender(object):
81 '''the changelog index must be updated last on disk, so we use this class
84 '''the changelog index must be updated last on disk, so we use this class
82 to delay writes to it'''
85 to delay writes to it'''
83 def __init__(self, vfs, name, mode, buf):
86 def __init__(self, vfs, name, mode, buf):
84 self.data = buf
87 self.data = buf
85 fp = vfs(name, mode)
88 fp = vfs(name, mode)
86 self.fp = fp
89 self.fp = fp
87 self.offset = fp.tell()
90 self.offset = fp.tell()
88 self.size = vfs.fstat(fp).st_size
91 self.size = vfs.fstat(fp).st_size
89 self._end = self.size
92 self._end = self.size
90
93
91 def end(self):
94 def end(self):
92 return self._end
95 return self._end
93 def tell(self):
96 def tell(self):
94 return self.offset
97 return self.offset
95 def flush(self):
98 def flush(self):
96 pass
99 pass
97
100
98 @property
101 @property
99 def closed(self):
102 def closed(self):
100 return self.fp.closed
103 return self.fp.closed
101
104
102 def close(self):
105 def close(self):
103 self.fp.close()
106 self.fp.close()
104
107
105 def seek(self, offset, whence=0):
108 def seek(self, offset, whence=0):
106 '''virtual file offset spans real file and data'''
109 '''virtual file offset spans real file and data'''
107 if whence == 0:
110 if whence == 0:
108 self.offset = offset
111 self.offset = offset
109 elif whence == 1:
112 elif whence == 1:
110 self.offset += offset
113 self.offset += offset
111 elif whence == 2:
114 elif whence == 2:
112 self.offset = self.end() + offset
115 self.offset = self.end() + offset
113 if self.offset < self.size:
116 if self.offset < self.size:
114 self.fp.seek(self.offset)
117 self.fp.seek(self.offset)
115
118
116 def read(self, count=-1):
119 def read(self, count=-1):
117 '''only trick here is reads that span real file and data'''
120 '''only trick here is reads that span real file and data'''
118 ret = ""
121 ret = ""
119 if self.offset < self.size:
122 if self.offset < self.size:
120 s = self.fp.read(count)
123 s = self.fp.read(count)
121 ret = s
124 ret = s
122 self.offset += len(s)
125 self.offset += len(s)
123 if count > 0:
126 if count > 0:
124 count -= len(s)
127 count -= len(s)
125 if count != 0:
128 if count != 0:
126 doff = self.offset - self.size
129 doff = self.offset - self.size
127 self.data.insert(0, "".join(self.data))
130 self.data.insert(0, "".join(self.data))
128 del self.data[1:]
131 del self.data[1:]
129 s = self.data[0][doff:doff + count]
132 s = self.data[0][doff:doff + count]
130 self.offset += len(s)
133 self.offset += len(s)
131 ret += s
134 ret += s
132 return ret
135 return ret
133
136
134 def write(self, s):
137 def write(self, s):
135 self.data.append(bytes(s))
138 self.data.append(bytes(s))
136 self.offset += len(s)
139 self.offset += len(s)
137 self._end += len(s)
140 self._end += len(s)
138
141
139 def __enter__(self):
142 def __enter__(self):
140 self.fp.__enter__()
143 self.fp.__enter__()
141 return self
144 return self
142
145
143 def __exit__(self, *args):
146 def __exit__(self, *args):
144 return self.fp.__exit__(*args)
147 return self.fp.__exit__(*args)
145
148
146 def _divertopener(opener, target):
149 def _divertopener(opener, target):
147 """build an opener that writes in 'target.a' instead of 'target'"""
150 """build an opener that writes in 'target.a' instead of 'target'"""
148 def _divert(name, mode='r', checkambig=False):
151 def _divert(name, mode='r', checkambig=False):
149 if name != target:
152 if name != target:
150 return opener(name, mode)
153 return opener(name, mode)
151 return opener(name + ".a", mode)
154 return opener(name + ".a", mode)
152 return _divert
155 return _divert
153
156
154 def _delayopener(opener, target, buf):
157 def _delayopener(opener, target, buf):
155 """build an opener that stores chunks in 'buf' instead of 'target'"""
158 """build an opener that stores chunks in 'buf' instead of 'target'"""
156 def _delay(name, mode='r', checkambig=False):
159 def _delay(name, mode='r', checkambig=False):
157 if name != target:
160 if name != target:
158 return opener(name, mode)
161 return opener(name, mode)
159 return appender(opener, name, mode, buf)
162 return appender(opener, name, mode, buf)
160 return _delay
163 return _delay
161
164
162 @attr.s
165 @attr.s
163 class _changelogrevision(object):
166 class _changelogrevision(object):
164 # Extensions might modify _defaultextra, so let the constructor below pass
167 # Extensions might modify _defaultextra, so let the constructor below pass
165 # it in
168 # it in
166 extra = attr.ib()
169 extra = attr.ib()
167 manifest = attr.ib(default=nullid)
170 manifest = attr.ib(default=nullid)
168 user = attr.ib(default='')
171 user = attr.ib(default='')
169 date = attr.ib(default=(0, 0))
172 date = attr.ib(default=(0, 0))
170 files = attr.ib(default=attr.Factory(list))
173 files = attr.ib(default=attr.Factory(list))
171 description = attr.ib(default='')
174 description = attr.ib(default='')
172
175
173 class changelogrevision(object):
176 class changelogrevision(object):
174 """Holds results of a parsed changelog revision.
177 """Holds results of a parsed changelog revision.
175
178
176 Changelog revisions consist of multiple pieces of data, including
179 Changelog revisions consist of multiple pieces of data, including
177 the manifest node, user, and date. This object exposes a view into
180 the manifest node, user, and date. This object exposes a view into
178 the parsed object.
181 the parsed object.
179 """
182 """
180
183
181 __slots__ = (
184 __slots__ = (
182 u'_offsets',
185 u'_offsets',
183 u'_text',
186 u'_text',
184 )
187 )
185
188
186 def __new__(cls, text):
189 def __new__(cls, text):
187 if not text:
190 if not text:
188 return _changelogrevision(extra=_defaultextra)
191 return _changelogrevision(extra=_defaultextra)
189
192
190 self = super(changelogrevision, cls).__new__(cls)
193 self = super(changelogrevision, cls).__new__(cls)
191 # We could return here and implement the following as an __init__.
194 # We could return here and implement the following as an __init__.
192 # But doing it here is equivalent and saves an extra function call.
195 # But doing it here is equivalent and saves an extra function call.
193
196
194 # format used:
197 # format used:
195 # nodeid\n : manifest node in ascii
198 # nodeid\n : manifest node in ascii
196 # user\n : user, no \n or \r allowed
199 # user\n : user, no \n or \r allowed
197 # time tz extra\n : date (time is int or float, timezone is int)
200 # time tz extra\n : date (time is int or float, timezone is int)
198 # : extra is metadata, encoded and separated by '\0'
201 # : extra is metadata, encoded and separated by '\0'
199 # : older versions ignore it
202 # : older versions ignore it
200 # files\n\n : files modified by the cset, no \n or \r allowed
203 # files\n\n : files modified by the cset, no \n or \r allowed
201 # (.*) : comment (free text, ideally utf-8)
204 # (.*) : comment (free text, ideally utf-8)
202 #
205 #
203 # changelog v0 doesn't use extra
206 # changelog v0 doesn't use extra
204
207
205 nl1 = text.index('\n')
208 nl1 = text.index('\n')
206 nl2 = text.index('\n', nl1 + 1)
209 nl2 = text.index('\n', nl1 + 1)
207 nl3 = text.index('\n', nl2 + 1)
210 nl3 = text.index('\n', nl2 + 1)
208
211
209 # The list of files may be empty. Which means nl3 is the first of the
212 # The list of files may be empty. Which means nl3 is the first of the
210 # double newline that precedes the description.
213 # double newline that precedes the description.
211 if text[nl3 + 1:nl3 + 2] == '\n':
214 if text[nl3 + 1:nl3 + 2] == '\n':
212 doublenl = nl3
215 doublenl = nl3
213 else:
216 else:
214 doublenl = text.index('\n\n', nl3 + 1)
217 doublenl = text.index('\n\n', nl3 + 1)
215
218
216 self._offsets = (nl1, nl2, nl3, doublenl)
219 self._offsets = (nl1, nl2, nl3, doublenl)
217 self._text = text
220 self._text = text
218
221
219 return self
222 return self
220
223
221 @property
224 @property
222 def manifest(self):
225 def manifest(self):
223 return bin(self._text[0:self._offsets[0]])
226 return bin(self._text[0:self._offsets[0]])
224
227
225 @property
228 @property
226 def user(self):
229 def user(self):
227 off = self._offsets
230 off = self._offsets
228 return encoding.tolocal(self._text[off[0] + 1:off[1]])
231 return encoding.tolocal(self._text[off[0] + 1:off[1]])
229
232
230 @property
233 @property
231 def _rawdate(self):
234 def _rawdate(self):
232 off = self._offsets
235 off = self._offsets
233 dateextra = self._text[off[1] + 1:off[2]]
236 dateextra = self._text[off[1] + 1:off[2]]
234 return dateextra.split(' ', 2)[0:2]
237 return dateextra.split(' ', 2)[0:2]
235
238
236 @property
239 @property
237 def _rawextra(self):
240 def _rawextra(self):
238 off = self._offsets
241 off = self._offsets
239 dateextra = self._text[off[1] + 1:off[2]]
242 dateextra = self._text[off[1] + 1:off[2]]
240 fields = dateextra.split(' ', 2)
243 fields = dateextra.split(' ', 2)
241 if len(fields) != 3:
244 if len(fields) != 3:
242 return None
245 return None
243
246
244 return fields[2]
247 return fields[2]
245
248
246 @property
249 @property
247 def date(self):
250 def date(self):
248 raw = self._rawdate
251 raw = self._rawdate
249 time = float(raw[0])
252 time = float(raw[0])
250 # Various tools did silly things with the timezone.
253 # Various tools did silly things with the timezone.
251 try:
254 try:
252 timezone = int(raw[1])
255 timezone = int(raw[1])
253 except ValueError:
256 except ValueError:
254 timezone = 0
257 timezone = 0
255
258
256 return time, timezone
259 return time, timezone
257
260
258 @property
261 @property
259 def extra(self):
262 def extra(self):
260 raw = self._rawextra
263 raw = self._rawextra
261 if raw is None:
264 if raw is None:
262 return _defaultextra
265 return _defaultextra
263
266
264 return decodeextra(raw)
267 return decodeextra(raw)
265
268
266 @property
269 @property
267 def files(self):
270 def files(self):
268 off = self._offsets
271 off = self._offsets
269 if off[2] == off[3]:
272 if off[2] == off[3]:
270 return []
273 return []
271
274
272 return self._text[off[2] + 1:off[3]].split('\n')
275 return self._text[off[2] + 1:off[3]].split('\n')
273
276
274 @property
277 @property
275 def description(self):
278 def description(self):
276 return encoding.tolocal(self._text[self._offsets[3] + 2:])
279 return encoding.tolocal(self._text[self._offsets[3] + 2:])
277
280
278 class changelog(revlog.revlog):
281 class changelog(revlog.revlog):
279 def __init__(self, opener, trypending=False):
282 def __init__(self, opener, trypending=False):
280 """Load a changelog revlog using an opener.
283 """Load a changelog revlog using an opener.
281
284
282 If ``trypending`` is true, we attempt to load the index from a
285 If ``trypending`` is true, we attempt to load the index from a
283 ``00changelog.i.a`` file instead of the default ``00changelog.i``.
286 ``00changelog.i.a`` file instead of the default ``00changelog.i``.
284 The ``00changelog.i.a`` file contains index (and possibly inline
287 The ``00changelog.i.a`` file contains index (and possibly inline
285 revision) data for a transaction that hasn't been finalized yet.
288 revision) data for a transaction that hasn't been finalized yet.
286 It exists in a separate file to facilitate readers (such as
289 It exists in a separate file to facilitate readers (such as
287 hooks processes) accessing data before a transaction is finalized.
290 hooks processes) accessing data before a transaction is finalized.
288 """
291 """
289 if trypending and opener.exists('00changelog.i.a'):
292 if trypending and opener.exists('00changelog.i.a'):
290 indexfile = '00changelog.i.a'
293 indexfile = '00changelog.i.a'
291 else:
294 else:
292 indexfile = '00changelog.i'
295 indexfile = '00changelog.i'
293
296
294 datafile = '00changelog.d'
297 datafile = '00changelog.d'
295 revlog.revlog.__init__(self, opener, indexfile, datafile=datafile,
298 revlog.revlog.__init__(self, opener, indexfile, datafile=datafile,
296 checkambig=True, mmaplargeindex=True)
299 checkambig=True, mmaplargeindex=True)
297
300
298 if self._initempty and (self.version & 0xFFFF == revlog.REVLOGV1):
301 if self._initempty and (self.version & 0xFFFF == revlog.REVLOGV1):
299 # changelogs don't benefit from generaldelta.
302 # changelogs don't benefit from generaldelta.
300
303
301 self.version &= ~revlog.FLAG_GENERALDELTA
304 self.version &= ~revlog.FLAG_GENERALDELTA
302 self._generaldelta = False
305 self._generaldelta = False
303
306
304 # Delta chains for changelogs tend to be very small because entries
307 # Delta chains for changelogs tend to be very small because entries
305 # tend to be small and don't delta well with each. So disable delta
308 # tend to be small and don't delta well with each. So disable delta
306 # chains.
309 # chains.
307 self._storedeltachains = False
310 self._storedeltachains = False
308
311
309 self._realopener = opener
312 self._realopener = opener
310 self._delayed = False
313 self._delayed = False
311 self._delaybuf = None
314 self._delaybuf = None
312 self._divert = False
315 self._divert = False
313 self.filteredrevs = frozenset()
316 self.filteredrevs = frozenset()
314
317
315 def tiprev(self):
318 def tiprev(self):
316 for i in pycompat.xrange(len(self) -1, -2, -1):
319 for i in pycompat.xrange(len(self) -1, -2, -1):
317 if i not in self.filteredrevs:
320 if i not in self.filteredrevs:
318 return i
321 return i
319
322
320 def tip(self):
323 def tip(self):
321 """filtered version of revlog.tip"""
324 """filtered version of revlog.tip"""
322 return self.node(self.tiprev())
325 return self.node(self.tiprev())
323
326
324 def __contains__(self, rev):
327 def __contains__(self, rev):
325 """filtered version of revlog.__contains__"""
328 """filtered version of revlog.__contains__"""
326 return (0 <= rev < len(self)
329 return (0 <= rev < len(self)
327 and rev not in self.filteredrevs)
330 and rev not in self.filteredrevs)
328
331
329 def __iter__(self):
332 def __iter__(self):
330 """filtered version of revlog.__iter__"""
333 """filtered version of revlog.__iter__"""
331 if len(self.filteredrevs) == 0:
334 if len(self.filteredrevs) == 0:
332 return revlog.revlog.__iter__(self)
335 return revlog.revlog.__iter__(self)
333
336
334 def filterediter():
337 def filterediter():
335 for i in pycompat.xrange(len(self)):
338 for i in pycompat.xrange(len(self)):
336 if i not in self.filteredrevs:
339 if i not in self.filteredrevs:
337 yield i
340 yield i
338
341
339 return filterediter()
342 return filterediter()
340
343
341 def revs(self, start=0, stop=None):
344 def revs(self, start=0, stop=None):
342 """filtered version of revlog.revs"""
345 """filtered version of revlog.revs"""
343 for i in super(changelog, self).revs(start, stop):
346 for i in super(changelog, self).revs(start, stop):
344 if i not in self.filteredrevs:
347 if i not in self.filteredrevs:
345 yield i
348 yield i
346
349
347 def reachableroots(self, minroot, heads, roots, includepath=False):
350 def reachableroots(self, minroot, heads, roots, includepath=False):
348 return self.index.reachableroots2(minroot, heads, roots, includepath)
351 return self.index.reachableroots2(minroot, heads, roots, includepath)
349
352
350 def headrevs(self, revs=None):
353 def headrevs(self, revs=None):
351 if revs is None and self.filteredrevs:
354 if revs is None and self.filteredrevs:
352 try:
355 try:
353 return self.index.headrevsfiltered(self.filteredrevs)
356 return self.index.headrevsfiltered(self.filteredrevs)
354 # AttributeError covers non-c-extension environments and
357 # AttributeError covers non-c-extension environments and
355 # old c extensions without filter handling.
358 # old c extensions without filter handling.
356 except AttributeError:
359 except AttributeError:
357 return self._headrevs()
360 return self._headrevs()
358
361
359 return super(changelog, self).headrevs(revs)
362 return super(changelog, self).headrevs(revs)
360
363
361 def strip(self, *args, **kwargs):
364 def strip(self, *args, **kwargs):
362 # XXX make something better than assert
365 # XXX make something better than assert
363 # We can't expect proper strip behavior if we are filtered.
366 # We can't expect proper strip behavior if we are filtered.
364 assert not self.filteredrevs
367 assert not self.filteredrevs
365 super(changelog, self).strip(*args, **kwargs)
368 super(changelog, self).strip(*args, **kwargs)
366
369
367 def rev(self, node):
370 def rev(self, node):
368 """filtered version of revlog.rev"""
371 """filtered version of revlog.rev"""
369 r = super(changelog, self).rev(node)
372 r = super(changelog, self).rev(node)
370 if r in self.filteredrevs:
373 if r in self.filteredrevs:
371 raise error.FilteredLookupError(hex(node), self.indexfile,
374 raise error.FilteredLookupError(hex(node), self.indexfile,
372 _('filtered node'))
375 _('filtered node'))
373 return r
376 return r
374
377
375 def node(self, rev):
378 def node(self, rev):
376 """filtered version of revlog.node"""
379 """filtered version of revlog.node"""
377 if rev in self.filteredrevs:
380 if rev in self.filteredrevs:
378 raise error.FilteredIndexError(rev)
381 raise error.FilteredIndexError(rev)
379 return super(changelog, self).node(rev)
382 return super(changelog, self).node(rev)
380
383
381 def linkrev(self, rev):
384 def linkrev(self, rev):
382 """filtered version of revlog.linkrev"""
385 """filtered version of revlog.linkrev"""
383 if rev in self.filteredrevs:
386 if rev in self.filteredrevs:
384 raise error.FilteredIndexError(rev)
387 raise error.FilteredIndexError(rev)
385 return super(changelog, self).linkrev(rev)
388 return super(changelog, self).linkrev(rev)
386
389
387 def parentrevs(self, rev):
390 def parentrevs(self, rev):
388 """filtered version of revlog.parentrevs"""
391 """filtered version of revlog.parentrevs"""
389 if rev in self.filteredrevs:
392 if rev in self.filteredrevs:
390 raise error.FilteredIndexError(rev)
393 raise error.FilteredIndexError(rev)
391 return super(changelog, self).parentrevs(rev)
394 return super(changelog, self).parentrevs(rev)
392
395
393 def flags(self, rev):
396 def flags(self, rev):
394 """filtered version of revlog.flags"""
397 """filtered version of revlog.flags"""
395 if rev in self.filteredrevs:
398 if rev in self.filteredrevs:
396 raise error.FilteredIndexError(rev)
399 raise error.FilteredIndexError(rev)
397 return super(changelog, self).flags(rev)
400 return super(changelog, self).flags(rev)
398
401
399 def delayupdate(self, tr):
402 def delayupdate(self, tr):
400 "delay visibility of index updates to other readers"
403 "delay visibility of index updates to other readers"
401
404
402 if not self._delayed:
405 if not self._delayed:
403 if len(self) == 0:
406 if len(self) == 0:
404 self._divert = True
407 self._divert = True
405 if self._realopener.exists(self.indexfile + '.a'):
408 if self._realopener.exists(self.indexfile + '.a'):
406 self._realopener.unlink(self.indexfile + '.a')
409 self._realopener.unlink(self.indexfile + '.a')
407 self.opener = _divertopener(self._realopener, self.indexfile)
410 self.opener = _divertopener(self._realopener, self.indexfile)
408 else:
411 else:
409 self._delaybuf = []
412 self._delaybuf = []
410 self.opener = _delayopener(self._realopener, self.indexfile,
413 self.opener = _delayopener(self._realopener, self.indexfile,
411 self._delaybuf)
414 self._delaybuf)
412 self._delayed = True
415 self._delayed = True
413 tr.addpending('cl-%i' % id(self), self._writepending)
416 tr.addpending('cl-%i' % id(self), self._writepending)
414 tr.addfinalize('cl-%i' % id(self), self._finalize)
417 tr.addfinalize('cl-%i' % id(self), self._finalize)
415
418
416 def _finalize(self, tr):
419 def _finalize(self, tr):
417 "finalize index updates"
420 "finalize index updates"
418 self._delayed = False
421 self._delayed = False
419 self.opener = self._realopener
422 self.opener = self._realopener
420 # move redirected index data back into place
423 # move redirected index data back into place
421 if self._divert:
424 if self._divert:
422 assert not self._delaybuf
425 assert not self._delaybuf
423 tmpname = self.indexfile + ".a"
426 tmpname = self.indexfile + ".a"
424 nfile = self.opener.open(tmpname)
427 nfile = self.opener.open(tmpname)
425 nfile.close()
428 nfile.close()
426 self.opener.rename(tmpname, self.indexfile, checkambig=True)
429 self.opener.rename(tmpname, self.indexfile, checkambig=True)
427 elif self._delaybuf:
430 elif self._delaybuf:
428 fp = self.opener(self.indexfile, 'a', checkambig=True)
431 fp = self.opener(self.indexfile, 'a', checkambig=True)
429 fp.write("".join(self._delaybuf))
432 fp.write("".join(self._delaybuf))
430 fp.close()
433 fp.close()
431 self._delaybuf = None
434 self._delaybuf = None
432 self._divert = False
435 self._divert = False
433 # split when we're done
436 # split when we're done
434 self._enforceinlinesize(tr)
437 self._enforceinlinesize(tr)
435
438
436 def _writepending(self, tr):
439 def _writepending(self, tr):
437 "create a file containing the unfinalized state for pretxnchangegroup"
440 "create a file containing the unfinalized state for pretxnchangegroup"
438 if self._delaybuf:
441 if self._delaybuf:
439 # make a temporary copy of the index
442 # make a temporary copy of the index
440 fp1 = self._realopener(self.indexfile)
443 fp1 = self._realopener(self.indexfile)
441 pendingfilename = self.indexfile + ".a"
444 pendingfilename = self.indexfile + ".a"
442 # register as a temp file to ensure cleanup on failure
445 # register as a temp file to ensure cleanup on failure
443 tr.registertmp(pendingfilename)
446 tr.registertmp(pendingfilename)
444 # write existing data
447 # write existing data
445 fp2 = self._realopener(pendingfilename, "w")
448 fp2 = self._realopener(pendingfilename, "w")
446 fp2.write(fp1.read())
449 fp2.write(fp1.read())
447 # add pending data
450 # add pending data
448 fp2.write("".join(self._delaybuf))
451 fp2.write("".join(self._delaybuf))
449 fp2.close()
452 fp2.close()
450 # switch modes so finalize can simply rename
453 # switch modes so finalize can simply rename
451 self._delaybuf = None
454 self._delaybuf = None
452 self._divert = True
455 self._divert = True
453 self.opener = _divertopener(self._realopener, self.indexfile)
456 self.opener = _divertopener(self._realopener, self.indexfile)
454
457
455 if self._divert:
458 if self._divert:
456 return True
459 return True
457
460
458 return False
461 return False
459
462
460 def _enforceinlinesize(self, tr, fp=None):
463 def _enforceinlinesize(self, tr, fp=None):
461 if not self._delayed:
464 if not self._delayed:
462 revlog.revlog._enforceinlinesize(self, tr, fp)
465 revlog.revlog._enforceinlinesize(self, tr, fp)
463
466
464 def read(self, node):
467 def read(self, node):
465 """Obtain data from a parsed changelog revision.
468 """Obtain data from a parsed changelog revision.
466
469
467 Returns a 6-tuple of:
470 Returns a 6-tuple of:
468
471
469 - manifest node in binary
472 - manifest node in binary
470 - author/user as a localstr
473 - author/user as a localstr
471 - date as a 2-tuple of (time, timezone)
474 - date as a 2-tuple of (time, timezone)
472 - list of files
475 - list of files
473 - commit message as a localstr
476 - commit message as a localstr
474 - dict of extra metadata
477 - dict of extra metadata
475
478
476 Unless you need to access all fields, consider calling
479 Unless you need to access all fields, consider calling
477 ``changelogrevision`` instead, as it is faster for partial object
480 ``changelogrevision`` instead, as it is faster for partial object
478 access.
481 access.
479 """
482 """
480 c = changelogrevision(self.revision(node))
483 c = changelogrevision(self.revision(node))
481 return (
484 return (
482 c.manifest,
485 c.manifest,
483 c.user,
486 c.user,
484 c.date,
487 c.date,
485 c.files,
488 c.files,
486 c.description,
489 c.description,
487 c.extra
490 c.extra
488 )
491 )
489
492
490 def changelogrevision(self, nodeorrev):
493 def changelogrevision(self, nodeorrev):
491 """Obtain a ``changelogrevision`` for a node or revision."""
494 """Obtain a ``changelogrevision`` for a node or revision."""
492 return changelogrevision(self.revision(nodeorrev))
495 return changelogrevision(self.revision(nodeorrev))
493
496
494 def readfiles(self, node):
497 def readfiles(self, node):
495 """
498 """
496 short version of read that only returns the files modified by the cset
499 short version of read that only returns the files modified by the cset
497 """
500 """
498 text = self.revision(node)
501 text = self.revision(node)
499 if not text:
502 if not text:
500 return []
503 return []
501 last = text.index("\n\n")
504 last = text.index("\n\n")
502 l = text[:last].split('\n')
505 l = text[:last].split('\n')
503 return l[3:]
506 return l[3:]
504
507
505 def add(self, manifest, files, desc, transaction, p1, p2,
508 def add(self, manifest, files, desc, transaction, p1, p2,
506 user, date=None, extra=None):
509 user, date=None, extra=None):
507 # Convert to UTF-8 encoded bytestrings as the very first
510 # Convert to UTF-8 encoded bytestrings as the very first
508 # thing: calling any method on a localstr object will turn it
511 # thing: calling any method on a localstr object will turn it
509 # into a str object and the cached UTF-8 string is thus lost.
512 # into a str object and the cached UTF-8 string is thus lost.
510 user, desc = encoding.fromlocal(user), encoding.fromlocal(desc)
513 user, desc = encoding.fromlocal(user), encoding.fromlocal(desc)
511
514
512 user = user.strip()
515 user = user.strip()
513 # An empty username or a username with a "\n" will make the
516 # An empty username or a username with a "\n" will make the
514 # revision text contain two "\n\n" sequences -> corrupt
517 # revision text contain two "\n\n" sequences -> corrupt
515 # repository since read cannot unpack the revision.
518 # repository since read cannot unpack the revision.
516 if not user:
519 if not user:
517 raise error.StorageError(_("empty username"))
520 raise error.StorageError(_("empty username"))
518 if "\n" in user:
521 if "\n" in user:
519 raise error.StorageError(_("username %r contains a newline")
522 raise error.StorageError(_("username %r contains a newline")
520 % pycompat.bytestr(user))
523 % pycompat.bytestr(user))
521
524
522 desc = stripdesc(desc)
525 desc = stripdesc(desc)
523
526
524 if date:
527 if date:
525 parseddate = "%d %d" % dateutil.parsedate(date)
528 parseddate = "%d %d" % dateutil.parsedate(date)
526 else:
529 else:
527 parseddate = "%d %d" % dateutil.makedate()
530 parseddate = "%d %d" % dateutil.makedate()
528 if extra:
531 if extra:
529 branch = extra.get("branch")
532 branch = extra.get("branch")
530 if branch in ("default", ""):
533 if branch in ("default", ""):
531 del extra["branch"]
534 del extra["branch"]
532 elif branch in (".", "null", "tip"):
535 elif branch in (".", "null", "tip"):
533 raise error.StorageError(_('the name \'%s\' is reserved')
536 raise error.StorageError(_('the name \'%s\' is reserved')
534 % branch)
537 % branch)
535 if extra:
538 if extra:
536 extra = encodeextra(extra)
539 extra = encodeextra(extra)
537 parseddate = "%s %s" % (parseddate, extra)
540 parseddate = "%s %s" % (parseddate, extra)
538 l = [hex(manifest), user, parseddate] + sorted(files) + ["", desc]
541 l = [hex(manifest), user, parseddate] + sorted(files) + ["", desc]
539 text = "\n".join(l)
542 text = "\n".join(l)
540 return self.addrevision(text, transaction, len(self), p1, p2)
543 return self.addrevision(text, transaction, len(self), p1, p2)
541
544
542 def branchinfo(self, rev):
545 def branchinfo(self, rev):
543 """return the branch name and open/close state of a revision
546 """return the branch name and open/close state of a revision
544
547
545 This function exists because creating a changectx object
548 This function exists because creating a changectx object
546 just to access this is costly."""
549 just to access this is costly."""
547 extra = self.read(rev)[5]
550 extra = self.read(rev)[5]
548 return encoding.tolocal(extra.get("branch")), 'close' in extra
551 return encoding.tolocal(extra.get("branch")), 'close' in extra
549
552
550 def _nodeduplicatecallback(self, transaction, node):
553 def _nodeduplicatecallback(self, transaction, node):
551 # keep track of revisions that got "re-added", eg: unbunde of know rev.
554 # keep track of revisions that got "re-added", eg: unbunde of know rev.
552 #
555 #
553 # We track them in a list to preserve their order from the source bundle
556 # We track them in a list to preserve their order from the source bundle
554 duplicates = transaction.changes.setdefault('revduplicates', [])
557 duplicates = transaction.changes.setdefault('revduplicates', [])
555 duplicates.append(self.rev(node))
558 duplicates.append(self.rev(node))
General Comments 0
You need to be logged in to leave comments. Login now