bundle2: introduce a ``addparam`` method on part
authorPierre-Yves David <pierre-yves.david@fb.com>
Thu, 22 May 2014 11:38:40 -0700
changeset 21605 f9dabfceb259
parent 21604 c399bf961cb9
child 21606 e55888447958
bundle2: introduce a ``addparam`` method on part We make it easier to add new parameters after the part creation. As for the ``data`` attribute we make sure the part generation has not begun yet.
mercurial/bundle2.py
tests/test-bundle2.t
--- a/mercurial/bundle2.py	Thu May 22 11:21:26 2014 -0700
+++ b/mercurial/bundle2.py	Thu May 22 11:38:40 2014 -0700
@@ -556,8 +556,13 @@
     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.
+    generator of byte chunks.
+
+    You can add parameters to the part using the ``addparam`` method.
+    Parameters can be either mandatory (default) or advisory. Remote side
+    should be able to safely ignore the advisory ones.
+
+    Both data and parameters cannot be modified after the generation has begun.
     """
 
     def __init__(self, parttype, mandatoryparams=(), advisoryparams=(),
@@ -565,8 +570,8 @@
         self.id = None
         self.type = parttype
         self._data = data
-        self.mandatoryparams = mandatoryparams
-        self.advisoryparams = advisoryparams
+        self._mandatoryparams = list(mandatoryparams)
+        self._advisoryparams = list(advisoryparams)
         # status of the part's generation:
         # - None: not started,
         # - False: currently generated,
@@ -582,6 +587,24 @@
         return self._data
     data = property(__getdata, __setdata)
 
+    @property
+    def mandatoryparams(self):
+        # make it an immutable tuple to force people through ``addparam``
+        return tuple(self._mandatoryparams)
+
+    @property
+    def advisoryparams(self):
+        # make it an immutable tuple to force people through ``addparam``
+        return tuple(self._advisoryparams)
+
+    def addparam(self, name, value='', mandatory=True):
+        if self._generated is not None:
+            raise ReadOnlyPartError('part is being generated')
+        params = self._advisoryparams
+        if mandatory:
+            params = self._mandatoryparams
+        params.append((name, value))
+
     # methods used to generates the bundle2 stream
     def getchunks(self):
         if self._generated is not None:
--- a/tests/test-bundle2.t	Thu May 22 11:21:26 2014 -0700
+++ b/tests/test-bundle2.t	Thu May 22 11:38:40 2014 -0700
@@ -106,10 +106,11 @@
   >        bundler.newpart('test:empty')
   >        bundler.newpart('test:song', data=ELEPHANTSSONG)
   >        bundler.newpart('test:debugreply')
-  >        bundler.newpart('test:math',
-  >                                  [('pi', '3.14'), ('e', '2.72')],
-  >                                  [('cooking', 'raw')],
-  >                                  '42')
+  >        mathpart = bundler.newpart('test:math')
+  >        mathpart.addparam('pi', '3.14')
+  >        mathpart.addparam('e', '2.72')
+  >        mathpart.addparam('cooking', 'raw', mandatory=False)
+  >        mathpart.data = '42'
   >     if opts['unknown']:
   >        bundler.newpart('test:UNKNOWN', data='some random content')
   >     if opts['parts']: