[PATCH 1 of 4] obsolete: refactor writemarkers to only encode them

Pierre-Yves David pierre-yves.david at ens-lyon.org
Fri Jul 13 15:29:58 CDT 2012


# HG changeset patch
# User Pierre-Yves.David at ens-lyon.org
# Date 1342115887 -7200
# Node ID 743a6a0c7a879874783c6c3983bc4c8928d4e83c
# Parent  4a313d9953aed6e2e876090c298ca31cb452b7d8
obsolete: refactor writemarkers to only encode them

The function is now able to write the version header is necessary. The function
now yield bytes to be written to a stream.

This should ease later use of this function for wireprotocol based exchanged.

Prepare the public use of the writemarker by wireprotocol function.

diff -r 4a313d9953ae -r 743a6a0c7a87 mercurial/obsolete.py
--- a/mercurial/obsolete.py	Thu Jul 12 03:03:19 2012 +0200
+++ b/mercurial/obsolete.py	Thu Jul 12 19:58:07 2012 +0200
@@ -197,10 +197,9 @@
             try:
                 offset = f.tell()
                 transaction.add('obsstore', offset)
-                if offset == 0:
-                    # new file add version header
-                    f.write(_pack('>B', _fmversion))
-                _writemarkers(f.write, [marker])
+                # offset == 0: new file - add the version header
+                for bytes in _encodemarkers([marker], offset == 0):
+                    f.write(bytes)
             finally:
                 # XXX: f.close() == filecache invalidation == obsstore rebuilt.
                 # call 'filecacheentry.refresh()'  here
@@ -223,25 +222,26 @@
         for suc in sucs:
             self.successors.setdefault(suc, set()).add(marker)
 
-def _writemarkers(write, markers):
+def _encodemarkers(markers, addheader=False):
     # Kept separate from flushmarkers(), it will be reused for
     # markers exchange.
+    if addheader:
+        yield _pack('>B', _fmversion)
     for marker in markers:
         pre, sucs, flags, metadata = marker
         nbsuc = len(sucs)
         format = _fmfixed + (_fmnode * nbsuc)
         data = [nbsuc, len(metadata), flags, pre]
         data.extend(sucs)
-        write(_pack(format, *data))
-        write(metadata)
+        yield _pack(format, *data)
+        yield metadata
 
 def listmarkers(repo):
     """List markers over pushkey"""
     if not repo.obsstore:
         return {}
-    data = [_pack('>B', _fmversion)]
-    _writemarkers(data.append, repo.obsstore)
-    return {'dump': base85.b85encode(''.join(data))}
+    markers = _encodemarkers(repo.obsstore, True)
+    return {'dump': base85.b85encode(''.join(markers))}
 
 def pushmarker(repo, key, old, new):
     """Push markers over pushkey"""


More information about the Mercurial-devel mailing list