comparison mercurial/revlog.py @ 3390:a74addddd092

make revlog.addgroup pass its file handles to addrevision This should fix issue255. It looks like the problem there happens when addgroup calls addrevision to add a full revision, and addrevision decides to split the index file into a .i/.d pair. Since addgroup has an open file handle for the index file, the renaming of the new .i file to its final name fails on windows.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Sat, 14 Oct 2006 18:47:48 -0300
parents ef8307585b41
children b17f9d3eda74
comparison
equal deleted inserted replaced
3389:efbe24c7d8d9 3390:a74addddd092
953 transaction - the transaction object used for rollback 953 transaction - the transaction object used for rollback
954 link - the linkrev data to add 954 link - the linkrev data to add
955 p1, p2 - the parent nodeids of the revision 955 p1, p2 - the parent nodeids of the revision
956 d - an optional precomputed delta 956 d - an optional precomputed delta
957 """ 957 """
958 if not self.inlinedata():
959 dfh = self.opener(self.datafile, "a")
960 else:
961 dfh = None
962 ifh = self.opener(self.indexfile, "a+")
963 return self._addrevision(text, transaction, link, p1, p2, d, ifh, dfh)
964
965 def _addrevision(self, text, transaction, link, p1, p2, d, ifh, dfh):
958 if text is None: text = "" 966 if text is None: text = ""
959 if p1 is None: p1 = self.tip() 967 if p1 is None: p1 = self.tip()
960 if p2 is None: p2 = nullid 968 if p2 is None: p2 = nullid
961 969
962 node = hash(text, p1, p2) 970 node = hash(text, p1, p2)
1002 entry = struct.pack(self.indexformat, *e) 1010 entry = struct.pack(self.indexformat, *e)
1003 1011
1004 if not self.inlinedata(): 1012 if not self.inlinedata():
1005 transaction.add(self.datafile, offset) 1013 transaction.add(self.datafile, offset)
1006 transaction.add(self.indexfile, n * len(entry)) 1014 transaction.add(self.indexfile, n * len(entry))
1007 f = self.opener(self.datafile, "a")
1008 if data[0]: 1015 if data[0]:
1009 f.write(data[0]) 1016 dfh.write(data[0])
1010 f.write(data[1]) 1017 dfh.write(data[1])
1011 f.close() 1018 dfh.flush()
1012 f = self.opener(self.indexfile, "a") 1019 else:
1013 else: 1020 ifh.seek(0, 2)
1014 f = self.opener(self.indexfile, "a+") 1021 transaction.add(self.indexfile, ifh.tell(), self.count() - 1)
1015 f.seek(0, 2)
1016 transaction.add(self.indexfile, f.tell(), self.count() - 1)
1017 1022
1018 if len(self.index) == 1 and self.version != REVLOGV0: 1023 if len(self.index) == 1 and self.version != REVLOGV0:
1019 l = struct.pack(versionformat, self.version) 1024 l = struct.pack(versionformat, self.version)
1020 f.write(l) 1025 ifh.write(l)
1021 entry = entry[4:] 1026 entry = entry[4:]
1022 1027
1023 f.write(entry) 1028 ifh.write(entry)
1024 1029
1025 if self.inlinedata(): 1030 if self.inlinedata():
1026 f.write(data[0]) 1031 ifh.write(data[0])
1027 f.write(data[1]) 1032 ifh.write(data[1])
1028 self.checkinlinesize(transaction, f) 1033 self.checkinlinesize(transaction, ifh)
1029 1034
1030 self.cache = (node, n, text) 1035 self.cache = (node, n, text)
1031 return node 1036 return node
1032 1037
1033 def ancestor(self, a, b): 1038 def ancestor(self, a, b):
1144 if dfh: 1149 if dfh:
1145 dfh.flush() 1150 dfh.flush()
1146 ifh.flush() 1151 ifh.flush()
1147 text = self.revision(chain) 1152 text = self.revision(chain)
1148 text = self.patches(text, [delta]) 1153 text = self.patches(text, [delta])
1149 chk = self.addrevision(text, transaction, link, p1, p2) 1154 chk = self._addrevision(text, transaction, link, p1, p2, None,
1155 ifh, dfh)
1156 if not dfh and not self.inlinedata():
1157 # addrevision switched from inline to conventional
1158 # reopen the index
1159 dfh = self.opener(self.datafile, "a")
1160 ifh = self.opener(self.indexfile, "a")
1150 if chk != node: 1161 if chk != node:
1151 raise RevlogError(_("consistency error adding group")) 1162 raise RevlogError(_("consistency error adding group"))
1152 textlen = len(text) 1163 textlen = len(text)
1153 else: 1164 else:
1154 if self.version == REVLOGV0: 1165 if self.version == REVLOGV0:
1164 self.checkinlinesize(transaction, ifh) 1175 self.checkinlinesize(transaction, ifh)
1165 if not self.inlinedata(): 1176 if not self.inlinedata():
1166 dfh = self.opener(self.datafile, "a") 1177 dfh = self.opener(self.datafile, "a")
1167 ifh = self.opener(self.indexfile, "a") 1178 ifh = self.opener(self.indexfile, "a")
1168 else: 1179 else:
1169 if not dfh:
1170 # addrevision switched from inline to conventional
1171 # reopen the index
1172 dfh = self.opener(self.datafile, "a")
1173 ifh = self.opener(self.indexfile, "a")
1174 dfh.write(cdelta) 1180 dfh.write(cdelta)
1175 ifh.write(struct.pack(self.indexformat, *e)) 1181 ifh.write(struct.pack(self.indexformat, *e))
1176 1182
1177 t, r, chain, prev = r, r + 1, node, node 1183 t, r, chain, prev = r, r + 1, node, node
1178 base = self.base(t) 1184 base = self.base(t)