Skip to content

Commit

Permalink
[PATCH] Add function to parse an object of unspecified type (take 2)
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Daniel Barkalow authored and Linus Torvalds committed Apr 28, 2005
1 parent 2636f61 commit e9eefa6
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
40 changes: 40 additions & 0 deletions object.c
Original file line number Diff line number Diff line change
@@ -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>

Expand Down Expand Up @@ -94,3 +98,39 @@ void mark_reachable(struct object *obj, unsigned int mask)
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;
}
3 changes: 3 additions & 0 deletions object.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ struct object *lookup_object(unsigned char *sha1);

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);
Expand Down

0 comments on commit e9eefa6

Please sign in to comment.