{{{#!wiki caution This information was derived by reverse engineering. Some details may be incomplete. Hopefully someone with intimate familiarity with the code can improve it.}}} The v2 bundle file format is in practice quite similar to v1 (see BundleFormat), in that it comprises a file header followed by a changegroup, but it differs in a few significant ways. == Practical differences from v1 bundles == * The file has a more verbose multi-stage ASCII header containing key:value pairs. (more below) * Zstandard compression (new default) also supported. * Uses version 2 deltagroup headers instead of version 1. (see the spec at [[Topic:internals.changegroups|help internals.changegroups]]) * Everything after the header is shredded into N-byte chunks after it is assembled (N is a parameter defined in the source code). == Reading the header == === stage 1 === || 'HG20' || Compression Chunk || rest of file || Compression Chunk will be either null or contain the ASCII 'Compression=XX' where XX is a code indicating which decompression to use on the rest of the file. === stage 2 === |||| rest of file from stage 1 || || Parameters Chunk || shredded changegroup (and possibly other sections?) || Parameters Chunk contains (among possibly other things?) the fact that the file contains a changegroup ('\x0bCHANGEGROUP'), a null chunk, and then a complex nested sequence of two parameter categories. The nested sequence contains, first, indicators for how many key:value pairs are in the first category, followed by how many pairs are in the second category, followed by the length of an ASCII key, followed by the length of its ASCII value (repeated for all keys and values). Example Parameters Chunk: || chunk length |||| description of contents || #section1 parameters || #section2 parameters || len(key1),len(value1) || len(key2),len(value2) || key1 || value1 || key2 || value2|| || 4 bytes || \x0bCHANGEGROUP || 4 bytes null || \x01 || \x01 || \x07\x02 || \t\x01 || version || 02 || nbchanges || 7 ||