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

[3/5] Add function to parse an object of unspecified type

From
Daniel Barkalow <barkalow@iabervon.org>
Date
Apr 28, 2005, 05:11 UTC
Message-ID
<Pine.LNX.4.21.0504280106540.30848-100000@iabervon.org>
In-Reply-To
<Pine.LNX.4.21.0504280055180.30848-100000@iabervon.org>

This adds a function that parses an object from the database when we have to look up its actual type. It also checks the hash of the file, due to its heritage as part of fsck-cache.

Signed-Off-By: Daniel Barkalow <barkalow@iabervon.org>
Index: object.c
===================================================================
--- e08498de8d0216a24378c454597ecb38f65c4ee1/object.c  (mode:100644 sha1:91bbc6e5e2eadfb0a66b14d992eac260d07267f8)
+++ dd06c679f8acb720976073de90a9eeabbc11e951/object.c  (mode:100644 sha1:787cda1f5667cdd4e92b7c18eb115cf125f6df9c)
@@ -1,5 +1,9 @@
 #include "object.h"
+#include "blob.h"
+#include "tree.h"
+#include "commit.h"
 #include "cache.h"
+#include "tag.h"
 #include <stdlib.h>
 #include <string.h>
 
@@ -94,3 +98,39 @@
 		p = p->next;
 	}
 }
+
+struct object *parse_object(unsigned char *sha1)
+{
+	unsigned long mapsize;
+	void *map = map_sha1_file(sha1, &mapsize);
+	if (map) {
+		char type[100];
+		unsigned long size;
+		void *buffer = unpack_sha1_file(map, mapsize, type, &size);
+		if (!buffer)
+			return NULL;
+		if (check_sha1_signature(sha1, buffer, size, type) < 0)
+			printf("sha1 mismatch %s\n", sha1_to_hex(sha1));
+		munmap(map, mapsize);
+		if (!strcmp(type, "blob")) {
+			struct blob *ret = lookup_blob(sha1);
+			//parse_blob(ret);
+			return &ret->object;
+		} else if (!strcmp(type, "tree")) {
+			struct tree *ret = lookup_tree(sha1);
+			parse_tree(ret);
+			return &ret->object;
+		} else if (!strcmp(type, "commit")) {
+			struct commit *ret = lookup_commit(sha1);
+			parse_commit(ret);
+			return &ret->object;
+		} else if (!strcmp(type, "tag")) {
+			struct tag *ret = lookup_tag(sha1);
+			parse_tag(ret);
+			return &ret->object;
+		} else {
+			return NULL;
+		}
+	}
+	return NULL;
+}
Index: object.h
===================================================================
--- e08498de8d0216a24378c454597ecb38f65c4ee1/object.h  (mode:100644 sha1:bc607fd55f6ce4e56ce87766369b5d4d55ec79af)
+++ dd06c679f8acb720976073de90a9eeabbc11e951/object.h  (mode:100644 sha1:d53a35a4d7321b5ec970103208ac576f9f722dff)
@@ -22,6 +22,9 @@
 
 void created_object(unsigned char *sha1, struct object *obj);
 
+/** Returns the object, having parsed it to find out what it is. **/
+struct object *parse_object(unsigned char *sha1);
+
 void add_ref(struct object *refer, struct object *target);
 
 void mark_reachable(struct object *obj, unsigned int mask);
Previous: Daniel BarkalowNext: Daniel Barkalow
Message 7 of 10 in “[0/5] Updates for library, fsck-cache”
  1. Daniel BarkalowApr 28, 2005
  2. 1/5 Consider a blob to be parsedDaniel Barkalow, Apr 28, 2005
  3. Linus TorvaldsApr 28, 2005
  4. Daniel BarkalowApr 28, 2005
  5. [1'/5] Mark blobs as parsed when they're actually parsedDaniel Barkalow, Apr 28, 2005
  6. 2/5 Add tag header/parser to libraryDaniel Barkalow, Apr 28, 2005
  7. 3/5 Add function to parse an object of unspecified typeDaniel Barkalow, Apr 28, 2005
  8. [3'/5] Add function to parse an object of unspecified type (take 2)Daniel Barkalow, Apr 28, 2005
  9. 4/5 Rework fsck-cache to use parse_object()Daniel Barkalow, Apr 28, 2005
  10. 5/5 Make fsck-cache read heads out of .git/refs/*/*Daniel Barkalow, Apr 28, 2005

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.