comparison mercurial/tags.py @ 31705:5eb4d206202b

tags: extract fnode retrieval into its own function My main goal here is to be able to reuse this logic easily. As a side effect this important logic is now insulated and the code is clearer.
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Tue, 28 Mar 2017 06:01:31 +0200
parents a719f3315366
children 63d4deda1b31
comparison
equal deleted inserted replaced
31704:cbe0bea82c79 31705:5eb4d206202b
339 if not len(repo.file('.hgtags')): 339 if not len(repo.file('.hgtags')):
340 # No tags have ever been committed, so we can avoid a 340 # No tags have ever been committed, so we can avoid a
341 # potentially expensive search. 341 # potentially expensive search.
342 return ([], {}, valid, None, True) 342 return ([], {}, valid, None, True)
343 343
344 starttime = util.timer()
345 344
346 # Now we have to lookup the .hgtags filenode for every new head. 345 # Now we have to lookup the .hgtags filenode for every new head.
347 # This is the most expensive part of finding tags, so performance 346 # This is the most expensive part of finding tags, so performance
348 # depends primarily on the size of newheads. Worst case: no cache 347 # depends primarily on the size of newheads. Worst case: no cache
349 # file, so newheads == repoheads. 348 # file, so newheads == repoheads.
349 cachefnode = _getfnodes(ui, repo, repoheads)
350
351 # Caller has to iterate over all heads, but can use the filenodes in
352 # cachefnode to get to each .hgtags revision quickly.
353 return (repoheads, cachefnode, valid, None, True)
354
355 def _getfnodes(ui, repo, nodes):
356 """return .hgtags fnodes for a list of changeset nodes
357
358 Return value is a {node: fnode} mapping. There will be no entry for nodes
359 without a '.hgtags' file.
360 """
361 starttime = util.timer()
350 fnodescache = hgtagsfnodescache(repo.unfiltered()) 362 fnodescache = hgtagsfnodescache(repo.unfiltered())
351 cachefnode = {} 363 cachefnode = {}
352 for head in reversed(repoheads): 364 for head in reversed(nodes):
353 fnode = fnodescache.getfnode(head) 365 fnode = fnodescache.getfnode(head)
354 if fnode != nullid: 366 if fnode != nullid:
355 cachefnode[head] = fnode 367 cachefnode[head] = fnode
356 368
357 fnodescache.write() 369 fnodescache.write()
359 duration = util.timer() - starttime 371 duration = util.timer() - starttime
360 ui.log('tagscache', 372 ui.log('tagscache',
361 '%d/%d cache hits/lookups in %0.4f ' 373 '%d/%d cache hits/lookups in %0.4f '
362 'seconds\n', 374 'seconds\n',
363 fnodescache.hitcount, fnodescache.lookupcount, duration) 375 fnodescache.hitcount, fnodescache.lookupcount, duration)
364 376 return cachefnode
365 # Caller has to iterate over all heads, but can use the filenodes in
366 # cachefnode to get to each .hgtags revision quickly.
367 return (repoheads, cachefnode, valid, None, True)
368 377
369 def _writetagcache(ui, repo, valid, cachetags): 378 def _writetagcache(ui, repo, valid, cachetags):
370 filename = _filename(repo) 379 filename = _filename(repo)
371 try: 380 try:
372 cachefile = repo.vfs(filename, 'w', atomictemp=True) 381 cachefile = repo.vfs(filename, 'w', atomictemp=True)