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

[PATCH] Write index file on any checkout of files

From
Daniel Barkalow <barkalow@iabervon.org>
Date
Feb 28, 2008, 15:58 UTC
Message-ID
<alpine.LNX.1.00.0802281058190.19665@iabervon.org>
In-Reply-To
<87wsop188j.fsf@wine.dyndns.org>

We need to rewrite the index file when we check out files, even if we haven't modified the blob info by reading from another tree, so that we get the stat cache to include the fact that we just modified the file so it doesn't need to be refreshed.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
---
 builtin-checkout.c |   24 +++++++++++-------------
 1 files changed, 11 insertions(+), 13 deletions(-)
diff --git a/builtin-checkout.c b/builtin-checkout.c
index 4a4bb8b..7c620e6 100644
--- a/builtin-checkout.c
+++ b/builtin-checkout.c
@@ -67,17 +67,8 @@ static int update_some(const unsigned char *sha1, const char *base, int baselen,
 
 static int read_tree_some(struct tree *tree, const char **pathspec)
 {
-	int newfd;
-	struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
-	newfd = hold_locked_index(lock_file, 1);
-	read_cache();
-
 	read_tree_recursive(tree, "", 0, 0, pathspec, update_some);
 
-	if (write_cache(newfd, active_cache, active_nr) ||
-	    commit_locked_index(lock_file))
-		die("unable to write new index file");
-
 	/* update the index with the given tree's info
 	 * for all args, expanding wildcards, and exit
 	 * with any non-zero return code.
@@ -85,7 +76,7 @@ static int read_tree_some(struct tree *tree, const char **pathspec)
 	return 0;
 }
 
-static int checkout_paths(const char **pathspec)
+static int checkout_paths(const char **pathspec, int newfd, struct lock_file *lock_file)
 {
 	int pos;
 	struct checkout state;
@@ -116,6 +107,10 @@ static int checkout_paths(const char **pathspec)
 		}
 	}
 
+	if (write_cache(newfd, active_cache, active_nr) ||
+	    commit_locked_index(lock_file))
+		die("unable to write new index file");
+
 	resolve_ref("HEAD", rev, 0, &flag);
 	head = lookup_commit_reference_gently(rev, 1);
 
@@ -554,11 +549,14 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
 			}
 		}
 
+		int newfd;
+		struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
+		newfd = hold_locked_index(lock_file, 1);
+		read_cache();
+
 		if (source_tree)
 			read_tree_some(source_tree, pathspec);
-		else
-			read_cache();
-		return checkout_paths(pathspec);
+		return checkout_paths(pathspec, newfd, lock_file);
 	}
 
 	if (new.name && !new.commit) {
-- 
1.5.4.3.328.gcaed
Previous: Daniel BarkalowNext: Alexandre Julliard
Message 3 of 8 in “git-checkout regression?”
  1. Alexandre JulliardFeb 28, 2008
  2. Daniel BarkalowFeb 28, 2008
  3. Write index file on any checkout of filesDaniel Barkalow, Feb 28, 2008
  4. Alexandre JulliardFeb 28, 2008
  5. Daniel BarkalowFeb 28, 2008
  6. Junio C HamanoFeb 28, 2008
  7. Daniel BarkalowFeb 28, 2008
  8. Junio C HamanoFeb 28, 2008

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.