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

[PATCH 13/16] Write index-v5 cache-tree data

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

Write the cache-tree data for the index version 5 file format. The in-memory cache-tree data is converted to the ondisk format, by adding it to the directory entries, that were compiled from the cache-entries in the step before.

Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---
 cache-tree.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 cache-tree.h |  1 +
 read-cache.c |  2 ++
 3 files changed, 55 insertions(+)
diff --git a/cache-tree.c b/cache-tree.c
index 6a314aa..bf945ef 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -612,6 +612,58 @@ struct cache_tree *cache_tree_convert_v5(struct directory_entry *de)
 	return convert_one(queue, 0);
 }
 
+
+static void convert_one_to_ondisk_v5(struct hash_table *table, struct cache_tree *it,
+				const char *path, int pathlen, uint32_t crc)
+{
+	int i;
+	struct directory_entry *found, *search;
+
+	crc = crc32(crc, (Bytef*)path, pathlen);
+	found = lookup_hash(crc, table);
+	search = found;
+	while (search && strcmp(path, search->pathname + search->de_pathlen - strlen(path)) != 0)
+		search = search->next_hash;
+	if (!search)
+		return;
+	/*
+	 * The number of subtrees is already calculated by
+	 * compile_directory_data, therefore we only need to
+	 * add the entry_count
+	 */
+	search->de_nentries = it->entry_count;
+	if (0 <= it->entry_count)
+		hashcpy(search->sha1, it->sha1);
+	if (strcmp(path, "") != 0)
+		crc = crc32(crc, (Bytef*)"/", 1);
+
+#if DEBUG
+	if (0 <= it->entry_count)
+		fprintf(stderr, "cache-tree <%.*s> (%d ent, %d subtree) %s\n",
+			pathlen, path, it->entry_count, it->subtree_nr,
+			sha1_to_hex(it->sha1));
+	else
+		fprintf(stderr, "cache-tree <%.*s> (%d subtree) invalid\n",
+			pathlen, path, it->subtree_nr);
+#endif
+
+	for (i = 0; i < it->subtree_nr; i++) {
+		struct cache_tree_sub *down = it->down[i];
+		if (i) {
+			struct cache_tree_sub *prev = it->down[i-1];
+			if (subtree_name_cmp(down->name, down->namelen,
+					     prev->name, prev->namelen) <= 0)
+				die("fatal - unsorted cache subtree");
+		}
+		convert_one_to_ondisk_v5(table, down->cache_tree, down->name, down->namelen, crc);
+	}
+}
+
+void cache_tree_to_ondisk_v5(struct hash_table *table, struct cache_tree *root)
+{
+	convert_one_to_ondisk_v5(table, root, "", 0, 0);
+}
+
 static struct cache_tree *cache_tree_find(struct cache_tree *it, const char *path)
 {
 	if (!it)
diff --git a/cache-tree.h b/cache-tree.h
index f4131a6..a41b684 100644
--- a/cache-tree.h
+++ b/cache-tree.h
@@ -33,6 +33,7 @@ struct cache_tree_sub *cache_tree_sub(struct cache_tree *, const char *);
 void cache_tree_write(struct strbuf *, struct cache_tree *root);
 struct cache_tree *cache_tree_read(const char *buffer, unsigned long size);
 struct cache_tree *cache_tree_convert_v5(struct directory_entry *de);
+void cache_tree_to_ondisk_v5(struct hash_table *table, struct cache_tree *root);
 
 int cache_tree_fully_valid(struct cache_tree *);
 int cache_tree_update(struct cache_tree *, struct cache_entry **, int, int);
diff --git a/read-cache.c b/read-cache.c
index 0f1a218..6538ddf 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -2742,6 +2742,8 @@ static struct directory_entry *compile_directory_data(struct index_state *istate
 			previous_entry->next = no_subtrees;
 		}
 	}
+	if (istate->cache_tree)
+		cache_tree_to_ondisk_v5(&table, istate->cache_tree);
 	return de;
 }
 
-- 
1.7.10.886.gdf6792c.dirty
Previous: Thomas GummererNext: Thomas Gummerer
Message 26 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.