GIT bitmap v1 format
====================

	- A header appears at the beginning:

		4-byte signature: {'B', 'I', 'T', 'M'}

		2-byte version number (network byte order)
			The current implementation only supports version 1
			of the bitmap index (the same one as JGit).

		2-byte flags (network byte order)

			The following flags are supported:

			- BITMAP_OPT_FULL_DAG (0x1) REQUIRED
			This flag must always be present. It implies that the bitmap
			index has been generated for a packfile with full closure
			(i.e. where every single object in the packfile can find
			 its parent links inside the same packfile). This is a
			requirement for the bitmap index format, also present in JGit,
			that greatly reduces the complexity of the implementation.

			- BITMAP_OPT_HASH_CACHE (0x4)
			If present, the end of the bitmap file contains
			`N` 32-bit name-hash values, one per object in the
			pack. The format and meaning of the name-hash is
			described below.

		4-byte entry count (network byte order)

			The total count of entries (bitmapped commits) in this bitmap index.

		20-byte checksum

			The SHA1 checksum of the pack this bitmap index belongs to.

	- 4 EWAH bitmaps that act as type indexes

		Type indexes are serialized after the hash cache in the shape
		of four EWAH bitmaps stored consecutively (see Appendix A for
		the serialization format of an EWAH bitmap).

		There is a bitmap for each Git object type, stored in the following
		order:

			- Commits
			- Trees
			- Blobs
			- Tags

		In each bitmap, the `n`th bit is set to true if the `n`th object
		in the packfile is of that type.

		The obvious consequence is that the OR of all 4 bitmaps will result
		in a full set (all bits set), and the AND of all 4 bitmaps will
		result in an empty bitmap (no bits set).

	- N entries with compressed bitmaps, one for each indexed commit

		Where `N` is the total amount of entries in this bitmap index.
		Each entry contains the following:

		- 4-byte object position (network byte order)
			The position **in the index for the packfile** where the
			bitmap for this commit is found.

		- 1-byte XOR-offset
			The xor offset used to compress this bitmap. For an entry
			in position `x`, a XOR offset of `y` means that the actual
			bitmap representing this commit is composed by XORing the
			bitmap for this entry with the bitmap in entry `x-y` (i.e.
			the bitmap `y` entries before this one).

			Note that this compression can be recursive. In order to
			XOR this entry with a previous one, the previous entry needs
			to be decompressed first, and so on.

			The hard-limit for this offset is 160 (an entry can only be
			xor'ed against one of the 160 entries preceding it). This
			number is always positive, and hence entries are always xor'ed
			with **previous** bitmaps, not bitmaps that will come afterwards
			in the index.

		- 1-byte flags for this bitmap
			At the moment the only available flag is `0x1`, which hints
			that this bitmap can be re-used when rebuilding bitmap indexes
			for the repository.

		- The compressed bitmap itself, see Appendix A.

== Appendix A: Serialization format for an EWAH bitmap

Ewah bitmaps are serialized in the same protocol as the JAVAEWAH
library, making them backwards compatible with the JGit
implementation:

	- 4-byte number of bits of the resulting UNCOMPRESSED bitmap

	- 4-byte number of words of the COMPRESSED bitmap, when stored

	- N x 8-byte words, as specified by the previous field

		This is the actual content of the compressed bitmap.

	- 4-byte position of the current RLW for the compressed
		bitmap

All words are stored in network byte order for their corresponding
sizes.

The compressed bitmap is stored in a form of run-length encoding, as
follows.  It consists of a concatenation of an arbitrary number of
chunks.  Each chunk consists of one or more 64-bit words

     H  L_1  L_2  L_3 .... L_M

H is called RLW (run length word).  It consists of (from lower to higher
order bits):

     - 1 bit: the repeated bit B

     - 32 bits: repetition count K (unsigned)

     - 31 bits: literal word count M (unsigned)

The bitstream represented by the above chunk is then:

     - K repetitions of B

     - The bits stored in `L_1` through `L_M`.  Within a word, bits at
       lower order come earlier in the stream than those at higher
       order.

The next word after `L_M` (if any) must again be a RLW, for the next
chunk.  For efficient appending to the bitstream, the EWAH stores a
pointer to the last RLW in the stream.


== Appendix B: Optional Bitmap Sections

These sections may or may not be present in the `.bitmap` file; their
presence is indicated by the header flags section described above.

Name-hash cache
---------------

If the BITMAP_OPT_HASH_CACHE flag is set, the end of the bitmap contains
a cache of 32-bit values, one per object in the pack. The value at
position `i` is the hash of the pathname at which the `i`th object
(counting in index order) in the pack can be found.  This can be fed
into the delta heuristics to compare objects with similar pathnames.

The hash algorithm used is:

    hash = 0;
    while ((c = *name++))
	    if (!isspace(c))
		    hash = (hash >> 2) + (c << 24);

Note that this hashing scheme is tied to the BITMAP_OPT_HASH_CACHE flag.
If implementations want to choose a different hashing scheme, they are
free to do so, but MUST allocate a new header flag (because comparing
hashes made under two different schemes would be pointless).
