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

[PATCH 09/32] index: make narrow index incompatible with older git

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Aug 24, 2010, 22:19 UTC
Message-ID
<1282688422-7738-10-git-send-email-pclouds@gmail.com>
In-Reply-To
<1282688422-7738-1-git-send-email-pclouds@gmail.com>

Index in narrow repos is not a full index and should not be used to create commits without modification (to be explained later on).

Also save narrow prefix inside index and check against $GIT_DIR/narrow, just in case.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 cache.h                |    1 +
 read-cache.c           |   35 +++++++++++++++++++++++++++++++----
 t/t6060-narrow-tree.sh |   28 ++++++++++++++++++++++++++++
 3 files changed, 60 insertions(+), 4 deletions(-)
 create mode 100755 t/t6060-narrow-tree.sh
diff --git a/cache.h b/cache.h
index ff401ec..6bc80b3 100644
--- a/cache.h
+++ b/cache.h
@@ -293,6 +293,7 @@ struct index_state {
 	struct string_list *resolve_undo;
 	struct cache_tree *cache_tree;
 	struct cache_time timestamp;
+	char *narrow_prefix;
 	void *alloc;
 	unsigned name_hash_initialized : 1,
 		 initialized : 1;
diff --git a/read-cache.c b/read-cache.c
index 881dd93..20b619c 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -25,8 +25,9 @@ static struct cache_entry *refresh_cache_entry(struct cache_entry *ce, int reall
  */
 
 #define CACHE_EXT(s) ( (s[0]<<24)|(s[1]<<16)|(s[2]<<8)|(s[3]) )
-#define CACHE_EXT_TREE 0x54524545	/* "TREE" */
+#define CACHE_EXT_TREE 0x54524545	  /* "TREE" */
 #define CACHE_EXT_RESOLVE_UNDO 0x52455543 /* "REUC" */
+#define CACHE_EXT_NARROW 0x4e415257	  /* "NARW" */
 
 struct index_state the_index;
 
@@ -1168,7 +1169,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);
@@ -1188,6 +1191,9 @@ static int read_index_extension(struct index_state *istate,
 	case CACHE_EXT_RESOLVE_UNDO:
 		istate->resolve_undo = resolve_undo_read(data, sz);
 		break;
+	case CACHE_EXT_NARROW:
+		istate->narrow_prefix = xstrdup(data);
+		break;
 	default:
 		if (*ext < 'A' || 'Z' < *ext)
 			return error("index uses %.4s extension, which we do not understand",
@@ -1352,6 +1358,16 @@ int read_index_from(struct index_state *istate, const char *path)
 		src_offset += extsize;
 	}
 	munmap(mmap, mmap_size);
+
+	if ((!get_narrow_prefix() && !istate->narrow_prefix) ||
+	    (get_narrow_prefix() && istate->narrow_prefix &&
+	     !strcmp(get_narrow_prefix(), istate->narrow_prefix)))
+		;		/* good */
+	else
+		die("Incompatible index and narrow mode (%s/%s)",
+		    get_narrow_prefix(),
+		    istate->narrow_prefix);
+
 	return istate->cache_nr;
 
 unmap:
@@ -1549,7 +1565,7 @@ int write_index(struct index_state *istate, int newfd)
 {
 	git_SHA_CTX c;
 	struct cache_header hdr;
-	int i, err, removed, extended;
+	int i, err, removed, extended, ver;
 	struct cache_entry **cache = istate->cache;
 	int entries = istate->cache_nr;
 	struct stat st;
@@ -1568,7 +1584,11 @@ int write_index(struct index_state *istate, int newfd)
 
 	hdr.hdr_signature = htonl(CACHE_SIGNATURE);
 	/* for extended format, increase version so older git won't try to read it */
-	hdr.hdr_version = htonl(extended ? 3 : 2);
+	ver = extended ? 3 : 2;
+	if (get_narrow_prefix() && ver < 4)
+		ver = 4;	/* narrow-unaware git should to touch this index */
+
+	hdr.hdr_version = htonl(ver);
 	hdr.hdr_entries = htonl(entries - removed);
 
 	git_SHA1_Init(&c);
@@ -1607,6 +1627,13 @@ int write_index(struct index_state *istate, int newfd)
 		if (err)
 			return -1;
 	}
+	if (get_narrow_prefix()) {
+		int len = strlen(get_narrow_prefix())+1;
+		err = write_index_ext_header(&c, newfd, CACHE_EXT_NARROW, len) < 0 ||
+			ce_write(&c, newfd, get_narrow_prefix(), len) < 0;
+		if (err)
+			return -1;
+	}
 
 	if (ce_flush(&c, newfd) || fstat(newfd, &st))
 		return -1;
diff --git a/t/t6060-narrow-tree.sh b/t/t6060-narrow-tree.sh
new file mode 100755
index 0000000..0e561c8
--- /dev/null
+++ b/t/t6060-narrow-tree.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+test_description='narrow-tree tests'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+	: >test
+'
+
+test_expect_success 'index ver 4 in narrow mode' '
+	echo foo >.git/narrow &&
+	git update-index --add test &&
+	echo 4 >expected &&
+	test-index-version < .git/index >result &&
+	test_cmp expected result
+'
+
+test_expect_success 'index ver < 4 when narrow mode is gone' '
+	rm .git/narrow &&
+	rm .git/index &&
+	git update-index --add test &&
+	echo 2 >expected &&
+	test-index-version < .git/index >result &&
+	test_cmp expected result
+'
+
+test_done
-- 
1.7.1.rc1.69.g24c2f7
Previous: Nguyễn Thái Ngọc DuyNext: Jonathan Nieder
Message 19 of 66 in “subtree clone v2”
  1. 00/32 subtree clone v2Nguyễn Thái Ngọc Duy, Aug 24, 2010
  2. 01/32 add const to ce_write()Nguyễn Thái Ngọc Duy, Aug 24, 2010
  3. 02/32 cache-tree: abstract out write_sha1_file from cache_tree_update()Nguyễn Thái Ngọc Duy, Aug 24, 2010
  4. Jonathan NiederAug 24, 2010
  5. 03/32 cache-tree: ignore CE_REMOVE entries in verify_cache()Nguyễn Thái Ngọc Duy, Aug 24, 2010
  6. Jonathan NiederAug 24, 2010
  7. Nguyen Thai Ngoc DuyAug 25, 2010
  8. Jonathan NiederAug 25, 2010
  9. 04/32 move do_compress() from pack-objects.c to pack-write.cNguyễn Thái Ngọc Duy, Aug 24, 2010
  10. Jonathan NiederAug 24, 2010
  11. Nguyen Thai Ngoc DuyAug 25, 2010
  12. 05/32 pack-write: add functions for creating simple packsNguyễn Thái Ngọc Duy, Aug 24, 2010
  13. 06/32 tree.c: Add {set,clear}_tree_marksNguyễn Thái Ngọc Duy, Aug 24, 2010
  14. 07/32 tree.c: find_subtree() to search for a treeNguyễn Thái Ngọc Duy, Aug 24, 2010
  15. Elijah NewrenAug 25, 2010
  16. Nguyen Thai Ngoc DuyAug 25, 2010
  17. Elijah NewrenAug 25, 2010
  18. 08/32 Add $GIT_DIR/narrow checkNguyễn Thái Ngọc Duy, Aug 24, 2010
  19. 09/32 index: make narrow index incompatible with older gitNguyễn Thái Ngọc Duy, Aug 24, 2010
  20. Jonathan NiederAug 24, 2010
  21. Nguyen Thai Ngoc DuyAug 25, 2010
  22. 10/32 rev-list: support traversing in narrow repository modeNguyễn Thái Ngọc Duy, Aug 24, 2010
  23. Elijah NewrenAug 25, 2010
  24. 11/32 rev-list: support --narrow-treeNguyễn Thái Ngọc Duy, Aug 24, 2010
  25. Elijah NewrenAug 25, 2010
  26. Nguyen Thai Ngoc DuyAug 25, 2010
  27. 12/32 pack-objects: support --narrow-treeNguyễn Thái Ngọc Duy, Aug 24, 2010
  28. 13/32 upload-pack: support narrow-tree capabilityNguyễn Thái Ngọc Duy, Aug 24, 2010
  29. 14/32 fetch-pack: support --narrow-treeNguyễn Thái Ngọc Duy, Aug 24, 2010
  30. 15/32 unpack_trees: only unpack $GIT_DIR/narrow subtree in narrow repositoryNguyễn Thái Ngọc Duy, Aug 24, 2010
  31. Elijah NewrenAug 25, 2010
  32. Nguyen Thai Ngoc DuyAug 25, 2010
  33. 16/32 cache-tree: only cache tree within narrow areaNguyễn Thái Ngọc Duy, Aug 24, 2010
  34. 17/32 tree-diff: add narrow versions of diff_{root_,}tree_sha1Nguyễn Thái Ngọc Duy, Aug 24, 2010
  35. 18/32 log-tree: use narrow version of diff_tree_sha1Nguyễn Thái Ngọc Duy, Aug 24, 2010
  36. 19/32 clone: support --narrow optionNguyễn Thái Ngọc Duy, Aug 24, 2010
  37. 20/32 narrow-tree: add join_narrow_tree to do tree fixup for commitsNguyễn Thái Ngọc Duy, Aug 24, 2010
  38. 21/32 commit: add narrow's commit_tree versionNguyễn Thái Ngọc Duy, Aug 24, 2010
  39. 22/32 commit: use commit_narrow_tree() to support narrow repoNguyễn Thái Ngọc Duy, Aug 24, 2010
  40. 23/32 commit-tree: require --narrow-base in narrow repoNguyễn Thái Ngọc Duy, Aug 24, 2010
  41. 24/32 merge: refuse to merge if narrow bases are differentNguyễn Thái Ngọc Duy, Aug 24, 2010
  42. 25/32 merge: prepare commit properly in narrow modeNguyễn Thái Ngọc Duy, Aug 24, 2010
  43. 26/32 Add upload-narrow-base commandNguyễn Thái Ngọc Duy, Aug 24, 2010
  44. 27/32 rev-list: traverse some more trees to make upload-narrow-base happyNguyễn Thái Ngọc Duy, Aug 24, 2010
  45. 28/32 narrow-tree: add oldest_narrow_base()Nguyễn Thái Ngọc Duy, Aug 24, 2010
  46. 29/32 Add command fetch-narrow-baseNguyễn Thái Ngọc Duy, Aug 24, 2010
  47. 30/32 merge: support merging when narrow bases are differentNguyễn Thái Ngọc Duy, Aug 24, 2010
  48. 31/32 send-pack: do not use thin pack in narrow modeNguyễn Thái Ngọc Duy, Aug 24, 2010
  49. 32/32 daemon: support upload-narrow-baseNguyễn Thái Ngọc Duy, Aug 24, 2010
  50. Jonathan NiederAug 24, 2010
  51. Nguyen Thai Ngoc DuyAug 24, 2010
  52. Jonathan NiederAug 24, 2010
  53. Nguyen Thai Ngoc DuyAug 25, 2010
  54. Elijah NewrenAug 25, 2010
  55. Nguyen Thai Ngoc DuyAug 25, 2010
  56. Elijah NewrenAug 25, 2010
  57. Nguyen Thai Ngoc DuyAug 25, 2010
  58. Elijah NewrenAug 25, 2010
  59. Nguyen Thai Ngoc DuyAug 25, 2010
  60. Elijah NewrenAug 26, 2010
  61. Nguyen Thai Ngoc DuyAug 26, 2010
  62. Elijah NewrenAug 26, 2010
  63. Nguyen Thai Ngoc DuyAug 26, 2010
  64. Elijah NewrenAug 25, 2010
  65. Junio C HamanoAug 25, 2010
  66. Elijah NewrenAug 25, 2010

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.