mercurial/bundle2.py
changeset 20801 9c5183cb9bca
child 20802 520df53ad26a
equal deleted inserted replaced
20800:8253e55930a3 20801:9c5183cb9bca
       
     1 # bundle2.py - generic container format to transmit arbitrary data.
       
     2 #
       
     3 # Copyright 2013 Facebook, Inc.
       
     4 #
       
     5 # This software may be used and distributed according to the terms of the
       
     6 # GNU General Public License version 2 or any later version.
       
     7 """Handling of the new bundle2 format
       
     8 
       
     9 The goal of bundle2 is to act as an atomically packet to transmit a set of
       
    10 payloads in an application agnostic way. It consist in a sequence of "parts"
       
    11 that will be handed to and processed by the application layer.
       
    12 
       
    13 
       
    14 General format architecture
       
    15 ===========================
       
    16 
       
    17 The format is architectured as follow
       
    18 
       
    19  - magic string
       
    20  - stream level parameters
       
    21  - payload parts (any number)
       
    22  - end of stream marker.
       
    23 
       
    24 The current implementation is limited to empty bundle.
       
    25 
       
    26 Details on the Binary format
       
    27 ============================
       
    28 
       
    29 All numbers are unsigned and big endian.
       
    30 
       
    31 stream level parameters
       
    32 ------------------------
       
    33 
       
    34 Binary format is as follow
       
    35 
       
    36 :params size: (16 bits integer)
       
    37 
       
    38   The total number of Bytes used by the parameters
       
    39 
       
    40   Currently force to 0.
       
    41 
       
    42 :params value: arbitrary number of Bytes
       
    43 
       
    44   A blob of `params size` containing the serialized version of all stream level
       
    45   parameters.
       
    46 
       
    47   Currently always empty.
       
    48 
       
    49 
       
    50 Payload part
       
    51 ------------------------
       
    52 
       
    53 Binary format is as follow
       
    54 
       
    55 :header size: (16 bits inter)
       
    56 
       
    57   The total number of Bytes used by the part headers. When the header is empty
       
    58   (size = 0) this is interpreted as the end of stream marker.
       
    59 
       
    60   Currently forced to 0 in the current state of the implementation
       
    61 """
       
    62 
       
    63 _magicstring = 'HG20'
       
    64 
       
    65 class bundle20(object):
       
    66     """represent an outgoing bundle2 container
       
    67 
       
    68     People will eventually be able to add param and parts to this object and
       
    69     generated a stream from it."""
       
    70 
       
    71     def __init__(self):
       
    72         self._params = []
       
    73         self._parts = []
       
    74 
       
    75     def getchunks(self):
       
    76         yield _magicstring
       
    77         # no support for any param yet
       
    78         # to be obviously fixed soon.
       
    79         assert not self._params
       
    80         yield '\0\0'
       
    81         # no support for parts
       
    82         # to be obviously fixed soon.
       
    83         assert not self._parts
       
    84         yield '\0\0'