1575 (self._maxchainlen and chainlen > self._maxchainlen)): |
1575 (self._maxchainlen and chainlen > self._maxchainlen)): |
1576 return False |
1576 return False |
1577 |
1577 |
1578 return True |
1578 return True |
1579 |
1579 |
1580 def _addrevision(self, node, text, transaction, link, p1, p2, flags, |
1580 def _addrevision(self, node, rawtext, transaction, link, p1, p2, flags, |
1581 cachedelta, ifh, dfh, alwayscache=False, raw=False): |
1581 cachedelta, ifh, dfh, alwayscache=False): |
1582 """internal function to add revisions to the log |
1582 """internal function to add revisions to the log |
1583 |
1583 |
1584 see addrevision for argument descriptions. |
1584 see addrevision for argument descriptions. |
|
1585 |
|
1586 note: "addrevision" takes non-raw text, "_addrevision" takes raw text. |
|
1587 |
1585 invariants: |
1588 invariants: |
1586 - text is optional (can be None); if not set, cachedelta must be set. |
1589 - rawtext is optional (can be None); if not set, cachedelta must be set. |
1587 if both are set, they must correspond to each other. |
1590 if both are set, they must correspond to each other. |
1588 - raw is optional; if set to True, it indicates the revision data is to |
1591 """ |
1589 be treated by _processflags() as raw. It is usually set by changegroup |
1592 btext = [rawtext] |
1590 generation and debug commands. |
|
1591 """ |
|
1592 btext = [text] |
|
1593 def buildtext(): |
1593 def buildtext(): |
1594 if btext[0] is not None: |
1594 if btext[0] is not None: |
1595 return btext[0] |
1595 return btext[0] |
1596 baserev = cachedelta[0] |
1596 baserev = cachedelta[0] |
1597 delta = cachedelta[1] |
1597 delta = cachedelta[1] |
1605 else: |
1605 else: |
1606 if self._inline: |
1606 if self._inline: |
1607 fh = ifh |
1607 fh = ifh |
1608 else: |
1608 else: |
1609 fh = dfh |
1609 fh = dfh |
1610 basetext = self.revision(baserev, _df=fh, raw=raw) |
1610 basetext = self.revision(baserev, _df=fh, raw=True) |
1611 btext[0] = mdiff.patch(basetext, delta) |
1611 btext[0] = mdiff.patch(basetext, delta) |
1612 |
1612 |
1613 try: |
1613 try: |
1614 res = self._processflags(btext[0], flags, 'read', raw=raw) |
1614 res = self._processflags(btext[0], flags, 'read', raw=True) |
1615 btext[0], validatehash = res |
1615 btext[0], validatehash = res |
1616 if validatehash: |
1616 if validatehash: |
1617 self.checkhash(btext[0], node, p1=p1, p2=p2) |
1617 self.checkhash(btext[0], node, p1=p1, p2=p2) |
1618 if flags & REVIDX_ISCENSORED: |
1618 if flags & REVIDX_ISCENSORED: |
1619 raise RevlogError(_('node %s is not censored') % node) |
1619 raise RevlogError(_('node %s is not censored') % node) |
1661 delta = None |
1661 delta = None |
1662 p1r, p2r = self.rev(p1), self.rev(p2) |
1662 p1r, p2r = self.rev(p1), self.rev(p2) |
1663 |
1663 |
1664 # full versions are inserted when the needed deltas |
1664 # full versions are inserted when the needed deltas |
1665 # become comparable to the uncompressed text |
1665 # become comparable to the uncompressed text |
1666 if text is None: |
1666 if rawtext is None: |
1667 textlen = mdiff.patchedsize(self.rawsize(cachedelta[0]), |
1667 textlen = mdiff.patchedsize(self.rawsize(cachedelta[0]), |
1668 cachedelta[1]) |
1668 cachedelta[1]) |
1669 else: |
1669 else: |
1670 textlen = len(text) |
1670 textlen = len(rawtext) |
1671 |
1671 |
1672 # should we try to build a delta? |
1672 # should we try to build a delta? |
1673 if prev != nullrev and self.storedeltachains: |
1673 if prev != nullrev and self.storedeltachains: |
1674 tested = set() |
1674 tested = set() |
1675 # This condition is true most of the time when processing |
1675 # This condition is true most of the time when processing |
1706 if self._isgooddelta(candidatedelta, textlen): |
1706 if self._isgooddelta(candidatedelta, textlen): |
1707 delta = candidatedelta |
1707 delta = candidatedelta |
1708 if delta is not None: |
1708 if delta is not None: |
1709 dist, l, data, base, chainbase, chainlen, compresseddeltalen = delta |
1709 dist, l, data, base, chainbase, chainlen, compresseddeltalen = delta |
1710 else: |
1710 else: |
1711 text = buildtext() |
1711 rawtext = buildtext() |
1712 data = self.compress(text) |
1712 data = self.compress(rawtext) |
1713 l = len(data[1]) + len(data[0]) |
1713 l = len(data[1]) + len(data[0]) |
1714 base = chainbase = curr |
1714 base = chainbase = curr |
1715 |
1715 |
1716 e = (offset_type(offset, flags), l, textlen, |
1716 e = (offset_type(offset, flags), l, textlen, |
1717 base, link, p1r, p2r, node) |
1717 base, link, p1r, p2r, node) |
1719 self.nodemap[node] = curr |
1719 self.nodemap[node] = curr |
1720 |
1720 |
1721 entry = self._io.packentry(e, self.node, self.version, curr) |
1721 entry = self._io.packentry(e, self.node, self.version, curr) |
1722 self._writeentry(transaction, ifh, dfh, entry, data, link, offset) |
1722 self._writeentry(transaction, ifh, dfh, entry, data, link, offset) |
1723 |
1723 |
1724 if alwayscache and text is None: |
1724 if alwayscache and rawtext is None: |
1725 text = buildtext() |
1725 rawtext = buildtext() |
1726 |
1726 |
1727 if type(text) == str: # only accept immutable objects |
1727 if type(rawtext) == str: # only accept immutable objects |
1728 self._cache = (node, curr, text) |
1728 self._cache = (node, curr, rawtext) |
1729 self._chainbasecache[curr] = chainbase |
1729 self._chainbasecache[curr] = chainbase |
1730 return node |
1730 return node |
1731 |
1731 |
1732 def _writeentry(self, transaction, ifh, dfh, entry, data, link, offset): |
1732 def _writeentry(self, transaction, ifh, dfh, entry, data, link, offset): |
1733 # Files opened in a+ mode have inconsistent behavior on various |
1733 # Files opened in a+ mode have inconsistent behavior on various |
1845 # generation so the revision data can always be handled as raw |
1845 # generation so the revision data can always be handled as raw |
1846 # by the flagprocessor. |
1846 # by the flagprocessor. |
1847 chain = self._addrevision(node, None, transaction, link, |
1847 chain = self._addrevision(node, None, transaction, link, |
1848 p1, p2, flags, (baserev, delta), |
1848 p1, p2, flags, (baserev, delta), |
1849 ifh, dfh, |
1849 ifh, dfh, |
1850 alwayscache=bool(addrevisioncb), |
1850 alwayscache=bool(addrevisioncb)) |
1851 raw=True) |
|
1852 |
1851 |
1853 if addrevisioncb: |
1852 if addrevisioncb: |
1854 addrevisioncb(self, chain) |
1853 addrevisioncb(self, chain) |
1855 |
1854 |
1856 if not dfh and not self._inline: |
1855 if not dfh and not self._inline: |