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'