Show More
@@ -1439,39 +1439,33 b' class localrepository(repo.repository):' | |||||
1439 | the changegroup a particular filenode or manifestnode belongs to. |
|
1439 | the changegroup a particular filenode or manifestnode belongs to. | |
1440 | """ |
|
1440 | """ | |
1441 |
|
1441 | |||
1442 | # Set up some initial variables |
|
|||
1443 | # Make it easy to refer to self.changelog |
|
|||
1444 | cl = self.changelog |
|
1442 | cl = self.changelog | |
|
1443 | mf = self.manifest | |||
|
1444 | mfs = {} # needed manifests | |||
|
1445 | fnodes = {} # needed file nodes | |||
|
1446 | ||||
1445 | # Compute the list of changesets in this changegroup. |
|
1447 | # Compute the list of changesets in this changegroup. | |
1446 | # Some bases may turn out to be superfluous, and some heads may be |
|
1448 | # Some bases may turn out to be superfluous, and some heads may be | |
1447 | # too. nodesbetween will return the minimal set of bases and heads |
|
1449 | # too. nodesbetween will return the minimal set of bases and heads | |
1448 | # necessary to re-create the changegroup. |
|
1450 | # necessary to re-create the changegroup. | |
1449 | if not bases: |
|
1451 | if not bases: | |
1450 | bases = [nullid] |
|
1452 | bases = [nullid] | |
1451 |
|
|
1453 | csets, bases, heads = cl.nodesbetween(bases, heads) | |
1452 |
|
1454 | |||
1453 | # can we go through the fast path ? |
|
1455 | # can we go through the fast path ? | |
1454 | heads.sort() |
|
1456 | heads.sort() | |
1455 | allheads = self.heads() |
|
1457 | allheads = self.heads() | |
1456 | allheads.sort() |
|
1458 | allheads.sort() | |
1457 | if heads == allheads: |
|
1459 | if heads == allheads: | |
1458 |
return self._changegroup( |
|
1460 | return self._changegroup(csets, source) | |
1459 |
|
1461 | |||
1460 | # slow path |
|
1462 | # slow path | |
1461 | self.hook('preoutgoing', throw=True, source=source) |
|
1463 | self.hook('preoutgoing', throw=True, source=source) | |
1462 |
|
1464 | self.changegroupinfo(csets, source) | ||
1463 | self.changegroupinfo(msng_cl_lst, source) |
|
|||
1464 |
|
1465 | |||
1465 | # We assume that all ancestors of bases are known |
|
1466 | # We assume that all ancestors of bases are known | |
1466 | commonrevs = set(cl.ancestors(*[cl.rev(n) for n in bases])) |
|
1467 | commonrevs = set(cl.ancestors(*[cl.rev(n) for n in bases])) | |
1467 |
|
1468 | |||
1468 | # Make it easy to refer to self.manifest |
|
|||
1469 | mnfst = self.manifest |
|
|||
1470 | # We don't know which manifests are missing yet |
|
|||
1471 | msng_mnfst_set = {} |
|
|||
1472 | # Nor do we know which filenodes are missing. |
|
|||
1473 | msng_filenode_set = {} |
|
|||
1474 |
|
||||
1475 | # A changeset always belongs to itself, so the changenode lookup |
|
1469 | # A changeset always belongs to itself, so the changenode lookup | |
1476 | # function for a changenode is identity. |
|
1470 | # function for a changenode is identity. | |
1477 | def identity(x): |
|
1471 | def identity(x): | |
@@ -1487,38 +1481,38 b' class localrepository(repo.repository):' | |||||
1487 | # It also remembers which changenode each filenode belongs to. It |
|
1481 | # It also remembers which changenode each filenode belongs to. It | |
1488 | # does this by assuming the a filenode belongs to the changenode |
|
1482 | # does this by assuming the a filenode belongs to the changenode | |
1489 | # the first manifest that references it belongs to. |
|
1483 | # the first manifest that references it belongs to. | |
1490 |
def collect |
|
1484 | def collect(mannode): | |
1491 |
r = m |
|
1485 | r = mf.rev(mannode) | |
1492 |
if m |
|
1486 | if mf.deltaparent(r) in mf.parentrevs(r): | |
1493 | # If the previous rev is one of the parents, |
|
1487 | # If the previous rev is one of the parents, | |
1494 | # we only need to see a diff. |
|
1488 | # we only need to see a diff. | |
1495 |
deltamf = m |
|
1489 | deltamf = mf.readdelta(mannode) | |
1496 | # For each line in the delta |
|
1490 | # For each line in the delta | |
1497 | for f, fnode in deltamf.iteritems(): |
|
1491 | for f, fnode in deltamf.iteritems(): | |
1498 | # And if the file is in the list of files we care |
|
1492 | # And if the file is in the list of files we care | |
1499 | # about. |
|
1493 | # about. | |
1500 | if f in changedfiles: |
|
1494 | if f in changedfiles: | |
1501 | # Get the changenode this manifest belongs to |
|
1495 | # Get the changenode this manifest belongs to | |
1502 |
clnode = m |
|
1496 | clnode = mfs[mannode] | |
1503 | # Create the set of filenodes for the file if |
|
1497 | # Create the set of filenodes for the file if | |
1504 | # there isn't one already. |
|
1498 | # there isn't one already. | |
1505 |
ndset = |
|
1499 | ndset = fnodes.setdefault(f, {}) | |
1506 | # And set the filenode's changelog node to the |
|
1500 | # And set the filenode's changelog node to the | |
1507 | # manifest's if it hasn't been set already. |
|
1501 | # manifest's if it hasn't been set already. | |
1508 | ndset.setdefault(fnode, clnode) |
|
1502 | ndset.setdefault(fnode, clnode) | |
1509 | else: |
|
1503 | else: | |
1510 | # Otherwise we need a full manifest. |
|
1504 | # Otherwise we need a full manifest. | |
1511 |
m = m |
|
1505 | m = mf.read(mannode) | |
1512 | # For every file in we care about. |
|
1506 | # For every file in we care about. | |
1513 | for f in changedfiles: |
|
1507 | for f in changedfiles: | |
1514 | fnode = m.get(f, None) |
|
1508 | fnode = m.get(f, None) | |
1515 | # If it's in the manifest |
|
1509 | # If it's in the manifest | |
1516 | if fnode is not None: |
|
1510 | if fnode is not None: | |
1517 | # See comments above. |
|
1511 | # See comments above. | |
1518 |
clnode = m |
|
1512 | clnode = mfs[mannode] | |
1519 |
ndset = |
|
1513 | ndset = fnodes.setdefault(f, {}) | |
1520 | ndset.setdefault(fnode, clnode) |
|
1514 | ndset.setdefault(fnode, clnode) | |
1521 |
return collect |
|
1515 | return collect | |
1522 |
|
1516 | |||
1523 | # If we determine that a particular file or manifest node must be a |
|
1517 | # If we determine that a particular file or manifest node must be a | |
1524 | # node that the recipient of the changegroup will already have, we can |
|
1518 | # node that the recipient of the changegroup will already have, we can | |
@@ -1543,11 +1537,11 b' class localrepository(repo.repository):' | |||||
1543 | def gengroup(): |
|
1537 | def gengroup(): | |
1544 | # The set of changed files starts empty. |
|
1538 | # The set of changed files starts empty. | |
1545 | changedfiles = set() |
|
1539 | changedfiles = set() | |
1546 |
collect = changegroup.collector(cl, m |
|
1540 | collect = changegroup.collector(cl, mfs, changedfiles) | |
1547 |
|
1541 | |||
1548 | # Create a changenode group generator that will call our functions |
|
1542 | # Create a changenode group generator that will call our functions | |
1549 | # back to lookup the owning changenode and collect information. |
|
1543 | # back to lookup the owning changenode and collect information. | |
1550 |
group = cl.group( |
|
1544 | group = cl.group(csets, identity, collect) | |
1551 | for cnt, chnk in enumerate(group): |
|
1545 | for cnt, chnk in enumerate(group): | |
1552 | yield chnk |
|
1546 | yield chnk | |
1553 | # revlog.group yields three entries per node, so |
|
1547 | # revlog.group yields three entries per node, so | |
@@ -1558,20 +1552,17 b' class localrepository(repo.repository):' | |||||
1558 | changecount = cnt / 3 |
|
1552 | changecount = cnt / 3 | |
1559 | self.ui.progress(_('bundling'), None) |
|
1553 | self.ui.progress(_('bundling'), None) | |
1560 |
|
1554 | |||
1561 |
prune(m |
|
1555 | prune(mf, mfs) | |
1562 | msng_mnfst_lst = msng_mnfst_set.keys() |
|
|||
1563 | # Sort the manifestnodes by revision number. |
|
|||
1564 | msng_mnfst_lst.sort(key=mnfst.rev) |
|
|||
1565 | # Create a generator for the manifestnodes that calls our lookup |
|
1556 | # Create a generator for the manifestnodes that calls our lookup | |
1566 | # and data collection functions back. |
|
1557 | # and data collection functions back. | |
1567 |
group = m |
|
1558 | group = mf.group(sorted(mfs, key=mf.rev), | |
1568 |
|
|
1559 | lambda mnode: mfs[mnode], | |
1569 |
|
|
1560 | filenode_collector(changedfiles)) | |
1570 | efiles = {} |
|
1561 | efiles = {} | |
1571 | for cnt, chnk in enumerate(group): |
|
1562 | for cnt, chnk in enumerate(group): | |
1572 | if cnt % 3 == 1: |
|
1563 | if cnt % 3 == 1: | |
1573 | mnode = chnk[:20] |
|
1564 | mnode = chnk[:20] | |
1574 |
efiles.update(m |
|
1565 | efiles.update(mf.readdelta(mnode)) | |
1575 | yield chnk |
|
1566 | yield chnk | |
1576 | # see above comment for why we divide by 3 |
|
1567 | # see above comment for why we divide by 3 | |
1577 | self.ui.progress(_('bundling'), cnt / 3, |
|
1568 | self.ui.progress(_('bundling'), cnt / 3, | |
@@ -1579,10 +1570,7 b' class localrepository(repo.repository):' | |||||
1579 | self.ui.progress(_('bundling'), None) |
|
1570 | self.ui.progress(_('bundling'), None) | |
1580 | efiles = len(efiles) |
|
1571 | efiles = len(efiles) | |
1581 |
|
1572 | |||
1582 | # These are no longer needed, dereference and toss the memory for |
|
1573 | mfs.clear() | |
1583 | # them. |
|
|||
1584 | msng_mnfst_lst = None |
|
|||
1585 | msng_mnfst_set.clear() |
|
|||
1586 |
|
1574 | |||
1587 | # Go through all our files in order sorted by name. |
|
1575 | # Go through all our files in order sorted by name. | |
1588 | for idx, fname in enumerate(sorted(changedfiles)): |
|
1576 | for idx, fname in enumerate(sorted(changedfiles)): | |
@@ -1591,7 +1579,7 b' class localrepository(repo.repository):' | |||||
1591 | raise util.Abort(_("empty or missing revlog for %s") % fname) |
|
1579 | raise util.Abort(_("empty or missing revlog for %s") % fname) | |
1592 | # Toss out the filenodes that the recipient isn't really |
|
1580 | # Toss out the filenodes that the recipient isn't really | |
1593 | # missing. |
|
1581 | # missing. | |
1594 |
missingfnodes = |
|
1582 | missingfnodes = fnodes.pop(fname, {}) | |
1595 | prune(filerevlog, missingfnodes) |
|
1583 | prune(filerevlog, missingfnodes) | |
1596 | # If any filenodes are left, generate the group for them, |
|
1584 | # If any filenodes are left, generate the group for them, | |
1597 | # otherwise don't bother. |
|
1585 | # otherwise don't bother. | |
@@ -1618,8 +1606,8 b' class localrepository(repo.repository):' | |||||
1618 | yield changegroup.closechunk() |
|
1606 | yield changegroup.closechunk() | |
1619 | self.ui.progress(_('bundling'), None) |
|
1607 | self.ui.progress(_('bundling'), None) | |
1620 |
|
1608 | |||
1621 |
if |
|
1609 | if csets: | |
1622 |
self.hook('outgoing', node=hex( |
|
1610 | self.hook('outgoing', node=hex(csets[0]), source=source) | |
1623 |
|
1611 | |||
1624 | return changegroup.unbundle10(util.chunkbuffer(gengroup()), 'UN') |
|
1612 | return changegroup.unbundle10(util.chunkbuffer(gengroup()), 'UN') | |
1625 |
|
1613 |
General Comments 0
You need to be logged in to leave comments.
Login now