| // Package packfile implements encoding and decoding of packfile format. |
| // |
| // == pack-*.pack files have the following format: |
| // |
| // - A header appears at the beginning and consists of the following: |
| // |
| // 4-byte signature: |
| // The signature is: {'P', 'A', 'C', 'K'} |
| // |
| // 4-byte version number (network byte order): |
| // GIT currently accepts version number 2 or 3 but |
| // generates version 2 only. |
| // |
| // 4-byte number of objects contained in the pack (network byte order) |
| // |
| // Observation: we cannot have more than 4G versions ;-) and |
| // more than 4G objects in a pack. |
| // |
| // - The header is followed by number of object entries, each of |
| // which looks like this: |
| // |
| // (undeltified representation) |
| // n-byte type and length (3-bit type, (n-1)*7+4-bit length) |
| // compressed data |
| // |
| // (deltified representation) |
| // n-byte type and length (3-bit type, (n-1)*7+4-bit length) |
| // 20-byte base object name |
| // compressed delta data |
| // |
| // Observation: length of each object is encoded in a variable |
| // length format and is not constrained to 32-bit or anything. |
| // |
| // - The trailer records 20-byte SHA1 checksum of all of the above. |
| // |
| // |
| // Source: |
| // https://www.kernel.org/pub/software/scm/git/docs/v1.7.5/technical/pack-protocol.txt |
| package packfile |