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

[PATCH v3 05/12] write_entry(): separate two helper functions out

From
Junio C Hamano <gitster@pobox.com>
Date
May 21, 2011, 06:56 UTC
Message-ID
<1305960995-25738-6-git-send-email-gitster@pobox.com>
In-Reply-To
<1305960995-25738-1-git-send-email-gitster@pobox.com>

In the write-out codepath, a block of code determines what file in the working tree to write to, and opens an output file descriptor to it.

After writing the contents out to the file, another block of code runs fstat() on the file descriptor when appropriate.

Separate these blocks out to open_output_fd() and fstat_output() helper functions.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 entry.c |   43 ++++++++++++++++++++++++++-----------------
 1 files changed, 26 insertions(+), 17 deletions(-)
diff --git a/entry.c b/entry.c
index b017167..cc6502a 100644
--- a/entry.c
+++ b/entry.c
@@ -91,6 +91,29 @@ static void *read_blob_entry(struct cache_entry *ce, unsigned long *size)
 	return NULL;
 }
 
+static int open_output_fd(char *path, struct cache_entry *ce, int to_tempfile)
+{
+	int symlink = (ce->ce_mode & S_IFMT) != S_IFREG;
+	if (to_tempfile) {
+		strcpy(path, symlink
+		       ? ".merge_link_XXXXXX" : ".merge_file_XXXXXX");
+		return mkstemp(path);
+	} else {
+		return create_file(path, !symlink ? ce->ce_mode : 0666);
+	}
+}
+
+static int fstat_output(int fd, const struct checkout *state, struct stat *st)
+{
+	/* use fstat() only when path == ce->name */
+	if (fstat_is_reliable() &&
+	    state->refresh_cache && !state->base_dir_len) {
+		fstat(fd, st);
+		return 1;
+	}
+	return 0;
+}
+
 static int write_entry(struct cache_entry *ce, char *path, const struct checkout *state, int to_tempfile)
 {
 	unsigned int ce_mode_s_ifmt = ce->ce_mode & S_IFMT;
@@ -128,17 +151,7 @@ static int write_entry(struct cache_entry *ce, char *path, const struct checkout
 			size = newsize;
 		}
 
-		if (to_tempfile) {
-			if (ce_mode_s_ifmt == S_IFREG)
-				strcpy(path, ".merge_file_XXXXXX");
-			else
-				strcpy(path, ".merge_link_XXXXXX");
-			fd = mkstemp(path);
-		} else if (ce_mode_s_ifmt == S_IFREG) {
-			fd = create_file(path, ce->ce_mode);
-		} else {
-			fd = create_file(path, 0666);
-		}
+		fd = open_output_fd(path, ce, to_tempfile);
 		if (fd < 0) {
 			free(new);
 			return error("unable to create file %s (%s)",
@@ -146,12 +159,8 @@ static int write_entry(struct cache_entry *ce, char *path, const struct checkout
 		}
 
 		wrote = write_in_full(fd, new, size);
-		/* use fstat() only when path == ce->name */
-		if (fstat_is_reliable() &&
-		    state->refresh_cache && !to_tempfile && !state->base_dir_len) {
-			fstat(fd, &st);
-			fstat_done = 1;
-		}
+		if (!to_tempfile)
+			fstat_done = fstat_output(fd, state, &st);
 		close(fd);
 		free(new);
 		if (wrote != size)
-- 
1.7.5.2.369.g8fc017
Previous: Junio C HamanoNext: Junio C Hamano
Message 6 of 13 in “writing out a huge blob to working tree”
  1. 00/12 writing out a huge blob to working treeJunio C Hamano, May 21, 2011
  2. 01/12 packed_object_info_detail(): do not return a stringJunio C Hamano, May 21, 2011
  3. 02/12 sha1_object_info_extended(): expose a bit more infoJunio C Hamano, May 21, 2011
  4. 03/12 sha1_object_info_extended(): hint about objects in delta-base cacheJunio C Hamano, May 21, 2011
  5. 04/12 unpack_object_header(): make it publicJunio C Hamano, May 21, 2011
  6. 05/12 write_entry(): separate two helper functions outJunio C Hamano, May 21, 2011
  7. 06/12 streaming: a new API to read from the object storeJunio C Hamano, May 21, 2011
  8. 07/12 streaming_write_entry(): use streaming API in write_entry()Junio C Hamano, May 21, 2011
  9. 08/12 convert: CRLF_INPUT is a no-op in the output codepathJunio C Hamano, May 21, 2011
  10. 09/12 streaming_write_entry(): support files with holesJunio C Hamano, May 21, 2011
  11. 10/12 streaming: read non-delta incrementally from a packJunio C Hamano, May 21, 2011
  12. 11/12 sha1_file.c: expose helpers to read loose objectsJunio C Hamano, May 21, 2011
  13. 12/12 streaming: read loose objects incrementallyJunio C Hamano, May 21, 2011

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.