threads / patch / 43715

patchsha1_object_info(): be consistent with read_sha1_file()

Subject: [PATCH] sha1_object_info(): be consistent with read_sha1_file()

## tl;dr

2 messages between Nov 27, 2006 and Nov 28, 2006. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

Johannes Schindelin· Nov 27, 2006, 23:18 UTC · lore

We used to try loose objects first with sha1_object_info(), but packed objects first with read_sha1_file(). Now, prefer packed objects over loose ones with sha1_object_info(), too.

Usually the old behaviour would pose no problem, but when you tried to fix a fscked up repository by inserting a known-good pack,

	git cat-file $(git cat-file -t <sha1>) <sha1>
could fail, even when
	git cat-file blob <sha1>
would _not_ fail. Worse, a repack would fail, too.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 sha1_file.c |   35 ++++++++++++++++++++---------------
 1 files changed, 20 insertions(+), 15 deletions(-)
Show changes to sha1_file.c +20 −15
diff --git a/sha1_file.c b/sha1_file.c
index 09456d2..63f416b 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -1261,7 +1261,7 @@ struct packed_git *find_sha1_pack(const unsigned char *sha1,
 	
 }
 
-int sha1_object_info(const unsigned char *sha1, char *type, unsigned long *sizep)
+static int sha1_loose_object_info(const unsigned char *sha1, char *type, unsigned long *sizep)
 {
 	int status;
 	unsigned long mapsize, size;
@@ -1270,20 +1270,8 @@ int sha1_object_info(const unsigned char *sha1, char *type, unsigned long *sizep
 	char hdr[128];
 
 	map = map_sha1_file(sha1, &mapsize);
-	if (!map) {
-		struct pack_entry e;
-
-		if (!find_pack_entry(sha1, &e, NULL)) {
-			reprepare_packed_git();
-			if (!find_pack_entry(sha1, &e, NULL))
-				return error("unable to find %s", sha1_to_hex(sha1));
-		}
-		if (use_packed_git(e.p))
-			die("cannot map packed file");
-		status = packed_object_info(e.p, e.offset, type, sizep);
-		unuse_packed_git(e.p);
-		return status;
-	}
+	if (!map)
+		return error("unable to find %s", sha1_to_hex(sha1));
 	if (unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr)) < 0)
 		status = error("unable to unpack %s header",
 			       sha1_to_hex(sha1));
@@ -1299,6 +1287,23 @@ int sha1_object_info(const unsigned char *sha1, char *type, unsigned long *sizep
 	return status;
 }
 
+int sha1_object_info(const unsigned char *sha1, char *type, unsigned long *sizep)
+{
+	int status;
+	struct pack_entry e;
+
+	if (!find_pack_entry(sha1, &e, NULL)) {
+		reprepare_packed_git();
+		if (!find_pack_entry(sha1, &e, NULL))
+			return sha1_loose_object_info(sha1, type, sizep);
+	}
+	if (use_packed_git(e.p))
+		die("cannot map packed file");
+	status = packed_object_info(e.p, e.offset, type, sizep);
+	unuse_packed_git(e.p);
+	return status;
+}
+
 static void *read_packed_sha1(const unsigned char *sha1, char *type, unsigned long *size)
 {
 	struct pack_entry e;
-- 
1.4.4.1.gfac7-dirty
Junio C Hamano· Nov 28, 2006, 01:05 UTC · re: Johannes Schindelin · lore

Re: [PATCH] sha1_object_info(): be consistent with read_sha1_file()

Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> We used to try loose objects first with sha1_object_info(), but packed
> objects first with read_sha1_file(). Now, prefer packed objects over loose
> ones with sha1_object_info(), too.

Well caught. It appears this inconsistent order was from the day one when we started using the packed git, and I forgot to swap them when I did ab90ea5 to swap the reading side.

Thanks.

← back to recent threads