changeset 21604:c399bf961cb9

bundle2: the ability to set ``data`` attribute of the part is now official We make it safe to set the data attribute after part creation. It is an allowed operation as long as the part has not started to be generated.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Thu, 22 May 2014 11:21:26 -0700
parents 31be5a6fa716
children f9dabfceb259
files mercurial/bundle2.py tests/test-bundle2.t
diffstat 2 files changed, 17 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/bundle2.py	Sat May 24 16:08:05 2014 -0700
+++ b/mercurial/bundle2.py	Thu May 22 11:21:26 2014 -0700
@@ -554,13 +554,17 @@
 
     The part `type` is used to route the part to the application level
     handler.
+
+    The part payload is contained in ``part.data``. It could be raw bytes or a
+    generator of byte chunks. The data attribute cannot be modified after the
+    generation has begun.
     """
 
     def __init__(self, parttype, mandatoryparams=(), advisoryparams=(),
                  data=''):
         self.id = None
         self.type = parttype
-        self.data = data
+        self._data = data
         self.mandatoryparams = mandatoryparams
         self.advisoryparams = advisoryparams
         # status of the part's generation:
@@ -569,6 +573,15 @@
         # - True: generation done.
         self._generated = None
 
+    # methods used to defines the part content
+    def __setdata(self, data):
+        if self._generated is not None:
+            raise ReadOnlyPartError('part is being generated')
+        self._data = data
+    def __getdata(self):
+        return self._data
+    data = property(__getdata, __setdata)
+
     # methods used to generates the bundle2 stream
     def getchunks(self):
         if self._generated is not None:
--- a/tests/test-bundle2.t	Sat May 24 16:08:05 2014 -0700
+++ b/tests/test-bundle2.t	Thu May 22 11:21:26 2014 -0700
@@ -84,8 +84,9 @@
   >         bundler.newpart('b2x:replycaps', data=capsstring)
   > 
   >     if opts['pushrace']:
-  >         dummynode = '01234567890123456789'
-  >         bundler.newpart('b2x:check:heads', data=dummynode)
+  >         # also serve to test the assignement of data outside of init
+  >         part = bundler.newpart('b2x:check:heads')
+  >         part.data = '01234567890123456789'
   > 
   >     revs = opts['rev']
   >     if 'rev' in opts: