v4 adds 32-bit field to cache header after 32-bit number of entries. If this field is zero, fall back to v3. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- Documentation/technical/index-format.txt | 4 ++- cache.h | 6 +++++ read-cache.c | 31 ++++++++++++++++++++++------- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Documentation/technical/index-format.txt b/Documentation/technical/index-format.txt index 8930b3f..2b6a38e 100644 --- a/Documentation/technical/index-format.txt +++ b/Documentation/technical/index-format.txt @@ -12,10 +12,12 @@ GIT index format The signature is { 'D', 'I', 'R', 'C' } (stands for "dircache") 4-byte version number: - The current supported versions are 2 and 3. + The current supported versions are 2, 3 and 4. 32-bit number of index entries. + 32-bit flags (version 4 only). + - A number of sorted index entries (see below). - Extensions diff --git a/cache.h b/cache.h index 9bd8c2d..c2e884a 100644 --- a/cache.h +++ b/cache.h @@ -105,6 +105,11 @@ struct cache_header { unsigned int hdr_entries; }; +struct ext_cache_header { + struct cache_header h; + unsigned int hdr_flags; +}; + /* * The "cache_time" is just the low 32 bits of the * time. It doesn't matter if it overflows - we only @@ -314,6 +319,7 @@ static inline unsigned int canon_mode(unsigned int mode) struct index_state { struct cache_entry **cache; unsigned int cache_nr, cache_alloc, cache_changed; + unsigned int hdr_flags; struct string_list *resolve_undo; struct cache_tree *cache_tree; struct cache_time timestamp; diff --git a/read-cache.c b/read-cache.c index fe6b0e0..fd21af6 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1190,7 +1190,9 @@ static int verify_hdr(struct cache_header *hdr, unsigned long size) if (hdr->hdr_signature != htonl(CACHE_SIGNATURE)) return error("bad signature"); - if (hdr->hdr_version != htonl(2) && hdr->hdr_version != htonl(3)) + if (hdr->hdr_version != htonl(2) && + hdr->hdr_version != htonl(3) && + hdr->hdr_version != htonl(4)) return error("bad index version"); git_SHA1_Init(&c); git_SHA1_Update(&c, hdr, size - 20); @@ -1320,7 +1322,12 @@ int read_index_from(struct index_state *istate, const char *path) istate->cache = xcalloc(istate->cache_alloc, sizeof(struct cache_entry *)); istate->initialized = 1; - src_offset = sizeof(*hdr); + if (ntohl(hdr->hdr_version) >= 4) { + struct ext_cache_header *ehdr = mmap; + istate->hdr_flags = ntohl(ehdr->hdr_flags); + src_offset = sizeof(*ehdr); + } else + src_offset = sizeof(*hdr); for (i = 0; i < istate->cache_nr; i++) { struct ondisk_cache_entry *disk_ce; struct cache_entry *ce; @@ -1375,6 +1382,7 @@ int discard_index(struct index_state *istate) resolve_undo_clear_index(istate); istate->cache_nr = 0; istate->cache_changed = 0; + istate->hdr_flags = 0; istate->timestamp.sec = 0; istate->timestamp.nsec = 0; istate->name_hash_initialized = 0; @@ -1531,8 +1539,8 @@ void update_index_if_able(struct index_state *istate, struct lock_file *lockfile int write_index(struct index_state *istate, int newfd) { struct sha1file *f; - struct cache_header hdr; - int i, err, removed; + struct ext_cache_header hdr; + int i, err, removed, hdr_size; struct cache_entry **cache = istate->cache; int entries = istate->cache_nr; struct stat st; @@ -1548,12 +1556,19 @@ int write_index(struct index_state *istate, int newfd) } } - hdr.hdr_signature = htonl(CACHE_SIGNATURE); - hdr.hdr_version = htonl(3); - hdr.hdr_entries = htonl(entries - removed); + hdr.h.hdr_signature = htonl(CACHE_SIGNATURE); + if (istate->hdr_flags) { + hdr.h.hdr_version = htonl(4); + hdr.hdr_flags = htonl(istate->hdr_flags); + hdr_size = sizeof(hdr); + } else { + hdr.h.hdr_version = htonl(3); + hdr_size = sizeof(hdr.h); + } + hdr.h.hdr_entries = htonl(entries - removed); f = sha1fd(newfd, NULL); - if (ce_write(f, &hdr, sizeof(hdr)) < 0) + if (ce_write(f, &hdr, hdr_size) < 0) return -1; for (i = 0; i < entries; i++) { -- 1.7.8.36.g69ee2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html