##// END OF EJS Templates
perf: add a command to test addremove performance...
Siddharth Agarwal -
r18871:a2d4ab4f default
parent child Browse files
Show More
@@ -1,388 +1,397 b''
1 # perf.py - performance test routines
1 # perf.py - performance test routines
2 '''helper extension to measure performance'''
2 '''helper extension to measure performance'''
3
3
4 from mercurial import cmdutil, scmutil, util, match, commands, obsolete
4 from mercurial import cmdutil, scmutil, util, match, commands, obsolete
5 from mercurial import repoview, branchmap, merge
5 from mercurial import repoview, branchmap, merge
6 import time, os, sys
6 import time, os, sys
7
7
8 cmdtable = {}
8 cmdtable = {}
9 command = cmdutil.command(cmdtable)
9 command = cmdutil.command(cmdtable)
10
10
11 def timer(func, title=None):
11 def timer(func, title=None):
12 results = []
12 results = []
13 begin = time.time()
13 begin = time.time()
14 count = 0
14 count = 0
15 while True:
15 while True:
16 ostart = os.times()
16 ostart = os.times()
17 cstart = time.time()
17 cstart = time.time()
18 r = func()
18 r = func()
19 cstop = time.time()
19 cstop = time.time()
20 ostop = os.times()
20 ostop = os.times()
21 count += 1
21 count += 1
22 a, b = ostart, ostop
22 a, b = ostart, ostop
23 results.append((cstop - cstart, b[0] - a[0], b[1]-a[1]))
23 results.append((cstop - cstart, b[0] - a[0], b[1]-a[1]))
24 if cstop - begin > 3 and count >= 100:
24 if cstop - begin > 3 and count >= 100:
25 break
25 break
26 if cstop - begin > 10 and count >= 3:
26 if cstop - begin > 10 and count >= 3:
27 break
27 break
28 if title:
28 if title:
29 sys.stderr.write("! %s\n" % title)
29 sys.stderr.write("! %s\n" % title)
30 if r:
30 if r:
31 sys.stderr.write("! result: %s\n" % r)
31 sys.stderr.write("! result: %s\n" % r)
32 m = min(results)
32 m = min(results)
33 sys.stderr.write("! wall %f comb %f user %f sys %f (best of %d)\n"
33 sys.stderr.write("! wall %f comb %f user %f sys %f (best of %d)\n"
34 % (m[0], m[1] + m[2], m[1], m[2], count))
34 % (m[0], m[1] + m[2], m[1], m[2], count))
35
35
36 @command('perfwalk')
36 @command('perfwalk')
37 def perfwalk(ui, repo, *pats):
37 def perfwalk(ui, repo, *pats):
38 try:
38 try:
39 m = scmutil.match(repo[None], pats, {})
39 m = scmutil.match(repo[None], pats, {})
40 timer(lambda: len(list(repo.dirstate.walk(m, [], True, False))))
40 timer(lambda: len(list(repo.dirstate.walk(m, [], True, False))))
41 except Exception:
41 except Exception:
42 try:
42 try:
43 m = scmutil.match(repo[None], pats, {})
43 m = scmutil.match(repo[None], pats, {})
44 timer(lambda: len([b for a, b, c in repo.dirstate.statwalk([], m)]))
44 timer(lambda: len([b for a, b, c in repo.dirstate.statwalk([], m)]))
45 except Exception:
45 except Exception:
46 timer(lambda: len(list(cmdutil.walk(repo, pats, {}))))
46 timer(lambda: len(list(cmdutil.walk(repo, pats, {}))))
47
47
48 @command('perfstatus',
48 @command('perfstatus',
49 [('u', 'unknown', False,
49 [('u', 'unknown', False,
50 'ask status to look for unknown files')])
50 'ask status to look for unknown files')])
51 def perfstatus(ui, repo, **opts):
51 def perfstatus(ui, repo, **opts):
52 #m = match.always(repo.root, repo.getcwd())
52 #m = match.always(repo.root, repo.getcwd())
53 #timer(lambda: sum(map(len, repo.dirstate.status(m, [], False, False,
53 #timer(lambda: sum(map(len, repo.dirstate.status(m, [], False, False,
54 # False))))
54 # False))))
55 timer(lambda: sum(map(len, repo.status(**opts))))
55 timer(lambda: sum(map(len, repo.status(**opts))))
56
56
57 @command('perfaddremove')
58 def perfaddremove(ui, repo):
59 try:
60 oldquiet = repo.ui.quiet
61 repo.ui.quiet = True
62 timer(lambda: scmutil.addremove(repo, dry_run=True))
63 finally:
64 repo.ui.quiet = oldquiet
65
57 def clearcaches(cl):
66 def clearcaches(cl):
58 # behave somewhat consistently across internal API changes
67 # behave somewhat consistently across internal API changes
59 if util.safehasattr(cl, 'clearcaches'):
68 if util.safehasattr(cl, 'clearcaches'):
60 cl.clearcaches()
69 cl.clearcaches()
61 elif util.safehasattr(cl, '_nodecache'):
70 elif util.safehasattr(cl, '_nodecache'):
62 from mercurial.node import nullid, nullrev
71 from mercurial.node import nullid, nullrev
63 cl._nodecache = {nullid: nullrev}
72 cl._nodecache = {nullid: nullrev}
64 cl._nodepos = None
73 cl._nodepos = None
65
74
66 @command('perfheads')
75 @command('perfheads')
67 def perfheads(ui, repo):
76 def perfheads(ui, repo):
68 cl = repo.changelog
77 cl = repo.changelog
69 def d():
78 def d():
70 len(cl.headrevs())
79 len(cl.headrevs())
71 clearcaches(cl)
80 clearcaches(cl)
72 timer(d)
81 timer(d)
73
82
74 @command('perftags')
83 @command('perftags')
75 def perftags(ui, repo):
84 def perftags(ui, repo):
76 import mercurial.changelog, mercurial.manifest
85 import mercurial.changelog, mercurial.manifest
77 def t():
86 def t():
78 repo.changelog = mercurial.changelog.changelog(repo.sopener)
87 repo.changelog = mercurial.changelog.changelog(repo.sopener)
79 repo.manifest = mercurial.manifest.manifest(repo.sopener)
88 repo.manifest = mercurial.manifest.manifest(repo.sopener)
80 repo._tags = None
89 repo._tags = None
81 return len(repo.tags())
90 return len(repo.tags())
82 timer(t)
91 timer(t)
83
92
84 @command('perfancestors')
93 @command('perfancestors')
85 def perfancestors(ui, repo):
94 def perfancestors(ui, repo):
86 heads = repo.changelog.headrevs()
95 heads = repo.changelog.headrevs()
87 def d():
96 def d():
88 for a in repo.changelog.ancestors(heads):
97 for a in repo.changelog.ancestors(heads):
89 pass
98 pass
90 timer(d)
99 timer(d)
91
100
92 @command('perfancestorset')
101 @command('perfancestorset')
93 def perfancestorset(ui, repo, revset):
102 def perfancestorset(ui, repo, revset):
94 revs = repo.revs(revset)
103 revs = repo.revs(revset)
95 heads = repo.changelog.headrevs()
104 heads = repo.changelog.headrevs()
96 def d():
105 def d():
97 s = repo.changelog.ancestors(heads)
106 s = repo.changelog.ancestors(heads)
98 for rev in revs:
107 for rev in revs:
99 rev in s
108 rev in s
100 timer(d)
109 timer(d)
101
110
102 @command('perfdirs')
111 @command('perfdirs')
103 def perfdirs(ui, repo):
112 def perfdirs(ui, repo):
104 dirstate = repo.dirstate
113 dirstate = repo.dirstate
105 'a' in dirstate
114 'a' in dirstate
106 def d():
115 def d():
107 dirstate.dirs()
116 dirstate.dirs()
108 del dirstate._dirs
117 del dirstate._dirs
109 timer(d)
118 timer(d)
110
119
111 @command('perfdirstate')
120 @command('perfdirstate')
112 def perfdirstate(ui, repo):
121 def perfdirstate(ui, repo):
113 "a" in repo.dirstate
122 "a" in repo.dirstate
114 def d():
123 def d():
115 repo.dirstate.invalidate()
124 repo.dirstate.invalidate()
116 "a" in repo.dirstate
125 "a" in repo.dirstate
117 timer(d)
126 timer(d)
118
127
119 @command('perfdirstatedirs')
128 @command('perfdirstatedirs')
120 def perfdirstatedirs(ui, repo):
129 def perfdirstatedirs(ui, repo):
121 "a" in repo.dirstate
130 "a" in repo.dirstate
122 def d():
131 def d():
123 "a" in repo.dirstate._dirs
132 "a" in repo.dirstate._dirs
124 del repo.dirstate._dirs
133 del repo.dirstate._dirs
125 timer(d)
134 timer(d)
126
135
127 @command('perfdirstatewrite')
136 @command('perfdirstatewrite')
128 def perfdirstatewrite(ui, repo):
137 def perfdirstatewrite(ui, repo):
129 ds = repo.dirstate
138 ds = repo.dirstate
130 "a" in ds
139 "a" in ds
131 def d():
140 def d():
132 ds._dirty = True
141 ds._dirty = True
133 ds.write()
142 ds.write()
134 timer(d)
143 timer(d)
135
144
136 @command('perfmergecalculate',
145 @command('perfmergecalculate',
137 [('r', 'rev', '.', 'rev to merge against')])
146 [('r', 'rev', '.', 'rev to merge against')])
138 def perfmergecalculate(ui, repo, rev):
147 def perfmergecalculate(ui, repo, rev):
139 wctx = repo[None]
148 wctx = repo[None]
140 rctx = scmutil.revsingle(repo, rev, rev)
149 rctx = scmutil.revsingle(repo, rev, rev)
141 ancestor = wctx.ancestor(rctx)
150 ancestor = wctx.ancestor(rctx)
142 # we don't want working dir files to be stat'd in the benchmark, so prime
151 # we don't want working dir files to be stat'd in the benchmark, so prime
143 # that cache
152 # that cache
144 wctx.dirty()
153 wctx.dirty()
145 def d():
154 def d():
146 # acceptremote is True because we don't want prompts in the middle of
155 # acceptremote is True because we don't want prompts in the middle of
147 # our benchmark
156 # our benchmark
148 merge.calculateupdates(repo, wctx, rctx, ancestor, False, False, False,
157 merge.calculateupdates(repo, wctx, rctx, ancestor, False, False, False,
149 acceptremote=True)
158 acceptremote=True)
150 timer(d)
159 timer(d)
151
160
152 @command('perfmanifest')
161 @command('perfmanifest')
153 def perfmanifest(ui, repo):
162 def perfmanifest(ui, repo):
154 def d():
163 def d():
155 t = repo.manifest.tip()
164 t = repo.manifest.tip()
156 m = repo.manifest.read(t)
165 m = repo.manifest.read(t)
157 repo.manifest.mapcache = None
166 repo.manifest.mapcache = None
158 repo.manifest._cache = None
167 repo.manifest._cache = None
159 timer(d)
168 timer(d)
160
169
161 @command('perfchangeset')
170 @command('perfchangeset')
162 def perfchangeset(ui, repo, rev):
171 def perfchangeset(ui, repo, rev):
163 n = repo[rev].node()
172 n = repo[rev].node()
164 def d():
173 def d():
165 c = repo.changelog.read(n)
174 c = repo.changelog.read(n)
166 #repo.changelog._cache = None
175 #repo.changelog._cache = None
167 timer(d)
176 timer(d)
168
177
169 @command('perfindex')
178 @command('perfindex')
170 def perfindex(ui, repo):
179 def perfindex(ui, repo):
171 import mercurial.revlog
180 import mercurial.revlog
172 mercurial.revlog._prereadsize = 2**24 # disable lazy parser in old hg
181 mercurial.revlog._prereadsize = 2**24 # disable lazy parser in old hg
173 n = repo["tip"].node()
182 n = repo["tip"].node()
174 def d():
183 def d():
175 cl = mercurial.revlog.revlog(repo.sopener, "00changelog.i")
184 cl = mercurial.revlog.revlog(repo.sopener, "00changelog.i")
176 cl.rev(n)
185 cl.rev(n)
177 timer(d)
186 timer(d)
178
187
179 @command('perfstartup')
188 @command('perfstartup')
180 def perfstartup(ui, repo):
189 def perfstartup(ui, repo):
181 cmd = sys.argv[0]
190 cmd = sys.argv[0]
182 def d():
191 def d():
183 os.system("HGRCPATH= %s version -q > /dev/null" % cmd)
192 os.system("HGRCPATH= %s version -q > /dev/null" % cmd)
184 timer(d)
193 timer(d)
185
194
186 @command('perfparents')
195 @command('perfparents')
187 def perfparents(ui, repo):
196 def perfparents(ui, repo):
188 nl = [repo.changelog.node(i) for i in xrange(1000)]
197 nl = [repo.changelog.node(i) for i in xrange(1000)]
189 def d():
198 def d():
190 for n in nl:
199 for n in nl:
191 repo.changelog.parents(n)
200 repo.changelog.parents(n)
192 timer(d)
201 timer(d)
193
202
194 @command('perflookup')
203 @command('perflookup')
195 def perflookup(ui, repo, rev):
204 def perflookup(ui, repo, rev):
196 timer(lambda: len(repo.lookup(rev)))
205 timer(lambda: len(repo.lookup(rev)))
197
206
198 @command('perfrevrange')
207 @command('perfrevrange')
199 def perfrevrange(ui, repo, *specs):
208 def perfrevrange(ui, repo, *specs):
200 revrange = scmutil.revrange
209 revrange = scmutil.revrange
201 timer(lambda: len(revrange(repo, specs)))
210 timer(lambda: len(revrange(repo, specs)))
202
211
203 @command('perfnodelookup')
212 @command('perfnodelookup')
204 def perfnodelookup(ui, repo, rev):
213 def perfnodelookup(ui, repo, rev):
205 import mercurial.revlog
214 import mercurial.revlog
206 mercurial.revlog._prereadsize = 2**24 # disable lazy parser in old hg
215 mercurial.revlog._prereadsize = 2**24 # disable lazy parser in old hg
207 n = repo[rev].node()
216 n = repo[rev].node()
208 cl = mercurial.revlog.revlog(repo.sopener, "00changelog.i")
217 cl = mercurial.revlog.revlog(repo.sopener, "00changelog.i")
209 def d():
218 def d():
210 cl.rev(n)
219 cl.rev(n)
211 clearcaches(cl)
220 clearcaches(cl)
212 timer(d)
221 timer(d)
213
222
214 @command('perflog',
223 @command('perflog',
215 [('', 'rename', False, 'ask log to follow renames')])
224 [('', 'rename', False, 'ask log to follow renames')])
216 def perflog(ui, repo, **opts):
225 def perflog(ui, repo, **opts):
217 ui.pushbuffer()
226 ui.pushbuffer()
218 timer(lambda: commands.log(ui, repo, rev=[], date='', user='',
227 timer(lambda: commands.log(ui, repo, rev=[], date='', user='',
219 copies=opts.get('rename')))
228 copies=opts.get('rename')))
220 ui.popbuffer()
229 ui.popbuffer()
221
230
222 @command('perftemplating')
231 @command('perftemplating')
223 def perftemplating(ui, repo):
232 def perftemplating(ui, repo):
224 ui.pushbuffer()
233 ui.pushbuffer()
225 timer(lambda: commands.log(ui, repo, rev=[], date='', user='',
234 timer(lambda: commands.log(ui, repo, rev=[], date='', user='',
226 template='{date|shortdate} [{rev}:{node|short}]'
235 template='{date|shortdate} [{rev}:{node|short}]'
227 ' {author|person}: {desc|firstline}\n'))
236 ' {author|person}: {desc|firstline}\n'))
228 ui.popbuffer()
237 ui.popbuffer()
229
238
230 @command('perfcca')
239 @command('perfcca')
231 def perfcca(ui, repo):
240 def perfcca(ui, repo):
232 timer(lambda: scmutil.casecollisionauditor(ui, False, repo.dirstate))
241 timer(lambda: scmutil.casecollisionauditor(ui, False, repo.dirstate))
233
242
234 @command('perffncacheload')
243 @command('perffncacheload')
235 def perffncacheload(ui, repo):
244 def perffncacheload(ui, repo):
236 s = repo.store
245 s = repo.store
237 def d():
246 def d():
238 s.fncache._load()
247 s.fncache._load()
239 timer(d)
248 timer(d)
240
249
241 @command('perffncachewrite')
250 @command('perffncachewrite')
242 def perffncachewrite(ui, repo):
251 def perffncachewrite(ui, repo):
243 s = repo.store
252 s = repo.store
244 s.fncache._load()
253 s.fncache._load()
245 def d():
254 def d():
246 s.fncache._dirty = True
255 s.fncache._dirty = True
247 s.fncache.write()
256 s.fncache.write()
248 timer(d)
257 timer(d)
249
258
250 @command('perffncacheencode')
259 @command('perffncacheencode')
251 def perffncacheencode(ui, repo):
260 def perffncacheencode(ui, repo):
252 s = repo.store
261 s = repo.store
253 s.fncache._load()
262 s.fncache._load()
254 def d():
263 def d():
255 for p in s.fncache.entries:
264 for p in s.fncache.entries:
256 s.encode(p)
265 s.encode(p)
257 timer(d)
266 timer(d)
258
267
259 @command('perfdiffwd')
268 @command('perfdiffwd')
260 def perfdiffwd(ui, repo):
269 def perfdiffwd(ui, repo):
261 """Profile diff of working directory changes"""
270 """Profile diff of working directory changes"""
262 options = {
271 options = {
263 'w': 'ignore_all_space',
272 'w': 'ignore_all_space',
264 'b': 'ignore_space_change',
273 'b': 'ignore_space_change',
265 'B': 'ignore_blank_lines',
274 'B': 'ignore_blank_lines',
266 }
275 }
267
276
268 for diffopt in ('', 'w', 'b', 'B', 'wB'):
277 for diffopt in ('', 'w', 'b', 'B', 'wB'):
269 opts = dict((options[c], '1') for c in diffopt)
278 opts = dict((options[c], '1') for c in diffopt)
270 def d():
279 def d():
271 ui.pushbuffer()
280 ui.pushbuffer()
272 commands.diff(ui, repo, **opts)
281 commands.diff(ui, repo, **opts)
273 ui.popbuffer()
282 ui.popbuffer()
274 title = 'diffopts: %s' % (diffopt and ('-' + diffopt) or 'none')
283 title = 'diffopts: %s' % (diffopt and ('-' + diffopt) or 'none')
275 timer(d, title)
284 timer(d, title)
276
285
277 @command('perfrevlog',
286 @command('perfrevlog',
278 [('d', 'dist', 100, 'distance between the revisions')],
287 [('d', 'dist', 100, 'distance between the revisions')],
279 "[INDEXFILE]")
288 "[INDEXFILE]")
280 def perfrevlog(ui, repo, file_, **opts):
289 def perfrevlog(ui, repo, file_, **opts):
281 from mercurial import revlog
290 from mercurial import revlog
282 dist = opts['dist']
291 dist = opts['dist']
283 def d():
292 def d():
284 r = revlog.revlog(lambda fn: open(fn, 'rb'), file_)
293 r = revlog.revlog(lambda fn: open(fn, 'rb'), file_)
285 for x in xrange(0, len(r), dist):
294 for x in xrange(0, len(r), dist):
286 r.revision(r.node(x))
295 r.revision(r.node(x))
287
296
288 timer(d)
297 timer(d)
289
298
290 @command('perfrevset',
299 @command('perfrevset',
291 [('C', 'clear', False, 'clear volatile cache between each call.')],
300 [('C', 'clear', False, 'clear volatile cache between each call.')],
292 "REVSET")
301 "REVSET")
293 def perfrevset(ui, repo, expr, clear=False):
302 def perfrevset(ui, repo, expr, clear=False):
294 """benchmark the execution time of a revset
303 """benchmark the execution time of a revset
295
304
296 Use the --clean option if need to evaluate the impact of build volatile
305 Use the --clean option if need to evaluate the impact of build volatile
297 revisions set cache on the revset execution. Volatile cache hold filtered
306 revisions set cache on the revset execution. Volatile cache hold filtered
298 and obsolete related cache."""
307 and obsolete related cache."""
299 def d():
308 def d():
300 if clear:
309 if clear:
301 repo.invalidatevolatilesets()
310 repo.invalidatevolatilesets()
302 repo.revs(expr)
311 repo.revs(expr)
303 timer(d)
312 timer(d)
304
313
305 @command('perfvolatilesets')
314 @command('perfvolatilesets')
306 def perfvolatilesets(ui, repo, *names):
315 def perfvolatilesets(ui, repo, *names):
307 """benchmark the computation of various volatile set
316 """benchmark the computation of various volatile set
308
317
309 Volatile set computes element related to filtering and obsolescence."""
318 Volatile set computes element related to filtering and obsolescence."""
310 repo = repo.unfiltered()
319 repo = repo.unfiltered()
311
320
312 def getobs(name):
321 def getobs(name):
313 def d():
322 def d():
314 repo.invalidatevolatilesets()
323 repo.invalidatevolatilesets()
315 obsolete.getrevs(repo, name)
324 obsolete.getrevs(repo, name)
316 return d
325 return d
317
326
318 allobs = sorted(obsolete.cachefuncs)
327 allobs = sorted(obsolete.cachefuncs)
319 if names:
328 if names:
320 allobs = [n for n in allobs if n in names]
329 allobs = [n for n in allobs if n in names]
321
330
322 for name in allobs:
331 for name in allobs:
323 timer(getobs(name), title=name)
332 timer(getobs(name), title=name)
324
333
325 def getfiltered(name):
334 def getfiltered(name):
326 def d():
335 def d():
327 repo.invalidatevolatilesets()
336 repo.invalidatevolatilesets()
328 repoview.filteredrevs(repo, name)
337 repoview.filteredrevs(repo, name)
329 return d
338 return d
330
339
331 allfilter = sorted(repoview.filtertable)
340 allfilter = sorted(repoview.filtertable)
332 if names:
341 if names:
333 allfilter = [n for n in allfilter if n in names]
342 allfilter = [n for n in allfilter if n in names]
334
343
335 for name in allfilter:
344 for name in allfilter:
336 timer(getfiltered(name), title=name)
345 timer(getfiltered(name), title=name)
337
346
338 @command('perfbranchmap',
347 @command('perfbranchmap',
339 [('f', 'full', False,
348 [('f', 'full', False,
340 'Includes build time of subset'),
349 'Includes build time of subset'),
341 ])
350 ])
342 def perfbranchmap(ui, repo, full=False):
351 def perfbranchmap(ui, repo, full=False):
343 """benchmark the update of a branchmap
352 """benchmark the update of a branchmap
344
353
345 This benchmarks the full repo.branchmap() call with read and write disabled
354 This benchmarks the full repo.branchmap() call with read and write disabled
346 """
355 """
347 def getbranchmap(filtername):
356 def getbranchmap(filtername):
348 """generate a benchmark function for the filtername"""
357 """generate a benchmark function for the filtername"""
349 if filtername is None:
358 if filtername is None:
350 view = repo
359 view = repo
351 else:
360 else:
352 view = repo.filtered(filtername)
361 view = repo.filtered(filtername)
353 def d():
362 def d():
354 if full:
363 if full:
355 view._branchcaches.clear()
364 view._branchcaches.clear()
356 else:
365 else:
357 view._branchcaches.pop(filtername, None)
366 view._branchcaches.pop(filtername, None)
358 view.branchmap()
367 view.branchmap()
359 return d
368 return d
360 # add filter in smaller subset to bigger subset
369 # add filter in smaller subset to bigger subset
361 possiblefilters = set(repoview.filtertable)
370 possiblefilters = set(repoview.filtertable)
362 allfilters = []
371 allfilters = []
363 while possiblefilters:
372 while possiblefilters:
364 for name in possiblefilters:
373 for name in possiblefilters:
365 subset = repoview.subsettable.get(name)
374 subset = repoview.subsettable.get(name)
366 if subset not in possiblefilters:
375 if subset not in possiblefilters:
367 break
376 break
368 else:
377 else:
369 assert False, 'subset cycle %s!' % possiblefilters
378 assert False, 'subset cycle %s!' % possiblefilters
370 allfilters.append(name)
379 allfilters.append(name)
371 possiblefilters.remove(name)
380 possiblefilters.remove(name)
372
381
373 # warm the cache
382 # warm the cache
374 if not full:
383 if not full:
375 for name in allfilters:
384 for name in allfilters:
376 repo.filtered(name).branchmap()
385 repo.filtered(name).branchmap()
377 # add unfiltered
386 # add unfiltered
378 allfilters.append(None)
387 allfilters.append(None)
379 oldread = branchmap.read
388 oldread = branchmap.read
380 oldwrite = branchmap.branchcache.write
389 oldwrite = branchmap.branchcache.write
381 try:
390 try:
382 branchmap.read = lambda repo: None
391 branchmap.read = lambda repo: None
383 branchmap.write = lambda repo: None
392 branchmap.write = lambda repo: None
384 for name in allfilters:
393 for name in allfilters:
385 timer(getbranchmap(name), title=str(name))
394 timer(getbranchmap(name), title=str(name))
386 finally:
395 finally:
387 branchmap.read = oldread
396 branchmap.read = oldread
388 branchmap.branchcache.write = oldwrite
397 branchmap.branchcache.write = oldwrite
General Comments 0
You need to be logged in to leave comments. Login now