* This only updates the "non-critical" parts of the directory
* cache, ie the parts that aren't tracked by GIT, and only used
@ -496,12 +511,10 @@ int add_cache_entry(struct cache_entry *ce, int option)
@@ -496,12 +511,10 @@ int add_cache_entry(struct cache_entry *ce, int option)
return 0;
}
static int verify_hdr(struct cache_header *hdr, unsigned long size, unsigned char *sha1)
static int verify_hdr(struct cache_header *hdr, unsigned long size)
{
SHA_CTX c;
unsigned char sha1_buf[20];
if (!sha1)
sha1 = sha1_buf;
unsigned char sha1[20];
if (hdr->hdr_signature != htonl(CACHE_SIGNATURE))
return error("bad signature");
@ -515,7 +528,23 @@ static int verify_hdr(struct cache_header *hdr, unsigned long size, unsigned cha
@@ -515,7 +528,23 @@ static int verify_hdr(struct cache_header *hdr, unsigned long size, unsigned cha
return 0;
}
int read_cache_1(unsigned char *cache_sha1)
static int read_index_extension(const char *ext, void *data, unsigned long sz)
{
switch (CACHE_EXT(ext)) {
case CACHE_EXT_TREE:
active_cache_tree = cache_tree_read(data, sz);
break;
default:
if (*ext < 'A' || 'Z' < *ext)
return error("index uses %.4s extension, which we do not understand",
@ -563,6 +592,22 @@ int read_cache_1(unsigned char *cache_sha1)
@@ -563,6 +592,22 @@ int read_cache_1(unsigned char *cache_sha1)
active_cache[i] = ce;
}
index_file_timestamp = st.st_mtime;
while (offset <= size - 20 - 8) {
/* After an array of active_nr index entries,
* there can be arbitrary number of extended
* sections, each of which is prefixed with
* extension name (4-byte) and section length
* in 4-byte network byte order.
*/
unsigned long extsize;
memcpy(&extsize, map + offset + 4, 4);
extsize = ntohl(extsize);
if (read_index_extension(map + offset,
map + offset + 8, extsize) < 0)
goto unmap;
offset += 8;
offset += extsize;
}
return active_nr;
unmap:
@ -597,7 +642,18 @@ static int ce_write(SHA_CTX *context, int fd, void *data, unsigned int len)
@@ -597,7 +642,18 @@ static int ce_write(SHA_CTX *context, int fd, void *data, unsigned int len)
return 0;
}
static int ce_flush(SHA_CTX *context, int fd, unsigned char *sha1)
static int write_index_ext_header(SHA_CTX *context, int fd,
unsigned long ext, unsigned long sz)
{
ext = htonl(ext);
sz = htonl(sz);
if ((ce_write(context, fd, &ext, 4) < 0) ||
(ce_write(context, fd, &sz, 4) < 0))
return -1;
return 0;
}
static int ce_flush(SHA_CTX *context, int fd)
{
unsigned int left = write_buffer_len;
@ -614,8 +670,7 @@ static int ce_flush(SHA_CTX *context, int fd, unsigned char *sha1)
@@ -614,8 +670,7 @@ static int ce_flush(SHA_CTX *context, int fd, unsigned char *sha1)