207 |
207 |
208 def flushmarkers(self): |
208 def flushmarkers(self): |
209 """Write all markers on disk |
209 """Write all markers on disk |
210 |
210 |
211 After this operation, "new" markers are considered "known".""" |
211 After this operation, "new" markers are considered "known".""" |
|
212 # XXX: transaction logic should be used |
212 if self._new: |
213 if self._new: |
213 # XXX: transaction logic should be used here. But for |
214 f = self.sopener('obsstore', 'ab') |
214 # now rewriting the whole file is good enough. |
|
215 f = self.sopener('obsstore', 'wb', atomictemp=True) |
|
216 try: |
215 try: |
217 self._writemarkers(f) |
216 if f.tell() == 0: |
|
217 # plain new obsstore |
|
218 f.write(_pack('>B', _fmversion)) |
|
219 _writemarkers(f.write, self._new) |
218 f.close() |
220 f.close() |
219 self._new[:] = [] |
221 self._new[:] = [] |
220 except: # re-raises |
222 except: # re-raises |
221 f.discard() |
223 f.discard() |
222 raise |
224 raise |
226 pre, sucs = marker[:2] |
228 pre, sucs = marker[:2] |
227 self.precursors.setdefault(pre, set()).add(marker) |
229 self.precursors.setdefault(pre, set()).add(marker) |
228 for suc in sucs: |
230 for suc in sucs: |
229 self.successors.setdefault(suc, set()).add(marker) |
231 self.successors.setdefault(suc, set()).add(marker) |
230 |
232 |
231 def _writemarkers(self, stream=None): |
233 def _writemarkers(write, markers): |
232 # Kept separate from flushmarkers(), it will be reused for |
234 # Kept separate from flushmarkers(), it will be reused for |
233 # markers exchange. |
235 # markers exchange. |
234 if stream is None: |
236 for marker in markers: |
235 final = [] |
237 pre, sucs, flags, metadata = marker |
236 w = final.append |
238 nbsuc = len(sucs) |
237 else: |
239 format = _fmfixed + (_fmnode * nbsuc) |
238 w = stream.write |
240 data = [nbsuc, len(metadata), flags, pre] |
239 w(_pack('>B', _fmversion)) |
241 data.extend(sucs) |
240 for marker in self._all: |
242 write(_pack(format, *data)) |
241 pre, sucs, flags, metadata = marker |
243 write(metadata) |
242 nbsuc = len(sucs) |
|
243 format = _fmfixed + (_fmnode * nbsuc) |
|
244 data = [nbsuc, len(metadata), flags, pre] |
|
245 data.extend(sucs) |
|
246 w(_pack(format, *data)) |
|
247 w(metadata) |
|
248 if stream is None: |
|
249 return ''.join(final) |
|
250 |
244 |
251 def listmarkers(repo): |
245 def listmarkers(repo): |
252 """List markers over pushkey""" |
246 """List markers over pushkey""" |
253 if not repo.obsstore: |
247 if not repo.obsstore: |
254 return {} |
248 return {} |
255 data = repo.obsstore._writemarkers() |
249 data = [_pack('>B', _fmversion)] |
256 return {'dump': base85.b85encode(data)} |
250 _writemarkers(data.append, repo.obsstore) |
|
251 return {'dump': base85.b85encode(''.join(data))} |
257 |
252 |
258 def pushmarker(repo, key, old, new): |
253 def pushmarker(repo, key, old, new): |
259 """Push markers over pushkey""" |
254 """Push markers over pushkey""" |
260 if key != 'dump': |
255 if key != 'dump': |
261 repo.ui.warn(_('unknown key: %r') % key) |
256 repo.ui.warn(_('unknown key: %r') % key) |