comparison mercurial/localrepo.py @ 11659:deecf1953e7b

changegroupsubset(): refactor the prune() functions
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Thu, 22 Jul 2010 23:13:03 +0200
parents 898a5305f342
children 5d62df44cac0
comparison
equal deleted inserted replaced
11658:9dc1838d3b8b 11659:deecf1953e7b
1339 1339
1340 # A changeset always belongs to itself, so the changenode lookup 1340 # A changeset always belongs to itself, so the changenode lookup
1341 # function for a changenode is identity. 1341 # function for a changenode is identity.
1342 def identity(x): 1342 def identity(x):
1343 return x 1343 return x
1344
1345 # If we determine that a particular file or manifest node must be a
1346 # node that the recipient of the changegroup will already have, we can
1347 # also assume the recipient will have all the parents. This function
1348 # prunes them from the set of missing nodes.
1349 def prune_parents(revlog, hasset, msngset):
1350 for r in revlog.ancestors(*[revlog.rev(n) for n in hasset]):
1351 msngset.pop(revlog.node(r), None)
1352 1344
1353 # A function generating function that sets up the initial environment 1345 # A function generating function that sets up the initial environment
1354 # the inner function. 1346 # the inner function.
1355 def filenode_collector(changedfiles): 1347 def filenode_collector(changedfiles):
1356 # This gathers information from each manifestnode included in the 1348 # This gathers information from each manifestnode included in the
1391 clnode = msng_mnfst_set[mnfstnode] 1383 clnode = msng_mnfst_set[mnfstnode]
1392 ndset = msng_filenode_set.setdefault(f, {}) 1384 ndset = msng_filenode_set.setdefault(f, {})
1393 ndset.setdefault(fnode, clnode) 1385 ndset.setdefault(fnode, clnode)
1394 return collect_msng_filenodes 1386 return collect_msng_filenodes
1395 1387
1396 # We have a list of filenodes we think we need for a file, lets remove 1388 # If we determine that a particular file or manifest node must be a
1397 # all those we know the recipient must have. 1389 # node that the recipient of the changegroup will already have, we can
1398 def prune_filenodes(f, filerevlog, missingnodes): 1390 # also assume the recipient will have all the parents. This function
1391 # prunes them from the set of missing nodes.
1392 # XXX is it even useful? the testsuite doesn't trigger it
1393 def prune(revlog, missingnodes):
1399 hasset = set() 1394 hasset = set()
1400 # If a 'missing' filenode thinks it belongs to a changenode we 1395 # If a 'missing' filenode thinks it belongs to a changenode we
1401 # assume the recipient must have, then the recipient must have 1396 # assume the recipient must have, then the recipient must have
1402 # that filenode. 1397 # that filenode.
1403 for n in missingnodes: 1398 for n in missingnodes:
1404 clnode = cl.node(filerevlog.linkrev(filerevlog.rev(n))) 1399 clnode = cl.node(revlog.linkrev(revlog.rev(n)))
1405 if clnode in has_cl_set: 1400 if clnode in has_cl_set:
1406 hasset.add(n) 1401 hasset.add(n)
1407 prune_parents(filerevlog, hasset, missingnodes) 1402 for r in revlog.ancestors(*[revlog.rev(n) for n in hasset]):
1403 missingnodes.pop(revlog.node(r), None)
1408 1404
1409 # Add the nodes that were explicitly requested. 1405 # Add the nodes that were explicitly requested.
1410 def add_extra_nodes(name, nodes): 1406 def add_extra_nodes(name, nodes):
1411 if not extranodes or name not in extranodes: 1407 if not extranodes or name not in extranodes:
1412 return 1408 return
1430 yield chnk 1426 yield chnk
1431 self.ui.progress(_('bundling changes'), cnt, unit=_('chunks')) 1427 self.ui.progress(_('bundling changes'), cnt, unit=_('chunks'))
1432 cnt += 1 1428 cnt += 1
1433 self.ui.progress(_('bundling changes'), None) 1429 self.ui.progress(_('bundling changes'), None)
1434 1430
1435 1431 prune(mnfst, msng_mnfst_set)
1436 # Figure out which manifest nodes (of the ones we think might be
1437 # part of the changegroup) the recipient must know about and
1438 # remove them from the changegroup.
1439 has_mnfst_set = set()
1440 for n in msng_mnfst_set:
1441 # If a 'missing' manifest thinks it belongs to a changenode
1442 # the recipient is assumed to have, obviously the recipient
1443 # must have that manifest.
1444 linknode = cl.node(mnfst.linkrev(mnfst.rev(n)))
1445 if linknode in has_cl_set:
1446 has_mnfst_set.add(n)
1447 prune_parents(mnfst, has_mnfst_set, msng_mnfst_set)
1448 add_extra_nodes(1, msng_mnfst_set) 1432 add_extra_nodes(1, msng_mnfst_set)
1449 msng_mnfst_lst = msng_mnfst_set.keys() 1433 msng_mnfst_lst = msng_mnfst_set.keys()
1450 # Sort the manifestnodes by revision number. 1434 # Sort the manifestnodes by revision number.
1451 msng_mnfst_lst.sort(key=mnfst.rev) 1435 msng_mnfst_lst.sort(key=mnfst.rev)
1452 # Create a generator for the manifestnodes that calls our lookup 1436 # Create a generator for the manifestnodes that calls our lookup
1479 if not len(filerevlog): 1463 if not len(filerevlog):
1480 raise util.Abort(_("empty or missing revlog for %s") % fname) 1464 raise util.Abort(_("empty or missing revlog for %s") % fname)
1481 # Toss out the filenodes that the recipient isn't really 1465 # Toss out the filenodes that the recipient isn't really
1482 # missing. 1466 # missing.
1483 missingfnodes = msng_filenode_set.pop(fname, {}) 1467 missingfnodes = msng_filenode_set.pop(fname, {})
1484 prune_filenodes(fname, filerevlog, missingfnodes) 1468 prune(filerevlog, missingfnodes)
1485 add_extra_nodes(fname, missingfnodes) 1469 add_extra_nodes(fname, missingfnodes)
1486 # If any filenodes are left, generate the group for them, 1470 # If any filenodes are left, generate the group for them,
1487 # otherwise don't bother. 1471 # otherwise don't bother.
1488 if missingfnodes: 1472 if missingfnodes:
1489 yield changegroup.chunkheader(len(fname)) 1473 yield changegroup.chunkheader(len(fname))