comparison mercurial/localrepo.py @ 13707:296e78744d32

changegroupsubset: more minor cleanups - remove more excessive comments - simplify some sorting operations - rename some variables - replace identity with a lambda
author Matt Mackall <mpm@selenic.com>
date Sun, 20 Mar 2011 19:43:28 -0500
parents 7beb9834d185
children ce9b3043b79d
comparison
equal deleted inserted replaced
13706:7beb9834d185 13707:296e78744d32
1442 cl = self.changelog 1442 cl = self.changelog
1443 mf = self.manifest 1443 mf = self.manifest
1444 mfs = {} # needed manifests 1444 mfs = {} # needed manifests
1445 fnodes = {} # needed file nodes 1445 fnodes = {} # needed file nodes
1446 1446
1447 # Compute the list of changesets in this changegroup.
1448 # Some bases may turn out to be superfluous, and some heads may be
1449 # too. nodesbetween will return the minimal set of bases and heads
1450 # necessary to re-create the changegroup.
1451 if not bases: 1447 if not bases:
1452 bases = [nullid] 1448 bases = [nullid]
1453 csets, bases, heads = cl.nodesbetween(bases, heads) 1449 csets, bases, heads = cl.nodesbetween(bases, heads)
1454 1450
1455 # can we go through the fast path ? 1451 # can we go through the fast path ?
1456 heads.sort() 1452 heads.sort()
1457 allheads = self.heads() 1453 if heads == sorted(self.heads()):
1458 allheads.sort()
1459 if heads == allheads:
1460 return self._changegroup(csets, source) 1454 return self._changegroup(csets, source)
1461 1455
1462 # slow path 1456 # slow path
1463 self.hook('preoutgoing', throw=True, source=source) 1457 self.hook('preoutgoing', throw=True, source=source)
1464 self.changegroupinfo(csets, source) 1458 self.changegroupinfo(csets, source)
1465 1459
1466 # We assume that all ancestors of bases are known 1460 # We assume that all ancestors of bases are known
1467 commonrevs = set(cl.ancestors(*[cl.rev(n) for n in bases])) 1461 commonrevs = set(cl.ancestors(*[cl.rev(n) for n in bases]))
1468
1469 # A changeset always belongs to itself, so the changenode lookup
1470 # function for a changenode is identity.
1471 def identity(x):
1472 return x
1473 1462
1474 # A function generating function that sets up the initial environment 1463 # A function generating function that sets up the initial environment
1475 # the inner function. 1464 # the inner function.
1476 def filenode_collector(changedfiles): 1465 def filenode_collector(changedfiles):
1477 # This gathers information from each manifestnode included in the 1466 # This gathers information from each manifestnode included in the
1479 # so we can include those in the changegroup too. 1468 # so we can include those in the changegroup too.
1480 # 1469 #
1481 # It also remembers which changenode each filenode belongs to. It 1470 # It also remembers which changenode each filenode belongs to. It
1482 # does this by assuming the a filenode belongs to the changenode 1471 # does this by assuming the a filenode belongs to the changenode
1483 # the first manifest that references it belongs to. 1472 # the first manifest that references it belongs to.
1484 def collect(mannode): 1473 def collect(mnode):
1485 r = mf.rev(mannode) 1474 r = mf.rev(mnode)
1486 if mf.deltaparent(r) in mf.parentrevs(r): 1475 if mf.deltaparent(r) in mf.parentrevs(r):
1487 # If the previous rev is one of the parents, 1476 # If the previous rev is one of the parents,
1488 # we only need to see a diff. 1477 # we only need to see a diff.
1489 deltamf = mf.readdelta(mannode) 1478 deltamf = mf.readdelta(mnode)
1490 # For each line in the delta 1479 # For each line in the delta
1491 for f, fnode in deltamf.iteritems(): 1480 for f, fnode in deltamf.iteritems():
1492 # And if the file is in the list of files we care 1481 # And if the file is in the list of files we care
1493 # about. 1482 # about.
1494 if f in changedfiles: 1483 if f in changedfiles:
1495 # Get the changenode this manifest belongs to 1484 # Get the changenode this manifest belongs to
1496 clnode = mfs[mannode] 1485 clnode = mfs[mnode]
1497 # Create the set of filenodes for the file if 1486 # Create the set of filenodes for the file if
1498 # there isn't one already. 1487 # there isn't one already.
1499 ndset = fnodes.setdefault(f, {}) 1488 ndset = fnodes.setdefault(f, {})
1500 # And set the filenode's changelog node to the 1489 # And set the filenode's changelog node to the
1501 # manifest's if it hasn't been set already. 1490 # manifest's if it hasn't been set already.
1502 ndset.setdefault(fnode, clnode) 1491 ndset.setdefault(fnode, clnode)
1503 else: 1492 else:
1504 # Otherwise we need a full manifest. 1493 # Otherwise we need a full manifest.
1505 m = mf.read(mannode) 1494 m = mf.read(mnode)
1506 # For every file in we care about. 1495 # For every file in we care about.
1507 for f in changedfiles: 1496 for f in changedfiles:
1508 fnode = m.get(f, None) 1497 fnode = m.get(f, None)
1509 # If it's in the manifest 1498 # If it's in the manifest
1510 if fnode is not None: 1499 if fnode is not None:
1511 # See comments above. 1500 # See comments above.
1512 clnode = mfs[mannode] 1501 clnode = mfs[mnode]
1513 ndset = fnodes.setdefault(f, {}) 1502 ndset = fnodes.setdefault(f, {})
1514 ndset.setdefault(fnode, clnode) 1503 ndset.setdefault(fnode, clnode)
1515 return collect 1504 return collect
1516 1505
1517 # If we determine that a particular file or manifest node must be a 1506 # If we determine that a particular file or manifest node must be a
1539 changedfiles = set() 1528 changedfiles = set()
1540 collect = changegroup.collector(cl, mfs, changedfiles) 1529 collect = changegroup.collector(cl, mfs, changedfiles)
1541 1530
1542 # Create a changenode group generator that will call our functions 1531 # Create a changenode group generator that will call our functions
1543 # back to lookup the owning changenode and collect information. 1532 # back to lookup the owning changenode and collect information.
1544 group = cl.group(csets, identity, collect) 1533 group = cl.group(csets, lambda x: x, collect)
1545 for cnt, chnk in enumerate(group): 1534 for cnt, chnk in enumerate(group):
1546 yield chnk 1535 yield chnk
1547 # revlog.group yields three entries per node, so 1536 # revlog.group yields three entries per node, so
1548 # dividing by 3 gives an approximation of how many 1537 # dividing by 3 gives an approximation of how many
1549 # nodes have been processed. 1538 # nodes have been processed.
1584 # If any filenodes are left, generate the group for them, 1573 # If any filenodes are left, generate the group for them,
1585 # otherwise don't bother. 1574 # otherwise don't bother.
1586 if missingfnodes: 1575 if missingfnodes:
1587 yield changegroup.chunkheader(len(fname)) 1576 yield changegroup.chunkheader(len(fname))
1588 yield fname 1577 yield fname
1589 # Sort the filenodes by their revision # (topological order)
1590 nodeiter = list(missingfnodes)
1591 nodeiter.sort(key=filerevlog.rev)
1592 # Create a group generator and only pass in a changenode 1578 # Create a group generator and only pass in a changenode
1593 # lookup function as we need to collect no information 1579 # lookup function as we need to collect no information
1594 # from filenodes. 1580 # from filenodes.
1595 group = filerevlog.group(nodeiter, 1581 group = filerevlog.group(
1596 lambda fnode: missingfnodes[fnode]) 1582 sorted(missingfnodes, key=filerevlog.rev),
1583 lambda fnode: missingfnodes[fnode])
1597 for chnk in group: 1584 for chnk in group:
1598 # even though we print the same progress on 1585 # even though we print the same progress on
1599 # most loop iterations, put the progress call 1586 # most loop iterations, put the progress call
1600 # here so that time estimates (if any) can be updated 1587 # here so that time estimates (if any) can be updated
1601 self.ui.progress( 1588 self.ui.progress(