mercurial/bundlerepo.py
changeset 18414 c448562ad85b
parent 18413 0ccb16f5956a
child 18415 95b8629fd2de
equal deleted inserted replaced
18413:0ccb16f5956a 18414:c448562ad85b
    69             self.nodemap[node] = n
    69             self.nodemap[node] = n
    70             self.bundlerevs.add(n)
    70             self.bundlerevs.add(n)
    71             chain = node
    71             chain = node
    72             n += 1
    72             n += 1
    73 
    73 
    74     def inbundle(self, rev):
       
    75         """is rev from the bundle"""
       
    76         if rev < 0:
       
    77             return False
       
    78         return rev in self.basemap
       
    79 
       
    80     def _chunk(self, rev):
    74     def _chunk(self, rev):
    81         # Warning: in case of bundle, the diff is against self.basemap,
    75         # Warning: in case of bundle, the diff is against self.basemap,
    82         # not against rev - 1
    76         # not against rev - 1
    83         # XXX: could use some caching
    77         # XXX: could use some caching
    84         if not self.inbundle(rev):
    78         if rev not in self.basemap:
    85             return revlog.revlog._chunk(self, rev)
    79             return revlog.revlog._chunk(self, rev)
    86         self.bundle.seek(self.start(rev))
    80         self.bundle.seek(self.start(rev))
    87         return self.bundle.read(self.length(rev))
    81         return self.bundle.read(self.length(rev))
    88 
    82 
    89     def revdiff(self, rev1, rev2):
    83     def revdiff(self, rev1, rev2):
    90         """return or calculate a delta between two revisions"""
    84         """return or calculate a delta between two revisions"""
    91         if self.inbundle(rev1) and self.inbundle(rev2):
    85         if rev1 in self.basemap and rev2 in self.basemap:
    92             # hot path for bundle
    86             # hot path for bundle
    93             revb = self.rev(self.basemap[rev2])
    87             revb = self.rev(self.basemap[rev2])
    94             if revb == rev1:
    88             if revb == rev1:
    95                 return self._chunk(rev2)
    89                 return self._chunk(rev2)
    96         elif not self.inbundle(rev1) and not self.inbundle(rev2):
    90         elif rev1 not in self.basemap and rev2 not in self.basemap:
    97             return revlog.revlog.revdiff(self, rev1, rev2)
    91             return revlog.revlog.revdiff(self, rev1, rev2)
    98 
    92 
    99         return mdiff.textdiff(self.revision(self.node(rev1)),
    93         return mdiff.textdiff(self.revision(self.node(rev1)),
   100                               self.revision(self.node(rev2)))
    94                               self.revision(self.node(rev2)))
   101 
    95 
   115 
   109 
   116         text = None
   110         text = None
   117         chain = []
   111         chain = []
   118         iter_node = node
   112         iter_node = node
   119         # reconstruct the revision if it is from a changegroup
   113         # reconstruct the revision if it is from a changegroup
   120         while self.inbundle(rev):
   114         while rev in self.basemap:
   121             if self._cache and self._cache[0] == iter_node:
   115             if self._cache and self._cache[0] == iter_node:
   122                 text = self._cache[2]
   116                 text = self._cache[2]
   123                 break
   117                 break
   124             chain.append(rev)
   118             chain.append(rev)
   125             iter_node = self.basemap[rev]
   119             iter_node = self.basemap[rev]