Mercurial > hg
comparison tests/test-treemanifest.t @ 25222:0de132d5328a
treemanifest: lazily load manifests
Most operations on treemanifests already visit only relevant
submanifests. Notable examples include __getitem__, __contains__,
walk/matches with matcher, diff. By making submanifests lazily loaded,
we speed up all these operations.
The lazy loading is achieved by adding a _load() method that gets
defined where we currently eagerly parse the manifest. We make sure to
call it before any access to _dirs, _files or _flags.
Some timings on the Mozilla repo (with flat manifest timings for
reference):
hg cat -r . README.txt: 1.644s -> 0.096s (0.255s)
hg diff -r .^ -r . : 1.746s -> 0.137s (0.431s)
hg files -r . python : 1.508s -> 0.146s (0.335s)
hg files -r . : 2.125s -> 2.203s (0.712s)
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Thu, 09 Apr 2015 17:14:35 -0700 |
parents | 1929d9c84028 |
children | 8545bd381504 |
comparison
equal
deleted
inserted
replaced
25221:eafa06e9edde | 25222:0de132d5328a |
---|---|
76 $ hg debugindex --dir dir1/dir1 > after | 76 $ hg debugindex --dir dir1/dir1 > after |
77 $ diff before after | 77 $ diff before after |
78 $ rm before after | 78 $ rm before after |
79 | 79 |
80 Check that hg files (calls treemanifest.walk()) works | 80 Check that hg files (calls treemanifest.walk()) works |
81 without loading all directory revlogs | |
81 | 82 |
82 $ hg co 'desc("add dir2")' | 83 $ hg co 'desc("add dir2")' |
83 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | 84 2 files updated, 0 files merged, 0 files removed, 0 files unresolved |
85 $ mv .hg/store/meta/dir2 .hg/store/meta/dir2-backup | |
84 $ hg files -r . dir1 | 86 $ hg files -r . dir1 |
85 dir1/a (glob) | 87 dir1/a (glob) |
86 dir1/b (glob) | 88 dir1/b (glob) |
87 dir1/dir1/a (glob) | 89 dir1/dir1/a (glob) |
88 dir1/dir1/b (glob) | 90 dir1/dir1/b (glob) |
89 dir1/dir2/a (glob) | 91 dir1/dir2/a (glob) |
90 dir1/dir2/b (glob) | 92 dir1/dir2/b (glob) |
91 | 93 |
92 Check that status between revisions works (calls treemanifest.matches()) | 94 Check that status between revisions works (calls treemanifest.matches()) |
95 without loading all directory revlogs | |
93 | 96 |
94 $ hg status --rev 'desc("add dir1")' --rev . dir1 | 97 $ hg status --rev 'desc("add dir1")' --rev . dir1 |
95 A dir1/dir1/a | 98 A dir1/dir1/a |
96 A dir1/dir1/b | 99 A dir1/dir1/b |
97 A dir1/dir2/a | 100 A dir1/dir2/a |
98 A dir1/dir2/b | 101 A dir1/dir2/b |
102 $ mv .hg/store/meta/dir2-backup .hg/store/meta/dir2 | |
99 | 103 |
100 Merge creates 2-parent revision of directory revlog | 104 Merge creates 2-parent revision of directory revlog |
101 | 105 |
102 $ echo 5 > dir1/a | 106 $ echo 5 > dir1/a |
103 $ hg ci -Aqm 'modify dir1/a' | 107 $ hg ci -Aqm 'modify dir1/a' |