##// END OF EJS Templates
py3: fix test-remotefilelog-repack.t...
Augie Fackler -
r41642:13dad5cb default
parent child Browse files
Show More
@@ -1,751 +1,752 b''
1 1 test-abort-checkin.t
2 2 test-absorb-edit-lines.t
3 3 test-absorb-filefixupstate.py
4 4 test-absorb-phase.t
5 5 test-absorb-rename.t
6 6 test-absorb-strip.t
7 7 test-absorb.t
8 8 test-add.t
9 9 test-addremove-similar.t
10 10 test-addremove.t
11 11 test-alias.t
12 12 test-amend-subrepo.t
13 13 test-amend.t
14 14 test-ancestor.py
15 15 test-annotate.py
16 16 test-annotate.t
17 17 test-arbitraryfilectx.t
18 18 test-archive-symlinks.t
19 19 test-archive.t
20 20 test-atomictempfile.py
21 21 test-audit-path.t
22 22 test-audit-subrepo.t
23 23 test-automv.t
24 24 test-backout.t
25 25 test-backwards-remove.t
26 26 test-bad-extension.t
27 27 test-bad-pull.t
28 28 test-basic.t
29 29 test-batching.py
30 30 test-bdiff.py
31 31 test-bheads.t
32 32 test-bisect.t
33 33 test-bisect2.t
34 34 test-bisect3.t
35 35 test-blackbox.t
36 36 test-bookflow.t
37 37 test-bookmarks-current.t
38 38 test-bookmarks-merge.t
39 39 test-bookmarks-pushpull.t
40 40 test-bookmarks-rebase.t
41 41 test-bookmarks-strip.t
42 42 test-bookmarks.t
43 43 test-branch-change.t
44 44 test-branch-option.t
45 45 test-branch-tag-confict.t
46 46 test-branches.t
47 47 test-bugzilla.t
48 48 test-bundle-phases.t
49 49 test-bundle-r.t
50 50 test-bundle-type.t
51 51 test-bundle-vs-outgoing.t
52 52 test-bundle.t
53 53 test-bundle2-exchange.t
54 54 test-bundle2-format.t
55 55 test-bundle2-multiple-changegroups.t
56 56 test-bundle2-pushback.t
57 57 test-bundle2-remote-changegroup.t
58 58 test-cache-abuse.t
59 59 test-cappedreader.py
60 60 test-casecollision-merge.t
61 61 test-casecollision.t
62 62 test-casefolding.t
63 63 test-cat.t
64 64 test-cbor.py
65 65 test-censor.t
66 66 test-changelog-exec.t
67 67 test-check-code.t
68 68 test-check-commit.t
69 69 test-check-config.py
70 70 test-check-config.t
71 71 test-check-execute.t
72 72 test-check-help.t
73 73 test-check-interfaces.py
74 74 test-check-module-imports.t
75 75 test-check-py3-compat.t
76 76 test-check-pyflakes.t
77 77 test-check-pylint.t
78 78 test-check-shbang.t
79 79 test-children.t
80 80 test-churn.t
81 81 test-clone-cgi.t
82 82 test-clone-pull-corruption.t
83 83 test-clone-r.t
84 84 test-clone-uncompressed.t
85 85 test-clone-update-order.t
86 86 test-clone.t
87 87 test-clonebundles.t
88 88 test-close-head.t
89 89 test-commandserver.t
90 90 test-commit-amend.t
91 91 test-commit-interactive.t
92 92 test-commit-multiple.t
93 93 test-commit-unresolved.t
94 94 test-commit.t
95 95 test-committer.t
96 96 test-completion.t
97 97 test-config-env.py
98 98 test-config.t
99 99 test-conflict.t
100 100 test-confused-revert.t
101 101 test-context-metadata.t
102 102 test-context.py
103 103 test-contrib-check-code.t
104 104 test-contrib-check-commit.t
105 105 test-contrib-dumprevlog.t
106 106 test-contrib-perf.t
107 107 test-contrib-relnotes.t
108 108 test-contrib-testparseutil.t
109 109 test-contrib.t
110 110 test-convert-authormap.t
111 111 test-convert-clonebranches.t
112 112 test-convert-cvs-branch.t
113 113 test-convert-cvs-detectmerge.t
114 114 test-convert-cvs-synthetic.t
115 115 test-convert-cvs.t
116 116 test-convert-cvsnt-mergepoints.t
117 117 test-convert-datesort.t
118 118 test-convert-filemap.t
119 119 test-convert-git.t
120 120 test-convert-hg-sink.t
121 121 test-convert-hg-source.t
122 122 test-convert-hg-startrev.t
123 123 test-convert-splicemap.t
124 124 test-convert-svn-sink.t
125 125 test-convert-tagsbranch-topology.t
126 126 test-convert.t
127 127 test-copy-move-merge.t
128 128 test-copy.t
129 129 test-copytrace-heuristics.t
130 130 test-custom-filters.t
131 131 test-debugbuilddag.t
132 132 test-debugbundle.t
133 133 test-debugcommands.t
134 134 test-debugextensions.t
135 135 test-debugindexdot.t
136 136 test-debugrename.t
137 137 test-default-push.t
138 138 test-diff-antipatience.t
139 139 test-diff-binary-file.t
140 140 test-diff-change.t
141 141 test-diff-color.t
142 142 test-diff-copy-depth.t
143 143 test-diff-hashes.t
144 144 test-diff-ignore-whitespace.t
145 145 test-diff-indent-heuristic.t
146 146 test-diff-issue2761.t
147 147 test-diff-newlines.t
148 148 test-diff-reverse.t
149 149 test-diff-subdir.t
150 150 test-diff-unified.t
151 151 test-diff-upgrade.t
152 152 test-diffdir.t
153 153 test-diffstat.t
154 154 test-directaccess.t
155 155 test-dirstate-backup.t
156 156 test-dirstate-nonnormalset.t
157 157 test-dirstate-race.t
158 158 test-dirstate.t
159 159 test-dispatch.py
160 160 test-dispatch.t
161 161 test-doctest.py
162 162 test-double-merge.t
163 163 test-drawdag.t
164 164 test-duplicateoptions.py
165 165 test-editor-filename.t
166 166 test-empty-dir.t
167 167 test-empty-file.t
168 168 test-empty-group.t
169 169 test-empty.t
170 170 test-encode.t
171 171 test-encoding-align.t
172 172 test-encoding-func.py
173 173 test-encoding-textwrap.t
174 174 test-encoding.t
175 175 test-eol-add.t
176 176 test-eol-clone.t
177 177 test-eol-hook.t
178 178 test-eol-patch.t
179 179 test-eol-tag.t
180 180 test-eol-update.t
181 181 test-eol.t
182 182 test-eolfilename.t
183 183 test-excessive-merge.t
184 184 test-exchange-obsmarkers-case-A1.t
185 185 test-exchange-obsmarkers-case-A2.t
186 186 test-exchange-obsmarkers-case-A3.t
187 187 test-exchange-obsmarkers-case-A4.t
188 188 test-exchange-obsmarkers-case-A5.t
189 189 test-exchange-obsmarkers-case-A6.t
190 190 test-exchange-obsmarkers-case-A7.t
191 191 test-exchange-obsmarkers-case-B1.t
192 192 test-exchange-obsmarkers-case-B2.t
193 193 test-exchange-obsmarkers-case-B3.t
194 194 test-exchange-obsmarkers-case-B4.t
195 195 test-exchange-obsmarkers-case-B5.t
196 196 test-exchange-obsmarkers-case-B6.t
197 197 test-exchange-obsmarkers-case-B7.t
198 198 test-exchange-obsmarkers-case-C1.t
199 199 test-exchange-obsmarkers-case-C2.t
200 200 test-exchange-obsmarkers-case-C3.t
201 201 test-exchange-obsmarkers-case-C4.t
202 202 test-exchange-obsmarkers-case-D1.t
203 203 test-exchange-obsmarkers-case-D2.t
204 204 test-exchange-obsmarkers-case-D3.t
205 205 test-exchange-obsmarkers-case-D4.t
206 206 test-execute-bit.t
207 207 test-export.t
208 208 test-extdata.t
209 209 test-extdiff.t
210 210 test-extension-timing.t
211 211 test-extensions-afterloaded.t
212 212 test-extensions-wrapfunction.py
213 213 test-extra-filelog-entry.t
214 214 test-fastannotate-corrupt.t
215 215 test-fastannotate-diffopts.t
216 216 test-fastannotate-hg.t
217 217 test-fastannotate-perfhack.t
218 218 test-fastannotate-protocol.t
219 219 test-fastannotate-renames.t
220 220 test-fastannotate-revmap.py
221 221 test-fastannotate.t
222 222 test-fetch.t
223 223 test-filebranch.t
224 224 test-filecache.py
225 225 test-filelog.py
226 226 test-fileset-generated.t
227 227 test-fileset.t
228 228 test-fix-topology.t
229 229 test-fix.t
230 230 test-flags.t
231 231 test-fncache.t
232 232 test-gendoc-da.t
233 233 test-gendoc-de.t
234 234 test-gendoc-el.t
235 235 test-gendoc-fr.t
236 236 test-gendoc-it.t
237 237 test-gendoc-ja.t
238 238 test-gendoc-pt_BR.t
239 239 test-gendoc-ro.t
240 240 test-gendoc-ru.t
241 241 test-gendoc-sv.t
242 242 test-gendoc-zh_CN.t
243 243 test-gendoc-zh_TW.t
244 244 test-gendoc.t
245 245 test-generaldelta.t
246 246 test-getbundle.t
247 247 test-git-export.t
248 248 test-githelp.t
249 249 test-globalopts.t
250 250 test-glog-beautifygraph.t
251 251 test-glog-topological.t
252 252 test-glog.t
253 253 test-gpg.t
254 254 test-graft.t
255 255 test-grep.t
256 256 test-hardlinks.t
257 257 test-help-hide.t
258 258 test-help.t
259 259 test-hg-parseurl.py
260 260 test-hghave.t
261 261 test-hgignore.t
262 262 test-hgk.t
263 263 test-hgrc.t
264 264 test-hgweb-annotate-whitespace.t
265 265 test-hgweb-auth.py
266 266 test-hgweb-bundle.t
267 267 test-hgweb-commands.t
268 268 test-hgweb-csp.t
269 269 test-hgweb-descend-empties.t
270 270 test-hgweb-diffs.t
271 271 test-hgweb-empty.t
272 272 test-hgweb-filelog.t
273 273 test-hgweb-no-path-info.t
274 274 test-hgweb-no-request-uri.t
275 275 test-hgweb-non-interactive.t
276 276 test-hgweb-raw.t
277 277 test-hgweb-removed.t
278 278 test-hgweb-symrev.t
279 279 test-hgweb.t
280 280 test-hgwebdir-paths.py
281 281 test-hgwebdir.t
282 282 test-hgwebdirsym.t
283 283 test-histedit-arguments.t
284 284 test-histedit-base.t
285 285 test-histedit-bookmark-motion.t
286 286 test-histedit-commute.t
287 287 test-histedit-drop.t
288 288 test-histedit-edit.t
289 289 test-histedit-fold-non-commute.t
290 290 test-histedit-fold.t
291 291 test-histedit-no-backup.t
292 292 test-histedit-no-change.t
293 293 test-histedit-non-commute-abort.t
294 294 test-histedit-non-commute.t
295 295 test-histedit-obsolete.t
296 296 test-histedit-outgoing.t
297 297 test-histedit-templates.t
298 298 test-http-api-httpv2.t
299 299 test-http-api.t
300 300 test-http-bad-server.t
301 301 test-http-branchmap.t
302 302 test-http-bundle1.t
303 303 test-http-clone-r.t
304 304 test-http-permissions.t
305 305 test-http-protocol.t
306 306 test-http.t
307 307 test-hybridencode.py
308 308 test-i18n.t
309 309 test-identify.t
310 310 test-impexp-branch.t
311 311 test-import-bypass.t
312 312 test-import-context.t
313 313 test-import-eol.t
314 314 test-import-git.t
315 315 test-import-merge.t
316 316 test-import-unknown.t
317 317 test-import.t
318 318 test-imports-checker.t
319 319 test-incoming-outgoing.t
320 320 test-infinitepush-bundlestore.t
321 321 test-infinitepush-ci.t
322 322 test-infinitepush.t
323 323 test-inherit-mode.t
324 324 test-init.t
325 325 test-install.t
326 326 test-issue1089.t
327 327 test-issue1102.t
328 328 test-issue1175.t
329 329 test-issue1306.t
330 330 test-issue1438.t
331 331 test-issue1502.t
332 332 test-issue1802.t
333 333 test-issue1877.t
334 334 test-issue1993.t
335 335 test-issue2137.t
336 336 test-issue3084.t
337 337 test-issue4074.t
338 338 test-issue522.t
339 339 test-issue586.t
340 340 test-issue5979.t
341 341 test-issue612.t
342 342 test-issue619.t
343 343 test-issue660.t
344 344 test-issue672.t
345 345 test-issue842.t
346 346 test-journal-exists.t
347 347 test-journal-share.t
348 348 test-journal.t
349 349 test-keyword.t
350 350 test-known.t
351 351 test-largefiles-cache.t
352 352 test-largefiles-misc.t
353 353 test-largefiles-small-disk.t
354 354 test-largefiles-update.t
355 355 test-largefiles-wireproto.t
356 356 test-largefiles.t
357 357 test-lfconvert.t
358 358 test-lfs-bundle.t
359 359 test-lfs-largefiles.t
360 360 test-lfs-pointer.py
361 361 test-lfs-test-server.t
362 362 test-lfs.t
363 363 test-linelog.py
364 364 test-linerange.py
365 365 test-locate.t
366 366 test-lock-badness.t
367 367 test-lock.py
368 368 test-log-exthook.t
369 369 test-log-linerange.t
370 370 test-log.t
371 371 test-logexchange.t
372 372 test-logtoprocess.t
373 373 test-lrucachedict.py
374 374 test-mactext.t
375 375 test-mailmap.t
376 376 test-manifest-merging.t
377 377 test-manifest.py
378 378 test-manifest.t
379 379 test-match.py
380 380 test-mdiff.py
381 381 test-merge-changedelete.t
382 382 test-merge-closedheads.t
383 383 test-merge-commit.t
384 384 test-merge-criss-cross.t
385 385 test-merge-default.t
386 386 test-merge-force.t
387 387 test-merge-halt.t
388 388 test-merge-internal-tools-pattern.t
389 389 test-merge-local.t
390 390 test-merge-no-file-change.t
391 391 test-merge-remove.t
392 392 test-merge-revert.t
393 393 test-merge-revert2.t
394 394 test-merge-subrepos.t
395 395 test-merge-symlinks.t
396 396 test-merge-tools.t
397 397 test-merge-types.t
398 398 test-merge1.t
399 399 test-merge10.t
400 400 test-merge2.t
401 401 test-merge4.t
402 402 test-merge5.t
403 403 test-merge6.t
404 404 test-merge7.t
405 405 test-merge8.t
406 406 test-merge9.t
407 407 test-minifileset.py
408 408 test-minirst.py
409 409 test-missing-capability.t
410 410 test-mq-eol.t
411 411 test-mq-git.t
412 412 test-mq-guards.t
413 413 test-mq-header-date.t
414 414 test-mq-header-from.t
415 415 test-mq-merge.t
416 416 test-mq-missingfiles.t
417 417 test-mq-pull-from-bundle.t
418 418 test-mq-qclone-http.t
419 419 test-mq-qdelete.t
420 420 test-mq-qdiff.t
421 421 test-mq-qfold.t
422 422 test-mq-qgoto.t
423 423 test-mq-qimport-fail-cleanup.t
424 424 test-mq-qimport.t
425 425 test-mq-qnew.t
426 426 test-mq-qpush-exact.t
427 427 test-mq-qpush-fail.t
428 428 test-mq-qqueue.t
429 429 test-mq-qrefresh-interactive.t
430 430 test-mq-qrefresh-replace-log-message.t
431 431 test-mq-qrefresh.t
432 432 test-mq-qrename.t
433 433 test-mq-qsave.t
434 434 test-mq-safety.t
435 435 test-mq-subrepo.t
436 436 test-mq-symlinks.t
437 437 test-mq.t
438 438 test-mv-cp-st-diff.t
439 439 test-narrow-acl.t
440 440 test-narrow-archive.t
441 441 test-narrow-clone-no-ellipsis.t
442 442 test-narrow-clone-non-narrow-server.t
443 443 test-narrow-clone-nonlinear.t
444 444 test-narrow-clone-stream.t
445 445 test-narrow-clone.t
446 446 test-narrow-commit.t
447 447 test-narrow-copies.t
448 448 test-narrow-debugcommands.t
449 449 test-narrow-debugrebuilddirstate.t
450 450 test-narrow-exchange-merges.t
451 451 test-narrow-exchange.t
452 452 test-narrow-expanddirstate.t
453 453 test-narrow-merge.t
454 454 test-narrow-patch.t
455 455 test-narrow-patterns.t
456 456 test-narrow-pull.t
457 457 test-narrow-rebase.t
458 458 test-narrow-shallow-merges.t
459 459 test-narrow-shallow.t
460 460 test-narrow-share.t
461 461 test-narrow-sparse.t
462 462 test-narrow-strip.t
463 463 test-narrow-trackedcmd.t
464 464 test-narrow-update.t
465 465 test-narrow-widen-no-ellipsis.t
466 466 test-narrow-widen.t
467 467 test-narrow.t
468 468 test-nested-repo.t
469 469 test-newbranch.t
470 470 test-newcgi.t
471 471 test-newercgi.t
472 472 test-nointerrupt.t
473 473 test-notify-changegroup.t
474 474 test-obshistory.t
475 475 test-obsmarker-template.t
476 476 test-obsmarkers-effectflag.t
477 477 test-obsolete-bounds-checking.t
478 478 test-obsolete-bundle-strip.t
479 479 test-obsolete-changeset-exchange.t
480 480 test-obsolete-checkheads.t
481 481 test-obsolete-distributed.t
482 482 test-obsolete-divergent.t
483 483 test-obsolete-tag-cache.t
484 484 test-obsolete.t
485 485 test-oldcgi.t
486 486 test-origbackup-conflict.t
487 487 test-pager-legacy.t
488 488 test-pager.t
489 489 test-parents.t
490 490 test-parse-date.t
491 491 test-parseindex.t
492 492 test-parseindex2.py
493 493 test-patch-offset.t
494 494 test-patch.t
495 495 test-patchbomb-bookmark.t
496 496 test-patchbomb-tls.t
497 497 test-patchbomb.t
498 498 test-pathconflicts-basic.t
499 499 test-pathconflicts-merge.t
500 500 test-pathconflicts-update.t
501 501 test-pathencode.py
502 502 test-pending.t
503 503 test-permissions.t
504 504 test-phases-exchange.t
505 505 test-phases.t
506 506 test-profile.t
507 507 test-progress.t
508 508 test-propertycache.py
509 509 test-pull-branch.t
510 510 test-pull-bundle.t
511 511 test-pull-http.t
512 512 test-pull-permission.t
513 513 test-pull-pull-corruption.t
514 514 test-pull-r.t
515 515 test-pull-update.t
516 516 test-pull.t
517 517 test-purge.t
518 518 test-push-cgi.t
519 519 test-push-checkheads-partial-C1.t
520 520 test-push-checkheads-partial-C2.t
521 521 test-push-checkheads-partial-C3.t
522 522 test-push-checkheads-partial-C4.t
523 523 test-push-checkheads-pruned-B1.t
524 524 test-push-checkheads-pruned-B2.t
525 525 test-push-checkheads-pruned-B3.t
526 526 test-push-checkheads-pruned-B4.t
527 527 test-push-checkheads-pruned-B5.t
528 528 test-push-checkheads-pruned-B6.t
529 529 test-push-checkheads-pruned-B7.t
530 530 test-push-checkheads-pruned-B8.t
531 531 test-push-checkheads-superceed-A1.t
532 532 test-push-checkheads-superceed-A2.t
533 533 test-push-checkheads-superceed-A3.t
534 534 test-push-checkheads-superceed-A4.t
535 535 test-push-checkheads-superceed-A5.t
536 536 test-push-checkheads-superceed-A6.t
537 537 test-push-checkheads-superceed-A7.t
538 538 test-push-checkheads-superceed-A8.t
539 539 test-push-checkheads-unpushed-D1.t
540 540 test-push-checkheads-unpushed-D2.t
541 541 test-push-checkheads-unpushed-D3.t
542 542 test-push-checkheads-unpushed-D4.t
543 543 test-push-checkheads-unpushed-D5.t
544 544 test-push-checkheads-unpushed-D6.t
545 545 test-push-checkheads-unpushed-D7.t
546 546 test-push-http.t
547 547 test-push-race.t
548 548 test-push-warn.t
549 549 test-push.t
550 550 test-pushvars.t
551 551 test-qrecord.t
552 552 test-rebase-abort.t
553 553 test-rebase-backup.t
554 554 test-rebase-base-flag.t
555 555 test-rebase-bookmarks.t
556 556 test-rebase-brute-force.t
557 557 test-rebase-cache.t
558 558 test-rebase-check-restore.t
559 559 test-rebase-collapse.t
560 560 test-rebase-conflicts.t
561 561 test-rebase-dest.t
562 562 test-rebase-detach.t
563 563 test-rebase-emptycommit.t
564 564 test-rebase-inmemory.t
565 565 test-rebase-interruptions.t
566 566 test-rebase-issue-noparam-single-rev.t
567 567 test-rebase-legacy.t
568 568 test-rebase-mq-skip.t
569 569 test-rebase-mq.t
570 570 test-rebase-named-branches.t
571 571 test-rebase-newancestor.t
572 572 test-rebase-obsolete.t
573 573 test-rebase-parameters.t
574 574 test-rebase-partial.t
575 575 test-rebase-pull.t
576 576 test-rebase-rename.t
577 577 test-rebase-scenario-global.t
578 578 test-rebase-templates.t
579 579 test-rebase-transaction.t
580 580 test-rebuildstate.t
581 581 test-record.t
582 582 test-releasenotes-formatting.t
583 583 test-releasenotes-merging.t
584 584 test-releasenotes-parsing.t
585 585 test-relink.t
586 586 test-remotefilelog-bad-configs.t
587 587 test-remotefilelog-bgprefetch.t
588 588 test-remotefilelog-blame.t
589 589 test-remotefilelog-bundle2.t
590 590 test-remotefilelog-bundles.t
591 591 test-remotefilelog-cacheprocess.t
592 592 test-remotefilelog-clone-tree.t
593 593 test-remotefilelog-clone.t
594 594 test-remotefilelog-datapack.py
595 595 test-remotefilelog-gcrepack.t
596 596 test-remotefilelog-histpack.py
597 597 test-remotefilelog-http.t
598 598 test-remotefilelog-keepset.t
599 599 test-remotefilelog-local.t
600 600 test-remotefilelog-log.t
601 601 test-remotefilelog-partial-shallow.t
602 602 test-remotefilelog-permissions.t
603 603 test-remotefilelog-permisssions.t
604 604 test-remotefilelog-prefetch.t
605 605 test-remotefilelog-pull-noshallow.t
606 test-remotefilelog-repack.t
606 607 test-remotefilelog-share.t
607 608 test-remotefilelog-sparse.t
608 609 test-remotefilelog-tags.t
609 610 test-remotefilelog-wireproto.t
610 611 test-remove.t
611 612 test-removeemptydirs.t
612 613 test-rename-after-merge.t
613 614 test-rename-dir-merge.t
614 615 test-rename-merge1.t
615 616 test-rename-merge2.t
616 617 test-rename.t
617 618 test-repair-strip.t
618 619 test-repo-compengines.t
619 620 test-requires.t
620 621 test-resolve.t
621 622 test-revert-flags.t
622 623 test-revert-interactive.t
623 624 test-revert-unknown.t
624 625 test-revert.t
625 626 test-revisions.t
626 627 test-revlog-ancestry.py
627 628 test-revlog-group-emptyiter.t
628 629 test-revlog-mmapindex.t
629 630 test-revlog-packentry.t
630 631 test-revlog-raw.py
631 632 test-revlog-v2.t
632 633 test-revlog.t
633 634 test-revset-dirstate-parents.t
634 635 test-revset-legacy-lookup.t
635 636 test-revset-outgoing.t
636 637 test-revset2.t
637 638 test-rollback.t
638 639 test-run-tests.py
639 640 test-run-tests.t
640 641 test-rust-ancestor.py
641 642 test-schemes.t
642 643 test-serve.t
643 644 test-setdiscovery.t
644 645 test-share.t
645 646 test-shelve.t
646 647 test-shelve2.t
647 648 test-show-stack.t
648 649 test-show-work.t
649 650 test-show.t
650 651 test-simple-update.t
651 652 test-simplekeyvaluefile.py
652 653 test-simplemerge.py
653 654 test-single-head.t
654 655 test-sparse-clear.t
655 656 test-sparse-clone.t
656 657 test-sparse-import.t
657 658 test-sparse-merges.t
658 659 test-sparse-profiles.t
659 660 test-sparse-requirement.t
660 661 test-sparse-verbose-json.t
661 662 test-sparse.t
662 663 test-split.t
663 664 test-ssh-bundle1.t
664 665 test-ssh-clone-r.t
665 666 test-ssh-proto-unbundle.t
666 667 test-ssh-proto.t
667 668 test-ssh-repoerror.t
668 669 test-ssh.t
669 670 test-sshserver.py
670 671 test-stack.t
671 672 test-static-http.t
672 673 test-status-color.t
673 674 test-status-inprocess.py
674 675 test-status-rev.t
675 676 test-status-terse.t
676 677 test-status.t
677 678 test-storage.py
678 679 test-stream-bundle-v2.t
679 680 test-strict.t
680 681 test-strip-cross.t
681 682 test-strip.t
682 683 test-subrepo-deep-nested-change.t
683 684 test-subrepo-git.t
684 685 test-subrepo-missing.t
685 686 test-subrepo-paths.t
686 687 test-subrepo-recursion.t
687 688 test-subrepo-relative-path.t
688 689 test-subrepo.t
689 690 test-symlink-os-yes-fs-no.py
690 691 test-symlink-placeholder.t
691 692 test-symlinks.t
692 693 test-tag.t
693 694 test-tags.t
694 695 test-template-basic.t
695 696 test-template-functions.t
696 697 test-template-keywords.t
697 698 test-template-map.t
698 699 test-tools.t
699 700 test-transplant.t
700 701 test-treediscovery-legacy.t
701 702 test-treediscovery.t
702 703 test-treemanifest.t
703 704 test-ui-color.py
704 705 test-ui-config.py
705 706 test-ui-verbosity.py
706 707 test-unamend.t
707 708 test-unbundlehash.t
708 709 test-uncommit.t
709 710 test-unified-test.t
710 711 test-unionrepo.t
711 712 test-unrelated-pull.t
712 713 test-up-local-change.t
713 714 test-update-atomic.t
714 715 test-update-branches.t
715 716 test-update-dest.t
716 717 test-update-issue1456.t
717 718 test-update-names.t
718 719 test-update-reverse.t
719 720 test-upgrade-repo.t
720 721 test-url-download.t
721 722 test-url-rev.t
722 723 test-url.py
723 724 test-username-newline.t
724 725 test-util.py
725 726 test-verify.t
726 727 test-walk.t
727 728 test-walkrepo.py
728 729 test-websub.t
729 730 test-win32text.t
730 731 test-wireproto-caching.t
731 732 test-wireproto-clientreactor.py
732 733 test-wireproto-command-branchmap.t
733 734 test-wireproto-command-capabilities.t
734 735 test-wireproto-command-changesetdata.t
735 736 test-wireproto-command-filedata.t
736 737 test-wireproto-command-filesdata.t
737 738 test-wireproto-command-heads.t
738 739 test-wireproto-command-known.t
739 740 test-wireproto-command-listkeys.t
740 741 test-wireproto-command-lookup.t
741 742 test-wireproto-command-manifestdata.t
742 743 test-wireproto-command-pushkey.t
743 744 test-wireproto-command-rawstorefiledata.t
744 745 test-wireproto-content-redirects.t
745 746 test-wireproto-exchangev2.t
746 747 test-wireproto-framing.py
747 748 test-wireproto-serverreactor.py
748 749 test-wireproto.py
749 750 test-wireproto.t
750 751 test-wsgirequest.py
751 752 test-xdg.t
@@ -1,425 +1,427 b''
1 1 from __future__ import absolute_import
2 2
3 3 import errno
4 4 import hashlib
5 5 import os
6 6 import shutil
7 7 import stat
8 8 import time
9 9
10 10 from mercurial.i18n import _
11 11 from mercurial.node import bin, hex
12 12 from mercurial import (
13 13 error,
14 14 pycompat,
15 15 util,
16 16 )
17 17 from . import (
18 18 constants,
19 19 shallowutil,
20 20 )
21 21
22 22 class basestore(object):
23 23 def __init__(self, repo, path, reponame, shared=False):
24 24 """Creates a remotefilelog store object for the given repo name.
25 25
26 26 `path` - The file path where this store keeps its data
27 27 `reponame` - The name of the repo. This is used to partition data from
28 28 many repos.
29 29 `shared` - True if this store is a shared cache of data from the central
30 30 server, for many repos on this machine. False means this store is for
31 31 the local data for one repo.
32 32 """
33 33 self.repo = repo
34 34 self.ui = repo.ui
35 35 self._path = path
36 36 self._reponame = reponame
37 37 self._shared = shared
38 38 self._uid = os.getuid() if not pycompat.iswindows else None
39 39
40 40 self._validatecachelog = self.ui.config("remotefilelog",
41 41 "validatecachelog")
42 42 self._validatecache = self.ui.config("remotefilelog", "validatecache",
43 43 'on')
44 44 if self._validatecache not in ('on', 'strict', 'off'):
45 45 self._validatecache = 'on'
46 46 if self._validatecache == 'off':
47 47 self._validatecache = False
48 48
49 49 if shared:
50 50 shallowutil.mkstickygroupdir(self.ui, path)
51 51
52 52 def getmissing(self, keys):
53 53 missing = []
54 54 for name, node in keys:
55 55 filepath = self._getfilepath(name, node)
56 56 exists = os.path.exists(filepath)
57 57 if (exists and self._validatecache == 'strict' and
58 58 not self._validatekey(filepath, 'contains')):
59 59 exists = False
60 60 if not exists:
61 61 missing.append((name, node))
62 62
63 63 return missing
64 64
65 65 # BELOW THIS ARE IMPLEMENTATIONS OF REPACK SOURCE
66 66
67 67 def markledger(self, ledger, options=None):
68 68 if options and options.get(constants.OPTION_PACKSONLY):
69 69 return
70 70 if self._shared:
71 71 for filename, nodes in self._getfiles():
72 72 for node in nodes:
73 73 ledger.markdataentry(self, filename, node)
74 74 ledger.markhistoryentry(self, filename, node)
75 75
76 76 def cleanup(self, ledger):
77 77 ui = self.ui
78 78 entries = ledger.sources.get(self, [])
79 79 count = 0
80 80 progress = ui.makeprogress(_("cleaning up"), unit="files",
81 81 total=len(entries))
82 82 for entry in entries:
83 83 if entry.gced or (entry.datarepacked and entry.historyrepacked):
84 84 progress.update(count)
85 85 path = self._getfilepath(entry.filename, entry.node)
86 86 util.tryunlink(path)
87 87 count += 1
88 88 progress.complete()
89 89
90 90 # Clean up the repo cache directory.
91 91 self._cleanupdirectory(self._getrepocachepath())
92 92
93 93 # BELOW THIS ARE NON-STANDARD APIS
94 94
95 95 def _cleanupdirectory(self, rootdir):
96 96 """Removes the empty directories and unnecessary files within the root
97 97 directory recursively. Note that this method does not remove the root
98 98 directory itself. """
99 99
100 100 oldfiles = set()
101 101 otherfiles = set()
102 102 # osutil.listdir returns stat information which saves some rmdir/listdir
103 103 # syscalls.
104 104 for name, mode in util.osutil.listdir(rootdir):
105 105 if stat.S_ISDIR(mode):
106 106 dirpath = os.path.join(rootdir, name)
107 107 self._cleanupdirectory(dirpath)
108 108
109 109 # Now that the directory specified by dirpath is potentially
110 110 # empty, try and remove it.
111 111 try:
112 112 os.rmdir(dirpath)
113 113 except OSError:
114 114 pass
115 115
116 116 elif stat.S_ISREG(mode):
117 117 if name.endswith('_old'):
118 118 oldfiles.add(name[:-4])
119 119 else:
120 120 otherfiles.add(name)
121 121
122 122 # Remove the files which end with suffix '_old' and have no
123 123 # corresponding file without the suffix '_old'. See addremotefilelognode
124 124 # method for the generation/purpose of files with '_old' suffix.
125 125 for filename in oldfiles - otherfiles:
126 126 filepath = os.path.join(rootdir, filename + '_old')
127 127 util.tryunlink(filepath)
128 128
129 129 def _getfiles(self):
130 130 """Return a list of (filename, [node,...]) for all the revisions that
131 131 exist in the store.
132 132
133 133 This is useful for obtaining a list of all the contents of the store
134 134 when performing a repack to another store, since the store API requires
135 135 name+node keys and not namehash+node keys.
136 136 """
137 137 existing = {}
138 138 for filenamehash, node in self._listkeys():
139 139 existing.setdefault(filenamehash, []).append(node)
140 140
141 141 filenamemap = self._resolvefilenames(existing.keys())
142 142
143 143 for filename, sha in filenamemap.iteritems():
144 144 yield (filename, existing[sha])
145 145
146 146 def _resolvefilenames(self, hashes):
147 147 """Given a list of filename hashes that are present in the
148 148 remotefilelog store, return a mapping from filename->hash.
149 149
150 150 This is useful when converting remotefilelog blobs into other storage
151 151 formats.
152 152 """
153 153 if not hashes:
154 154 return {}
155 155
156 156 filenames = {}
157 157 missingfilename = set(hashes)
158 158
159 159 # Start with a full manifest, since it'll cover the majority of files
160 160 for filename in self.repo['tip'].manifest():
161 161 sha = hashlib.sha1(filename).digest()
162 162 if sha in missingfilename:
163 163 filenames[filename] = sha
164 164 missingfilename.discard(sha)
165 165
166 166 # Scan the changelog until we've found every file name
167 167 cl = self.repo.unfiltered().changelog
168 168 for rev in pycompat.xrange(len(cl) - 1, -1, -1):
169 169 if not missingfilename:
170 170 break
171 171 files = cl.readfiles(cl.node(rev))
172 172 for filename in files:
173 173 sha = hashlib.sha1(filename).digest()
174 174 if sha in missingfilename:
175 175 filenames[filename] = sha
176 176 missingfilename.discard(sha)
177 177
178 178 return filenames
179 179
180 180 def _getrepocachepath(self):
181 181 return os.path.join(
182 182 self._path, self._reponame) if self._shared else self._path
183 183
184 184 def _listkeys(self):
185 185 """List all the remotefilelog keys that exist in the store.
186 186
187 187 Returns a iterator of (filename hash, filecontent hash) tuples.
188 188 """
189 189
190 190 for root, dirs, files in os.walk(self._getrepocachepath()):
191 191 for filename in files:
192 192 if len(filename) != 40:
193 193 continue
194 194 node = filename
195 195 if self._shared:
196 196 # .../1a/85ffda..be21
197 197 filenamehash = root[-41:-39] + root[-38:]
198 198 else:
199 199 filenamehash = root[-40:]
200 200 yield (bin(filenamehash), bin(node))
201 201
202 202 def _getfilepath(self, name, node):
203 203 node = hex(node)
204 204 if self._shared:
205 205 key = shallowutil.getcachekey(self._reponame, name, node)
206 206 else:
207 207 key = shallowutil.getlocalkey(name, node)
208 208
209 209 return os.path.join(self._path, key)
210 210
211 211 def _getdata(self, name, node):
212 212 filepath = self._getfilepath(name, node)
213 213 try:
214 214 data = shallowutil.readfile(filepath)
215 215 if self._validatecache and not self._validatedata(data, filepath):
216 216 if self._validatecachelog:
217 217 with open(self._validatecachelog, 'a+') as f:
218 218 f.write("corrupt %s during read\n" % filepath)
219 219 os.rename(filepath, filepath + ".corrupt")
220 220 raise KeyError("corrupt local cache file %s" % filepath)
221 221 except IOError:
222 222 raise KeyError("no file found at %s for %s:%s" % (filepath, name,
223 223 hex(node)))
224 224
225 225 return data
226 226
227 227 def addremotefilelognode(self, name, node, data):
228 228 filepath = self._getfilepath(name, node)
229 229
230 230 oldumask = os.umask(0o002)
231 231 try:
232 232 # if this node already exists, save the old version for
233 233 # recovery/debugging purposes.
234 234 if os.path.exists(filepath):
235 235 newfilename = filepath + '_old'
236 236 # newfilename can be read-only and shutil.copy will fail.
237 237 # Delete newfilename to avoid it
238 238 if os.path.exists(newfilename):
239 239 shallowutil.unlinkfile(newfilename)
240 240 shutil.copy(filepath, newfilename)
241 241
242 242 shallowutil.mkstickygroupdir(self.ui, os.path.dirname(filepath))
243 243 shallowutil.writefile(filepath, data, readonly=True)
244 244
245 245 if self._validatecache:
246 246 if not self._validatekey(filepath, 'write'):
247 247 raise error.Abort(_("local cache write was corrupted %s") %
248 248 filepath)
249 249 finally:
250 250 os.umask(oldumask)
251 251
252 252 def markrepo(self, path):
253 253 """Call this to add the given repo path to the store's list of
254 254 repositories that are using it. This is useful later when doing garbage
255 255 collection, since it allows us to insecpt the repos to see what nodes
256 256 they want to be kept alive in the store.
257 257 """
258 258 repospath = os.path.join(self._path, "repos")
259 259 with open(repospath, 'ab') as reposfile:
260 260 reposfile.write(os.path.dirname(path) + "\n")
261 261
262 262 repospathstat = os.stat(repospath)
263 263 if repospathstat.st_uid == self._uid:
264 264 os.chmod(repospath, 0o0664)
265 265
266 266 def _validatekey(self, path, action):
267 267 with open(path, 'rb') as f:
268 268 data = f.read()
269 269
270 270 if self._validatedata(data, path):
271 271 return True
272 272
273 273 if self._validatecachelog:
274 274 with open(self._validatecachelog, 'ab+') as f:
275 275 f.write("corrupt %s during %s\n" % (path, action))
276 276
277 277 os.rename(path, path + ".corrupt")
278 278 return False
279 279
280 280 def _validatedata(self, data, path):
281 281 try:
282 282 if len(data) > 0:
283 283 # see remotefilelogserver.createfileblob for the format
284 284 offset, size, flags = shallowutil.parsesizeflags(data)
285 285 if len(data) <= size:
286 286 # it is truncated
287 287 return False
288 288
289 289 # extract the node from the metadata
290 290 offset += size
291 291 datanode = data[offset:offset + 20]
292 292
293 293 # and compare against the path
294 294 if os.path.basename(path) == hex(datanode):
295 295 # Content matches the intended path
296 296 return True
297 297 return False
298 298 except (ValueError, RuntimeError):
299 299 pass
300 300
301 301 return False
302 302
303 303 def gc(self, keepkeys):
304 304 ui = self.ui
305 305 cachepath = self._path
306 306
307 307 # prune cache
308 308 queue = pycompat.queue.PriorityQueue()
309 309 originalsize = 0
310 310 size = 0
311 311 count = 0
312 312 removed = 0
313 313
314 314 # keep files newer than a day even if they aren't needed
315 315 limit = time.time() - (60 * 60 * 24)
316 316
317 317 progress = ui.makeprogress(_("removing unnecessary files"),
318 318 unit="files")
319 319 progress.update(0)
320 320 for root, dirs, files in os.walk(cachepath):
321 321 for file in files:
322 322 if file == 'repos':
323 323 continue
324 324
325 325 # Don't delete pack files
326 326 if '/packs/' in root:
327 327 continue
328 328
329 329 progress.update(count)
330 330 path = os.path.join(root, file)
331 331 key = os.path.relpath(path, cachepath)
332 332 count += 1
333 333 try:
334 334 pathstat = os.stat(path)
335 335 except OSError as e:
336 336 # errno.ENOENT = no such file or directory
337 337 if e.errno != errno.ENOENT:
338 338 raise
339 339 msg = _("warning: file %s was removed by another process\n")
340 340 ui.warn(msg % path)
341 341 continue
342 342
343 343 originalsize += pathstat.st_size
344 344
345 345 if key in keepkeys or pathstat.st_atime > limit:
346 346 queue.put((pathstat.st_atime, path, pathstat))
347 347 size += pathstat.st_size
348 348 else:
349 349 try:
350 350 shallowutil.unlinkfile(path)
351 351 except OSError as e:
352 352 # errno.ENOENT = no such file or directory
353 353 if e.errno != errno.ENOENT:
354 354 raise
355 355 msg = _("warning: file %s was removed by another "
356 356 "process\n")
357 357 ui.warn(msg % path)
358 358 continue
359 359 removed += 1
360 360 progress.complete()
361 361
362 362 # remove oldest files until under limit
363 363 limit = ui.configbytes("remotefilelog", "cachelimit")
364 364 if size > limit:
365 365 excess = size - limit
366 366 progress = ui.makeprogress(_("enforcing cache limit"), unit="bytes",
367 367 total=excess)
368 368 removedexcess = 0
369 369 while queue and size > limit and size > 0:
370 370 progress.update(removedexcess)
371 371 atime, oldpath, oldpathstat = queue.get()
372 372 try:
373 373 shallowutil.unlinkfile(oldpath)
374 374 except OSError as e:
375 375 # errno.ENOENT = no such file or directory
376 376 if e.errno != errno.ENOENT:
377 377 raise
378 378 msg = _("warning: file %s was removed by another process\n")
379 379 ui.warn(msg % oldpath)
380 380 size -= oldpathstat.st_size
381 381 removed += 1
382 382 removedexcess += oldpathstat.st_size
383 383 progress.complete()
384 384
385 385 ui.status(_("finished: removed %d of %d files (%0.2f GB to %0.2f GB)\n")
386 386 % (removed, count,
387 387 float(originalsize) / 1024.0 / 1024.0 / 1024.0,
388 388 float(size) / 1024.0 / 1024.0 / 1024.0))
389 389
390 390 class baseunionstore(object):
391 391 def __init__(self, *args, **kwargs):
392 392 # If one of the functions that iterates all of the stores is about to
393 393 # throw a KeyError, try this many times with a full refresh between
394 394 # attempts. A repack operation may have moved data from one store to
395 395 # another while we were running.
396 396 self.numattempts = kwargs.get(r'numretries', 0) + 1
397 397 # If not-None, call this function on every retry and if the attempts are
398 398 # exhausted.
399 399 self.retrylog = kwargs.get(r'retrylog', None)
400 400
401 401 def markforrefresh(self):
402 402 for store in self.stores:
403 403 if util.safehasattr(store, 'markforrefresh'):
404 404 store.markforrefresh()
405 405
406 406 @staticmethod
407 407 def retriable(fn):
408 408 def noop(*args):
409 409 pass
410 410 def wrapped(self, *args, **kwargs):
411 411 retrylog = self.retrylog or noop
412 412 funcname = fn.__name__
413 for i in pycompat.xrange(self.numattempts):
413 i = 0
414 while i < self.numattempts:
414 415 if i > 0:
415 416 retrylog('re-attempting (n=%d) %s\n' % (i, funcname))
416 417 self.markforrefresh()
418 i += 1
417 419 try:
418 420 return fn(self, *args, **kwargs)
419 421 except KeyError:
420 pass
421 # retries exhausted
422 retrylog('retries exhausted in %s, raising KeyError\n' %
423 pycompat.sysbytes(funcname))
424 raise
422 if i == self.numattempts:
423 # retries exhausted
424 retrylog('retries exhausted in %s, raising KeyError\n' %
425 pycompat.sysbytes(funcname))
426 raise
425 427 return wrapped
General Comments 0
You need to be logged in to leave comments. Login now