Show More
@@ -164,8 +164,7 b' class obsstore(object):' | |||||
164 | self.sopener = sopener |
|
164 | self.sopener = sopener | |
165 | data = sopener.tryread('obsstore') |
|
165 | data = sopener.tryread('obsstore') | |
166 | if data: |
|
166 | if data: | |
167 |
|
|
167 | self._load(_readmarkers(data)) | |
168 | self._load(marker) |
|
|||
169 |
|
168 | |||
170 | def __iter__(self): |
|
169 | def __iter__(self): | |
171 | return iter(self._all) |
|
170 | return iter(self._all) | |
@@ -188,11 +187,15 b' class obsstore(object):' | |||||
188 | if len(succ) != 20: |
|
187 | if len(succ) != 20: | |
189 | raise ValueError(succ) |
|
188 | raise ValueError(succ) | |
190 | marker = (str(prec), tuple(succs), int(flag), encodemeta(metadata)) |
|
189 | marker = (str(prec), tuple(succs), int(flag), encodemeta(metadata)) | |
191 | self.add(transaction, marker) |
|
190 | self.add(transaction, [marker]) | |
|
191 | ||||
|
192 | def add(self, transaction, markers): | |||
|
193 | """Add new markers to the store | |||
192 |
|
|
194 | ||
193 | def add(self, transaction, marker): |
|
195 | Take care of filtering duplicate. | |
194 | """Add a new marker to the store""" |
|
196 | Return the number of new marker.""" | |
195 |
if m |
|
197 | new = [m for m in markers if m not in self._all] | |
|
198 | if new: | |||
196 | f = self.sopener('obsstore', 'ab') |
|
199 | f = self.sopener('obsstore', 'ab') | |
197 | try: |
|
200 | try: | |
198 | # Whether the file's current position is at the begin or at |
|
201 | # Whether the file's current position is at the begin or at | |
@@ -204,29 +207,26 b' class obsstore(object):' | |||||
204 | offset = f.tell() |
|
207 | offset = f.tell() | |
205 | transaction.add('obsstore', offset) |
|
208 | transaction.add('obsstore', offset) | |
206 | # offset == 0: new file - add the version header |
|
209 | # offset == 0: new file - add the version header | |
207 |
for bytes in _encodemarkers( |
|
210 | for bytes in _encodemarkers(new, offset == 0): | |
208 | f.write(bytes) |
|
211 | f.write(bytes) | |
209 | finally: |
|
212 | finally: | |
210 | # XXX: f.close() == filecache invalidation == obsstore rebuilt. |
|
213 | # XXX: f.close() == filecache invalidation == obsstore rebuilt. | |
211 | # call 'filecacheentry.refresh()' here |
|
214 | # call 'filecacheentry.refresh()' here | |
212 | f.close() |
|
215 | f.close() | |
213 |
self._load( |
|
216 | self._load(new) | |
|
217 | return len(new) | |||
214 |
|
218 | |||
215 | def mergemarkers(self, transation, data): |
|
219 | def mergemarkers(self, transation, data): | |
216 |
|
|
220 | markers = _readmarkers(data) | |
217 | local = set(self._all) |
|
221 | self.add(transation, markers) | |
218 | new = [m for m in other if m not in local] |
|
|||
219 | for marker in new: |
|
|||
220 | # XXX: N marker == N x (open, write, close) |
|
|||
221 | # we should write them all at once |
|
|||
222 | self.add(transation, marker) |
|
|||
223 |
|
222 | |||
224 | def _load(self, marker): |
|
223 | def _load(self, markers): | |
225 | self._all.append(marker) |
|
224 | for mark in markers: | |
226 | pre, sucs = marker[:2] |
|
225 | self._all.append(mark) | |
227 | self.precursors.setdefault(pre, set()).add(marker) |
|
226 | pre, sucs = mark[:2] | |
228 | for suc in sucs: |
|
227 | self.precursors.setdefault(pre, set()).add(mark) | |
229 | self.successors.setdefault(suc, set()).add(marker) |
|
228 | for suc in sucs: | |
|
229 | self.successors.setdefault(suc, set()).add(mark) | |||
230 |
|
230 | |||
231 | def _encodemarkers(markers, addheader=False): |
|
231 | def _encodemarkers(markers, addheader=False): | |
232 | # Kept separate from flushmarkers(), it will be reused for |
|
232 | # Kept separate from flushmarkers(), it will be reused for |
General Comments 0
You need to be logged in to leave comments.
Login now