mercurial/revlog.py
changeset 31755 ec48d57de110
parent 31754 5b93c6fdb391
child 31756 9ec03d5af48f
equal deleted inserted replaced
31754:5b93c6fdb391 31755:ec48d57de110
  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: