From: Junio C Hamano <junkio@cox.net>
Date: Mon, 27 Jun 2005 10:34:06 +0000 (-0700)
Subject: [PATCH] Enhance sha1_file_size() into sha1_object_info()
X-Git-Tag: v0.99~157
X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=36e4d74a210ba618e1520f11ce7fc2f8baec5bb8;p=git.git

[PATCH] Enhance sha1_file_size() into sha1_object_info()

This lets us eliminate one use of map_sha1_file() outside
sha1_file.c, to bring us one step closer to the packed GIT.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
---

diff --git a/cache.h b/cache.h
index 765438d8f..383fc8664 100644
--- a/cache.h
+++ b/cache.h
@@ -162,7 +162,7 @@ extern char *sha1_file_name(const unsigned char *sha1);
 extern void * map_sha1_file(const unsigned char *sha1, unsigned long *size);
 extern int unpack_sha1_header(z_stream *stream, void *map, unsigned long mapsize, void *buffer, unsigned long size);
 extern int parse_sha1_header(char *hdr, char *type, unsigned long *sizep);
-extern int sha1_file_size(const unsigned char *, unsigned long *);
+extern int sha1_object_info(const unsigned char *, char *, unsigned long *);
 extern void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned long *size);
 extern void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size);
 extern int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned char *return_sha1);
diff --git a/diff.c b/diff.c
index 5cb340ca0..a72029058 100644
--- a/diff.c
+++ b/diff.c
@@ -425,7 +425,7 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only)
 				s->size = e->size;
 				return 0;
 			}
-			if (!sha1_file_size(s->sha1, &s->size))
+			if (!sha1_object_info(s->sha1, type, &s->size))
 				locate_size_cache(s->sha1, 0, s->size);
 		}
 		else {
diff --git a/pack-objects.c b/pack-objects.c
index 102af3054..62ed26543 100644
--- a/pack-objects.c
+++ b/pack-objects.c
@@ -160,28 +160,22 @@ static void add_object_entry(unsigned char *sha1, unsigned int hash)
 
 static void check_object(struct object_entry *entry)
 {
-	char buffer[128];
-	char type[10];
-	unsigned long mapsize;
-	z_stream stream;
-	void *map;
-
-	map = map_sha1_file(entry->sha1, &mapsize);
-	if (!map)
-		die("unable to map %s", sha1_to_hex(entry->sha1));
-	if (unpack_sha1_header(&stream, map, mapsize, buffer, sizeof(buffer)) < 0)
-		die("unable to unpack %s header", sha1_to_hex(entry->sha1));
-	munmap(map, mapsize);
-	if (parse_sha1_header(buffer, type, &entry->size) < 0)
-		die("unable to parse %s header", sha1_to_hex(entry->sha1));
-	if (!strcmp(type, "commit")) {
-		entry->type = OBJ_COMMIT;
-	} else if (!strcmp(type, "tree")) {
-		entry->type = OBJ_TREE;
-	} else if (!strcmp(type, "blob")) {
-		entry->type = OBJ_BLOB;
-	} else
-		die("unable to pack object %s of type %s", sha1_to_hex(entry->sha1), type);
+	char type[20];
+
+	if (!sha1_object_info(entry->sha1, type, &entry->size)) {
+		if (!strcmp(type, "commit")) {
+			entry->type = OBJ_COMMIT;
+		} else if (!strcmp(type, "tree")) {
+			entry->type = OBJ_TREE;
+		} else if (!strcmp(type, "blob")) {
+			entry->type = OBJ_BLOB;
+		} else
+			die("unable to pack object %s of type %s",
+			    sha1_to_hex(entry->sha1), type);
+	}
+	else
+		die("unable to get type of object %s",
+		    sha1_to_hex(entry->sha1));
 }
 
 static void get_object_details(void)
diff --git a/sha1_file.c b/sha1_file.c
index a12da4e23..4225c67c5 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -409,20 +409,22 @@ void * unpack_sha1_file(void *map, unsigned long mapsize, char *type, unsigned l
 	return unpack_sha1_rest(&stream, hdr, *size);
 }
 
-int sha1_file_size(const unsigned char *sha1, unsigned long *sizep)
+int sha1_object_info(const unsigned char *sha1, char *type, unsigned long *sizep)
 {
-	int ret, status;
+	int status;
 	unsigned long mapsize, size;
 	void *map;
 	z_stream stream;
-	char hdr[64], type[20];
+	char hdr[128];
 
 	map = map_sha1_file(sha1, &mapsize);
 	if (!map)
-		return -1;
-	ret = unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr));
-	if (ret < Z_OK || parse_sha1_header(hdr, type, &size) < 0)
-		status = -1;
+		return error("unable to map %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));
+	if (parse_sha1_header(hdr, type, &size) < 0)
+		status = error("unable to parse %s header", sha1_to_hex(sha1));
 	else {
 		status = 0;
 		*sizep = size;