comparison mercurial/revlog.py @ 11998:e789a811c21d

revlog.revision(): inline deltachain computation
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Fri, 20 Aug 2010 00:17:50 +0200
parents 6d29171255cd
children 62e2bbf523f2
comparison
equal deleted inserted replaced
11997:6d29171255cd 11998:e789a811c21d
1023 elif self.flags(rev) & REVIDX_PARENTDELTA: 1023 elif self.flags(rev) & REVIDX_PARENTDELTA:
1024 return self.parentrevs(rev)[0] 1024 return self.parentrevs(rev)[0]
1025 else: 1025 else:
1026 return rev - 1 1026 return rev - 1
1027 1027
1028
1029 def deltachain(self, rev, cache):
1030 """return chain of revisions to construct a given revision"""
1031 chain = []
1032 check = False
1033 index = self.index
1034 e = index[rev]
1035 while rev != e[3] and rev != cache:
1036 chain.append(rev)
1037 if e[0] & REVIDX_PARENTDELTA:
1038 rev = e[5]
1039 else:
1040 rev -= 1
1041 e = index[rev]
1042 chain.reverse()
1043 if rev == cache:
1044 check = True
1045 return check, rev, chain
1046
1047 def revdiff(self, rev1, rev2): 1028 def revdiff(self, rev1, rev2):
1048 """return or calculate a delta between two revisions""" 1029 """return or calculate a delta between two revisions"""
1049 if rev1 != nullrev and self.deltaparent(rev2) == rev1: 1030 if rev1 != nullrev and self.deltaparent(rev2) == rev1:
1050 return self._chunk(rev2) 1031 return self._chunk(rev2)
1051 1032
1072 raise RevlogError(_('incompatible revision flag %x') % 1053 raise RevlogError(_('incompatible revision flag %x') %
1073 (self.flags(rev) & ~REVIDX_KNOWN_FLAGS)) 1054 (self.flags(rev) & ~REVIDX_KNOWN_FLAGS))
1074 1055
1075 # build delta chain 1056 # build delta chain
1076 self._loadindex(base, rev + 1) 1057 self._loadindex(base, rev + 1)
1077 cachehit, base, chain = self.deltachain(rev, cachedrev) 1058 chain = []
1078 1059 index = self.index # for performance
1079 # do we have useful data cached? 1060 iterrev = rev
1080 if cachehit: 1061 e = index[iterrev]
1062 while iterrev != base and iterrev != cachedrev:
1063 chain.append(iterrev)
1064 if e[0] & REVIDX_PARENTDELTA:
1065 iterrev = e[5]
1066 else:
1067 iterrev -= 1
1068 e = index[iterrev]
1069 chain.reverse()
1070 base = iterrev
1071
1072 if iterrev == cachedrev:
1073 # cache hit
1081 text = self._cache[2] 1074 text = self._cache[2]
1082 1075
1083 # drop cache to save memory 1076 # drop cache to save memory
1084 self._cache = None 1077 self._cache = None
1085 1078