-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add generic, type aware object chain walker
The requirements are: * it may not crash on NULL pointers * a callback function is needed, as index-pack/unpack-objects need to do different things * the type information is needed to check the expected <-> real type and print better error messages Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at> Signed-off-by: Junio C Hamano <gitster@pobox.com>
- Loading branch information
Martin Koegler
authored and
Junio C Hamano
committed
Feb 26, 2008
1 parent
f73df33
commit 355885d
Showing
4 changed files
with
117 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
#include "cache.h" | ||
#include "object.h" | ||
#include "blob.h" | ||
#include "tree.h" | ||
#include "tree-walk.h" | ||
#include "commit.h" | ||
#include "tag.h" | ||
#include "fsck.h" | ||
|
||
static int fsck_walk_tree(struct tree *tree, fsck_walk_func walk, void *data) | ||
{ | ||
struct tree_desc desc; | ||
struct name_entry entry; | ||
int res = 0; | ||
|
||
if (parse_tree(tree)) | ||
return -1; | ||
|
||
init_tree_desc(&desc, tree->buffer, tree->size); | ||
while (tree_entry(&desc, &entry)) { | ||
int result; | ||
|
||
if (S_ISGITLINK(entry.mode)) | ||
continue; | ||
if (S_ISDIR(entry.mode)) | ||
result = walk(&lookup_tree(entry.sha1)->object, OBJ_TREE, data); | ||
else if (S_ISREG(entry.mode) || S_ISLNK(entry.mode)) | ||
result = walk(&lookup_blob(entry.sha1)->object, OBJ_BLOB, data); | ||
else { | ||
result = error("in tree %s: entry %s has bad mode %.6o\n", | ||
sha1_to_hex(tree->object.sha1), entry.path, entry.mode); | ||
} | ||
if (result < 0) | ||
return result; | ||
if (!res) | ||
res = result; | ||
} | ||
return res; | ||
} | ||
|
||
static int fsck_walk_commit(struct commit *commit, fsck_walk_func walk, void *data) | ||
{ | ||
struct commit_list *parents; | ||
int res; | ||
int result; | ||
|
||
if (parse_commit(commit)) | ||
return -1; | ||
|
||
result = walk((struct object *)commit->tree, OBJ_TREE, data); | ||
if (result < 0) | ||
return result; | ||
res = result; | ||
|
||
parents = commit->parents; | ||
while (parents) { | ||
result = walk((struct object *)parents->item, OBJ_COMMIT, data); | ||
if (result < 0) | ||
return result; | ||
if (!res) | ||
res = result; | ||
parents = parents->next; | ||
} | ||
return res; | ||
} | ||
|
||
static int fsck_walk_tag(struct tag *tag, fsck_walk_func walk, void *data) | ||
{ | ||
if (parse_tag(tag)) | ||
return -1; | ||
return walk(tag->tagged, OBJ_ANY, data); | ||
} | ||
|
||
int fsck_walk(struct object *obj, fsck_walk_func walk, void *data) | ||
{ | ||
if (!obj) | ||
return -1; | ||
switch (obj->type) { | ||
case OBJ_BLOB: | ||
return 0; | ||
case OBJ_TREE: | ||
return fsck_walk_tree((struct tree *)obj, walk, data); | ||
case OBJ_COMMIT: | ||
return fsck_walk_commit((struct commit *)obj, walk, data); | ||
case OBJ_TAG: | ||
return fsck_walk_tag((struct tag *)obj, walk, data); | ||
default: | ||
error("Unknown object type for %s", sha1_to_hex(obj->sha1)); | ||
return -1; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
#ifndef GIT_FSCK_H | ||
#define GIT_FSCK_H | ||
|
||
/* | ||
* callback function for fsck_walk | ||
* type is the expected type of the object or OBJ_ANY | ||
* the return value is: | ||
* 0 everything OK | ||
* <0 error signaled and abort | ||
* >0 error signaled and do not abort | ||
*/ | ||
typedef int (*fsck_walk_func)(struct object *obj, int type, void *data); | ||
|
||
/* descend in all linked child objects | ||
* the return value is: | ||
* -1 error in processing the object | ||
* <0 return value of the callback, which lead to an abort | ||
* >0 return value of the first sigaled error >0 (in the case of no other errors) | ||
* 0 everything OK | ||
*/ | ||
int fsck_walk(struct object *obj, fsck_walk_func walk, void *data); | ||
|
||
#endif |