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

[PATCH 7/8] fast-import: cache oe in cat_blob

From
Dmitry Ivankov <divanorama@gmail.com>
Date
Sep 19, 2011, 01:27 UTC
Message-ID
<1316395657-6991-8-git-send-email-divanorama@gmail.com>
In-Reply-To
<1316395657-6991-1-git-send-email-divanorama@gmail.com>

cat_blob read_sha1_file's the blob object and doesn't cache it in struct object_entry.

Make this call to read_sha1_file cached in struct object_entry.
Signed-off-by: Dmitry Ivankov <divanorama@gmail.com>
---
 fast-import.c |   25 +++++++++++++------------
 1 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/fast-import.c b/fast-import.c
index 1c0716b..3c4c998 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -2816,16 +2816,18 @@ static void cat_blob_write(const char *buf, unsigned long size)
 		die_errno("Write to frontend failed");
 }
 
-static void cat_blob(struct object_entry *oe, unsigned char sha1[20])
+static void cat_blob(struct object_entry *oe)
 {
 	struct strbuf line = STRBUF_INIT;
 	unsigned long size;
 	enum object_type type = 0;
 	char *buf;
 
-	if (!oe || oe->pack_id == MAX_PACK_ID) {
-		buf = read_sha1_file(sha1, &type, &size);
-	} else {
+	if (!oe->idx.offset)
+		buf = resolve_sha1_object_read(oe, &type, &size);
+	else if (oe->pack_id == MAX_PACK_ID)
+		buf = read_sha1_file(oe->idx.sha1, &type, &size);
+	else {
 		type = oe->type;
 		buf = gfi_unpack_entry(oe, &size);
 	}
@@ -2835,25 +2837,25 @@ static void cat_blob(struct object_entry *oe, unsigned char sha1[20])
 	 */
 	if (type <= 0) {
 		strbuf_reset(&line);
-		strbuf_addf(&line, "%s missing\n", sha1_to_hex(sha1));
+		strbuf_addf(&line, "%s missing\n", sha1_to_hex(oe->idx.sha1));
 		cat_blob_write(line.buf, line.len);
 		strbuf_release(&line);
 		free(buf);
 		return;
 	}
 	if (!buf)
-		die("Can't read object %s", sha1_to_hex(sha1));
+		die("Can't read object %s", sha1_to_hex(oe->idx.sha1));
 	if (type != OBJ_BLOB)
 		die("Object %s is a %s but a blob was expected.",
-		    sha1_to_hex(sha1), typename(type));
+		    sha1_to_hex(oe->idx.sha1), typename(type));
 	strbuf_reset(&line);
-	strbuf_addf(&line, "%s %s %lu\n", sha1_to_hex(sha1),
+	strbuf_addf(&line, "%s %s %lu\n", sha1_to_hex(oe->idx.sha1),
 						typename(type), size);
 	cat_blob_write(line.buf, line.len);
 	strbuf_release(&line);
 	cat_blob_write(buf, size);
 	cat_blob_write("\n", 1);
-	if (oe && oe->pack_id == pack_id) {
+	if (oe->pack_id == pack_id) {
 		last_blob.offset = oe->idx.offset;
 		strbuf_attach(&last_blob.data, buf, size, size);
 		last_blob.depth = oe->depth;
@@ -2878,16 +2880,15 @@ static void parse_cat_blob(void)
 			die("Unknown mark: %s", command_buf.buf);
 		if (*x)
 			die("Garbage after mark: %s", command_buf.buf);
-		hashcpy(sha1, oe->idx.sha1);
 	} else {
 		if (get_sha1_hex(p, sha1))
 			die("Invalid SHA1: %s", command_buf.buf);
 		if (p[40])
 			die("Garbage after SHA1: %s", command_buf.buf);
-		oe = find_object(sha1);
+		oe = insert_object(sha1);
 	}
 
-	cat_blob(oe, sha1);
+	cat_blob(oe);
 }
 
 static struct object_entry *dereference(struct object_entry *oe,
-- 
1.7.3.4
Previous: Dmitry IvankovNext: Dmitry Ivankov
Message 8 of 13 in “fast-import: cache oe more often”
  1. 0/8 fast-import: cache oe more oftenDmitry Ivankov, Sep 19, 2011
  2. 1/8 fast-import: cache oe in file_change_mDmitry Ivankov, Sep 19, 2011
  3. 2/8 fast-import: cache oe in parse_new_tagDmitry Ivankov, Sep 19, 2011
  4. 3/8 fast-import: cache oe in note_change_nDmitry Ivankov, Sep 19, 2011
  5. 4/8 fast-import: extract common sha1_file access functionsDmitry Ivankov, Sep 19, 2011
  6. 5/8 fast-import: tiny optimization in read_marksDmitry Ivankov, Sep 19, 2011
  7. 6/8 fast-import: cache oe in load_treeDmitry Ivankov, Sep 19, 2011
  8. 7/8 fast-import: cache oe in cat_blobDmitry Ivankov, Sep 19, 2011
  9. 8/8 fast-import: cache objects while dereferencingDmitry Ivankov, Sep 19, 2011
  10. Junio C HamanoSep 20, 2011
  11. Jonathan NiederSep 20, 2011
  12. Dmitry IvankovSep 20, 2011
  13. Jonathan NiederSep 20, 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.