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

[PATCH 03/16] Modify match_stat_basic to prepare for other index formats

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

Modify match_stat_basic, into one function that handles the general case, which is the same for all index formats, and a function that handles the specific parts for each index file version.

Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---
 read-cache.c | 77 +++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 40 insertions(+), 37 deletions(-)
diff --git a/read-cache.c b/read-cache.c
index 3d83f05..6a0af35 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -163,38 +163,10 @@ static int ce_modified_check_fs(struct cache_entry *ce, struct stat *st)
 	return 0;
 }
 
-static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
+static int ce_match_stat_basic_v2(struct cache_entry *ce,
+				struct stat *st,
+				int changed)
 {
-	unsigned int changed = 0;
-
-	if (ce->ce_flags & CE_REMOVE)
-		return MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED;
-
-	switch (ce->ce_mode & S_IFMT) {
-	case S_IFREG:
-		changed |= !S_ISREG(st->st_mode) ? TYPE_CHANGED : 0;
-		/* We consider only the owner x bit to be relevant for
-		 * "mode changes"
-		 */
-		if (trust_executable_bit &&
-		    (0100 & (ce->ce_mode ^ st->st_mode)))
-			changed |= MODE_CHANGED;
-		break;
-	case S_IFLNK:
-		if (!S_ISLNK(st->st_mode) &&
-		    (has_symlinks || !S_ISREG(st->st_mode)))
-			changed |= TYPE_CHANGED;
-		break;
-	case S_IFGITLINK:
-		/* We ignore most of the st_xxx fields for gitlinks */
-		if (!S_ISDIR(st->st_mode))
-			changed |= TYPE_CHANGED;
-		else if (ce_compare_gitlink(ce))
-			changed |= DATA_CHANGED;
-		return changed;
-	default:
-		die("internal error: ce_mode is %o", ce->ce_mode);
-	}
 	if (ce->ce_mtime.sec != (unsigned int)st->st_mtime)
 		changed |= MTIME_CHANGED;
 	if (trust_ctime && ce->ce_ctime.sec != (unsigned int)st->st_ctime)
@@ -235,6 +207,43 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
 	return changed;
 }
 
+static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
+{
+	unsigned int changed = 0;
+
+	if (ce->ce_flags & CE_REMOVE)
+		return MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED;
+
+	switch (ce->ce_mode & S_IFMT) {
+	case S_IFREG:
+		changed |= !S_ISREG(st->st_mode) ? TYPE_CHANGED : 0;
+		/* We consider only the owner x bit to be relevant for
+		 * "mode changes"
+		 */
+		if (trust_executable_bit &&
+		    (0100 & (ce->ce_mode ^ st->st_mode)))
+			changed |= MODE_CHANGED;
+		break;
+	case S_IFLNK:
+		if (!S_ISLNK(st->st_mode) &&
+		    (has_symlinks || !S_ISREG(st->st_mode)))
+			changed |= TYPE_CHANGED;
+		break;
+	case S_IFGITLINK:
+		/* We ignore most of the st_xxx fields for gitlinks */
+		if (!S_ISDIR(st->st_mode))
+			changed |= TYPE_CHANGED;
+		else if (ce_compare_gitlink(ce))
+			changed |= DATA_CHANGED;
+		return changed;
+	default:
+		die("internal error: ce_mode is %o", ce->ce_mode);
+	}
+
+	changed = ce_match_stat_basic_v2(ce, st, changed);
+	return changed;
+}
+
 static int is_racy_timestamp(const struct index_state *istate, struct cache_entry *ce)
 {
 	return (!S_ISGITLINK(ce->ce_mode) &&
@@ -1443,7 +1452,6 @@ void read_index_v2(struct index_state *istate, void *mmap, int mmap_size)
 		src_offset += consumed;
 	}
 	strbuf_release(&previous_name_buf);
-
 	while (src_offset <= mmap_size - 20 - 8) {
 		/* After an array of active_nr index entries,
 		 * there can be arbitrary number of extended
@@ -1500,7 +1508,6 @@ int read_index_from(struct index_state *istate, const char *path)
 		die("index file smaller than expected");
 
 	mmap = xmmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
-	close(fd);
 	if (mmap == MAP_FAILED)
 		die_errno("unable to map index file");
 
@@ -1512,7 +1519,6 @@ int read_index_from(struct index_state *istate, const char *path)
 		goto unmap;
 
 	read_index_v2(istate, mmap, mmap_size);
-
 	istate->timestamp.sec = st.st_mtime;
 	istate->timestamp.nsec = ST_MTIME_NSEC(st);
 
@@ -1802,9 +1808,6 @@ int write_index(struct index_state *istate, int newfd)
 		}
 	}
 
-	if (!istate->version)
-		istate->version = INDEX_FORMAT_DEFAULT;
-
 	/* demote version 3 to version 2 when the latter suffices */
 	if (istate->version == 3 || istate->version == 2)
 		istate->version = extended ? 3 : 2;
-- 
1.7.10.886.gdf6792c.dirty
Previous: Thomas GummererNext: Nguyen Thai Ngoc Duy
Message 5 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.