comparison mercurial/localrepo.py @ 13810:0252abaafb8a

changegroup: refactor prune as a filter
author Matt Mackall <mpm@selenic.com>
date Wed, 30 Mar 2011 17:50:34 -0500
parents e6f795494d4f
children 65c1d309ab91
comparison
equal deleted inserted replaced
13809:e6f795494d4f 13810:0252abaafb8a
1486 1486
1487 # slow path 1487 # slow path
1488 self.hook('preoutgoing', throw=True, source=source) 1488 self.hook('preoutgoing', throw=True, source=source)
1489 self.changegroupinfo(csets, source) 1489 self.changegroupinfo(csets, source)
1490 1490
1491 # If we determine that a particular file or manifest node must be a 1491 # filter any nodes that claim to be part of the known set
1492 # node that the recipient of the changegroup will already have, we can 1492 def prune(revlog, missing):
1493 # also assume the recipient will have all the parents. This function 1493 for n in missing:
1494 # prunes them from the set of missing nodes. 1494 if revlog.linkrev(revlog.rev(n)) not in commonrevs:
1495 def prune(revlog, missingnodes): 1495 yield n
1496 # drop any nodes that claim to be part of a cset in commonrevs
1497 drop = set()
1498 for n in missingnodes:
1499 if revlog.linkrev(revlog.rev(n)) in commonrevs:
1500 drop.add(n)
1501 for n in drop:
1502 missingnodes.pop(n, None)
1503 1496
1504 # Now that we have all theses utility functions to help out and 1497 # Now that we have all theses utility functions to help out and
1505 # logically divide up the task, generate the group. 1498 # logically divide up the task, generate the group.
1506 def gengroup(): 1499 def gengroup():
1507 # The set of changed files starts empty. 1500 # The set of changed files starts empty.
1522 yield chunk 1515 yield chunk
1523 changecount = count[0] 1516 changecount = count[0]
1524 efiles = len(changedfiles) 1517 efiles = len(changedfiles)
1525 self.ui.progress(_('bundling'), None) 1518 self.ui.progress(_('bundling'), None)
1526 1519
1527 prune(mf, mfs)
1528 # Create a generator for the manifestnodes that calls our lookup 1520 # Create a generator for the manifestnodes that calls our lookup
1529 # and data collection functions back. 1521 # and data collection functions back.
1530 count = [0] 1522 count = [0]
1531 def mlookup(revlog, x): 1523 def mlookup(revlog, x):
1532 clnode = mfs[x] 1524 clnode = mfs[x]
1537 count[0] += 1 1529 count[0] += 1
1538 self.ui.progress(_('bundling'), count[0], 1530 self.ui.progress(_('bundling'), count[0],
1539 unit=_('manifests'), total=changecount) 1531 unit=_('manifests'), total=changecount)
1540 return mfs[x] 1532 return mfs[x]
1541 1533
1542 for chunk in mf.group(mfs, mlookup): 1534 for chunk in mf.group(prune(mf, mfs), mlookup):
1543 yield chunk 1535 yield chunk
1544 self.ui.progress(_('bundling'), None) 1536 self.ui.progress(_('bundling'), None)
1545 1537
1546 mfs.clear() 1538 mfs.clear()
1547 1539
1551 if not len(filerevlog): 1543 if not len(filerevlog):
1552 raise util.Abort(_("empty or missing revlog for %s") % fname) 1544 raise util.Abort(_("empty or missing revlog for %s") % fname)
1553 # Toss out the filenodes that the recipient isn't really 1545 # Toss out the filenodes that the recipient isn't really
1554 # missing. 1546 # missing.
1555 missingfnodes = fnodes.pop(fname, {}) 1547 missingfnodes = fnodes.pop(fname, {})
1556 prune(filerevlog, missingfnodes)
1557 first = True 1548 first = True
1558 1549
1559 def flookup(revlog, x): 1550 def flookup(revlog, x):
1560 # even though we print the same progress on 1551 # even though we print the same progress on
1561 # most loop iterations, put the progress call 1552 # most loop iterations, put the progress call
1563 self.ui.progress( 1554 self.ui.progress(
1564 _('bundling'), idx, item=fname, 1555 _('bundling'), idx, item=fname,
1565 unit=_('files'), total=efiles) 1556 unit=_('files'), total=efiles)
1566 return missingfnodes[x] 1557 return missingfnodes[x]
1567 1558
1568 for chunk in filerevlog.group(missingfnodes, flookup): 1559 for chunk in filerevlog.group(prune(filerevlog, missingfnodes),
1560 flookup):
1569 if first: 1561 if first:
1570 if chunk == changegroup.closechunk(): 1562 if chunk == changegroup.closechunk():
1571 break 1563 break
1572 yield changegroup.chunkheader(len(fname)) 1564 yield changegroup.chunkheader(len(fname))
1573 yield fname 1565 yield fname