git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 01/16] Modify cache_header to prepare for other index formats

From
Thomas Gummerer <t.gummerer@gmail.com>
Date
Aug 2, 2012, 11:01 UTC
Message-ID
<1343905326-23790-2-git-send-email-t.gummerer@gmail.com>
In-Reply-To
<1343905326-23790-1-git-send-email-t.gummerer@gmail.com>

Modify the cache_header such that other index file formats can be added and reusing the common part of each index format.

The signature and version have to be present in every version of the index file format, to check if it can be read by a specific version of git, while other entries (eg. number of entries for index v2/3/4) can be different from one file format to another. Therefore it is split to its own struct.

Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---
 cache.h              |  5 ++++-
 read-cache.c         | 20 +++++++++++++-------
 test-index-version.c |  2 +-
 3 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/cache.h b/cache.h
index 6e9a243..d4028ef 100644
--- a/cache.h
+++ b/cache.h
@@ -99,9 +99,12 @@ unsigned long git_deflate_bound(git_zstream *, unsigned long);
  */
 
 #define CACHE_SIGNATURE 0x44495243	/* "DIRC" */
-struct cache_header {
+struct cache_version_header {
 	unsigned int hdr_signature;
 	unsigned int hdr_version;
+};
+
+struct cache_header_v2 {
 	unsigned int hdr_entries;
 };
 
diff --git a/read-cache.c b/read-cache.c
index ab00d02..c44b5f7 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -1247,7 +1247,7 @@ struct ondisk_cache_entry_extended {
 			    ondisk_cache_entry_extended_size(ce_namelen(ce)) : \
 			    ondisk_cache_entry_size(ce_namelen(ce)))
 
-static int verify_hdr(struct cache_header *hdr, unsigned long size)
+static int verify_hdr(struct cache_version_header *hdr, unsigned long size)
 {
 	git_SHA_CTX c;
 	unsigned char sha1[20];
@@ -1409,7 +1409,8 @@ int read_index_from(struct index_state *istate, const char *path)
 	int fd, i;
 	struct stat st;
 	unsigned long src_offset;
-	struct cache_header *hdr;
+	struct cache_version_header *hdr;
+	struct cache_header_v2 *hdr_v2;
 	void *mmap;
 	size_t mmap_size;
 	struct strbuf previous_name_buf = STRBUF_INIT, *previous_name;
@@ -1433,7 +1434,7 @@ int read_index_from(struct index_state *istate, const char *path)
 
 	errno = EINVAL;
 	mmap_size = xsize_t(st.st_size);
-	if (mmap_size < sizeof(struct cache_header) + 20)
+	if (mmap_size < sizeof(struct cache_version_header) + 20)
 		die("index file smaller than expected");
 
 	mmap = xmmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
@@ -1442,11 +1443,13 @@ int read_index_from(struct index_state *istate, const char *path)
 		die_errno("unable to map index file");
 
 	hdr = mmap;
+	hdr_v2 =  mmap + sizeof(*hdr);
 	if (verify_hdr(hdr, mmap_size) < 0)
 		goto unmap;
 
+	hdr_v2 = mmap + sizeof(*hdr);
 	istate->version = ntohl(hdr->hdr_version);
-	istate->cache_nr = ntohl(hdr->hdr_entries);
+	istate->cache_nr = ntohl(hdr_v2->hdr_entries);
 	istate->cache_alloc = alloc_nr(istate->cache_nr);
 	istate->cache = xcalloc(istate->cache_alloc, sizeof(struct cache_entry *));
 	istate->initialized = 1;
@@ -1456,7 +1459,7 @@ int read_index_from(struct index_state *istate, const char *path)
 	else
 		previous_name = NULL;
 
-	src_offset = sizeof(*hdr);
+	src_offset = sizeof(*hdr) + sizeof(*hdr_v2);
 	for (i = 0; i < istate->cache_nr; i++) {
 		struct ondisk_cache_entry *disk_ce;
 		struct cache_entry *ce;
@@ -1757,7 +1760,8 @@ void update_index_if_able(struct index_state *istate, struct lock_file *lockfile
 int write_index(struct index_state *istate, int newfd)
 {
 	git_SHA_CTX c;
-	struct cache_header hdr;
+	struct cache_version_header hdr;
+	struct cache_header_v2 hdr_v2;
 	int i, err, removed, extended, hdr_version;
 	struct cache_entry **cache = istate->cache;
 	int entries = istate->cache_nr;
@@ -1787,11 +1791,13 @@ int write_index(struct index_state *istate, int newfd)
 
 	hdr.hdr_signature = htonl(CACHE_SIGNATURE);
 	hdr.hdr_version = htonl(hdr_version);
-	hdr.hdr_entries = htonl(entries - removed);
+	hdr_v2.hdr_entries = htonl(entries - removed);
 
 	git_SHA1_Init(&c);
 	if (ce_write(&c, newfd, &hdr, sizeof(hdr)) < 0)
 		return -1;
+	if (ce_write(&c, newfd, &hdr_v2, sizeof(hdr_v2)) < 0)
+		return -1;
 
 	previous_name = (hdr_version == 4) ? &previous_name_buf : NULL;
 	for (i = 0; i < entries; i++) {
diff --git a/test-index-version.c b/test-index-version.c
index bfaad9e..f21372a 100644
--- a/test-index-version.c
+++ b/test-index-version.c
@@ -2,7 +2,7 @@
 
 int main(int argc, const char **argv)
 {
-	struct cache_header hdr;
+	struct cache_version_header hdr;
 	int version;
 
 	memset(&hdr,0,sizeof(hdr));
-- 
1.7.10.886.gdf6792c.dirty
Previous: Thomas GummererNext: Nguyen Thai Ngoc Duy
Message 2 of 38 in “[RFC 0/16] Introduce index file format version 5”
  1. Thomas GummererAug 2, 2012
  2. 01/16 Modify cache_header to prepare for other index formatsThomas Gummerer, Aug 2, 2012
  3. Nguyen Thai Ngoc DuyAug 2, 2012
  4. 02/16 Modify read functions to prepare for other index formatsThomas Gummerer, Aug 2, 2012
  5. 03/16 Modify match_stat_basic to prepare for other index formatsThomas Gummerer, Aug 2, 2012
  6. Nguyen Thai Ngoc DuyAug 2, 2012
  7. Thomas GummererAug 2, 2012
  8. 04/16 Modify write functions to prepare for other index formatsThomas Gummerer, Aug 2, 2012
  9. Nguyen Thai Ngoc DuyAug 2, 2012
  10. Thomas GummererAug 2, 2012
  11. 05/16 t2104: Don't fail when index version is 5Thomas Gummerer, Aug 2, 2012
  12. Thomas RastAug 3, 2012
  13. Thomas GummererAug 3, 2012
  14. Junio C HamanoAug 3, 2012
  15. 06/16 t3700: sleep for 1 second, to avoid interfering with the racy codeThomas Gummerer, Aug 2, 2012
  16. 07/16 Add documentation of the index-v5 file formatThomas Gummerer, Aug 2, 2012
  17. 08/16 Make in-memory format aware of stat_crcThomas Gummerer, Aug 2, 2012
  18. 09/16 Read index-v5Thomas Gummerer, Aug 2, 2012
  19. Nguyen Thai Ngoc DuyAug 2, 2012
  20. Thomas GummererAug 2, 2012
  21. 10/16 Read resolve-undo dataThomas Gummerer, Aug 2, 2012
  22. 11/16 Read cache-tree in index-v5Thomas Gummerer, Aug 2, 2012
  23. Thomas RastAug 3, 2012
  24. Thomas GummererAug 3, 2012
  25. 12/16 Write index-v5Thomas Gummerer, Aug 2, 2012
  26. 13/16 Write index-v5 cache-tree dataThomas Gummerer, Aug 2, 2012
  27. 14/16 Write resolve-undo data for index-v5Thomas Gummerer, Aug 2, 2012
  28. 15/16 update-index.c: add a force-rewrite optionThomas Gummerer, Aug 2, 2012
  29. 16/16 p0002-index.sh: add perf test for the index formatsThomas Gummerer, Aug 2, 2012
  30. Nguyen Thai Ngoc DuyAug 2, 2012
  31. Thomas GummererAug 2, 2012
  32. Nguyen Thai Ngoc DuyAug 2, 2012
  33. Thomas GummererAug 2, 2012
  34. Nguyen Thai Ngoc DuyAug 2, 2012
  35. Nguyen Thai Ngoc DuyAug 3, 2012
  36. Thomas GummererAug 3, 2012
  37. Thomas RastAug 3, 2012
  38. Thomas GummererAug 3, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.