mercurial/obsolete.py
changeset 17125 95d785ccb4e5
parent 17124 f1b7683f3f95
child 17126 8fa8717b47b6
equal deleted inserted replaced
17124:f1b7683f3f95 17125:95d785ccb4e5
   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)