mercurial/manifest.py
changeset 31346 2a18e9e6ca43
parent 31294 c134a33b1d73
child 31352 667e88568087
equal deleted inserted replaced
31345:dd49a6c166f7 31346:2a18e9e6ca43
     5 # This software may be used and distributed according to the terms of the
     5 # This software may be used and distributed according to the terms of the
     6 # GNU General Public License version 2 or any later version.
     6 # GNU General Public License version 2 or any later version.
     7 
     7 
     8 from __future__ import absolute_import
     8 from __future__ import absolute_import
     9 
     9 
    10 import array
       
    11 import heapq
    10 import heapq
    12 import os
    11 import os
    13 import struct
    12 import struct
    14 
    13 
    15 from .i18n import _
    14 from .i18n import _
   626             # apply the delta to the base, and get a delta for addrevision
   625             # apply the delta to the base, and get a delta for addrevision
   627             deltatext, arraytext = _addlistdelta(base, delta)
   626             deltatext, arraytext = _addlistdelta(base, delta)
   628         else:
   627         else:
   629             # For large changes, it's much cheaper to just build the text and
   628             # For large changes, it's much cheaper to just build the text and
   630             # diff it.
   629             # diff it.
   631             arraytext = array.array('c', self.text())
   630             arraytext = bytearray(self.text())
   632             deltatext = mdiff.textdiff(base, arraytext)
   631             deltatext = mdiff.textdiff(
       
   632                 util.buffer(base), util.buffer(arraytext))
   633 
   633 
   634         return arraytext, deltatext
   634         return arraytext, deltatext
   635 
   635 
   636 def _msearch(m, s, lo=0, hi=None):
   636 def _msearch(m, s, lo=0, hi=None):
   637     '''return a tuple (start, end) that says where to find s within m.
   637     '''return a tuple (start, end) that says where to find s within m.
   685 # return a delta suitable for addrevision
   685 # return a delta suitable for addrevision
   686 def _addlistdelta(addlist, x):
   686 def _addlistdelta(addlist, x):
   687     # for large addlist arrays, building a new array is cheaper
   687     # for large addlist arrays, building a new array is cheaper
   688     # than repeatedly modifying the existing one
   688     # than repeatedly modifying the existing one
   689     currentposition = 0
   689     currentposition = 0
   690     newaddlist = array.array('c')
   690     newaddlist = bytearray()
   691 
   691 
   692     for start, end, content in x:
   692     for start, end, content in x:
   693         newaddlist += addlist[currentposition:start]
   693         newaddlist += addlist[currentposition:start]
   694         if content:
   694         if content:
   695             newaddlist += array.array('c', content)
   695             newaddlist += bytearray(content)
   696 
   696 
   697         currentposition = end
   697         currentposition = end
   698 
   698 
   699     newaddlist += addlist[currentposition:]
   699     newaddlist += addlist[currentposition:]
   700 
   700 
  1238                 n = self._addtree(m, transaction, link, m1, m2, readtree)
  1238                 n = self._addtree(m, transaction, link, m1, m2, readtree)
  1239                 arraytext = None
  1239                 arraytext = None
  1240             else:
  1240             else:
  1241                 text = m.text(self._usemanifestv2)
  1241                 text = m.text(self._usemanifestv2)
  1242                 n = self.addrevision(text, transaction, link, p1, p2)
  1242                 n = self.addrevision(text, transaction, link, p1, p2)
  1243                 arraytext = array.array('c', text)
  1243                 arraytext = bytearray(text)
  1244 
  1244 
  1245         if arraytext is not None:
  1245         if arraytext is not None:
  1246             self.fulltextcache[n] = arraytext
  1246             self.fulltextcache[n] = arraytext
  1247 
  1247 
  1248         return n
  1248         return n
  1418             if self._node == revlog.nullid:
  1418             if self._node == revlog.nullid:
  1419                 self._data = manifestdict()
  1419                 self._data = manifestdict()
  1420             else:
  1420             else:
  1421                 rl = self._revlog()
  1421                 rl = self._revlog()
  1422                 text = rl.revision(self._node)
  1422                 text = rl.revision(self._node)
  1423                 arraytext = array.array('c', text)
  1423                 arraytext = bytearray(text)
  1424                 rl._fulltextcache[self._node] = arraytext
  1424                 rl._fulltextcache[self._node] = arraytext
  1425                 self._data = manifestdict(text)
  1425                 self._data = manifestdict(text)
  1426         return self._data
  1426         return self._data
  1427 
  1427 
  1428     def readfast(self, shallow=False):
  1428     def readfast(self, shallow=False):
  1527                 m.read(gettext, readsubtree)
  1527                 m.read(gettext, readsubtree)
  1528                 m.setnode(self._node)
  1528                 m.setnode(self._node)
  1529                 self._data = m
  1529                 self._data = m
  1530             else:
  1530             else:
  1531                 text = rl.revision(self._node)
  1531                 text = rl.revision(self._node)
  1532                 arraytext = array.array('c', text)
  1532                 arraytext = bytearray(text)
  1533                 rl.fulltextcache[self._node] = arraytext
  1533                 rl.fulltextcache[self._node] = arraytext
  1534                 self._data = treemanifest(dir=self._dir, text=text)
  1534                 self._data = treemanifest(dir=self._dir, text=text)
  1535 
  1535 
  1536         return self._data
  1536         return self._data
  1537 
  1537