[PATCH] delta check

This adds knowledge of delta objects to fsck-cache and various object
parsing code.  A new switch to git-fsck-cache is provided to display the
maximum delta depth found in a repository.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Nicolas Pitre
2005-05-20 16:59:17 -04:00
committed by Linus Torvalds
parent 91d7b8afc2
commit d1af002dc6
10 changed files with 202 additions and 6 deletions

View File

@ -6,15 +6,46 @@
#include "tree.h"
#include "blob.h"
#include "tag.h"
#include "delta.h"
#define REACHABLE 0x0001
static int show_root = 0;
static int show_tags = 0;
static int show_unreachable = 0;
static int show_max_delta_depth = 0;
static int keep_cache_objects = 0;
static unsigned char head_sha1[20];
static void expand_deltas(void)
{
int i, max_depth = 0;
/*
* To be as efficient as possible we look for delta heads and
* recursively process them going backward, and parsing
* resulting objects along the way. This allows for processing
* each delta objects only once regardless of the delta depth.
*/
for (i = 0; i < nr_objs; i++) {
struct object *obj = objs[i];
if (obj->parsed && !obj->delta && obj->attached_deltas) {
int depth = 0;
char type[10];
unsigned long size;
void *buf = read_sha1_file(obj->sha1, type, &size);
if (!buf)
continue;
depth = process_deltas(buf, size, obj->type,
obj->attached_deltas);
if (max_depth < depth)
max_depth = depth;
}
}
if (show_max_delta_depth)
printf("maximum delta depth = %d\n", max_depth);
}
static void check_connectivity(void)
{
int i;
@ -25,7 +56,12 @@ static void check_connectivity(void)
struct object_list *refs;
if (!obj->parsed) {
printf("missing %s %s\n", obj->type, sha1_to_hex(obj->sha1));
if (obj->delta)
printf("unresolved delta %s\n",
sha1_to_hex(obj->sha1));
else
printf("missing %s %s\n",
obj->type, sha1_to_hex(obj->sha1));
continue;
}
@ -43,7 +79,12 @@ static void check_connectivity(void)
continue;
if (show_unreachable && !(obj->flags & REACHABLE)) {
printf("unreachable %s %s\n", obj->type, sha1_to_hex(obj->sha1));
if (obj->attached_deltas)
printf("foreign delta reference %s\n",
sha1_to_hex(obj->sha1));
else
printf("unreachable %s %s\n",
obj->type, sha1_to_hex(obj->sha1));
continue;
}
@ -201,6 +242,8 @@ static int fsck_sha1(unsigned char *sha1)
return fsck_commit((struct commit *) obj);
if (obj->type == tag_type)
return fsck_tag((struct tag *) obj);
if (!obj->type && obj->delta)
return 0;
return -1;
}
@ -384,6 +427,10 @@ int main(int argc, char **argv)
show_root = 1;
continue;
}
if (!strcmp(arg, "--delta-depth")) {
show_max_delta_depth = 1;
continue;
}
if (!strcmp(arg, "--cache")) {
keep_cache_objects = 1;
continue;
@ -400,6 +447,8 @@ int main(int argc, char **argv)
}
fsck_sha1_list();
expand_deltas();
heads = 0;
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
@ -423,7 +472,7 @@ int main(int argc, char **argv)
}
/*
* If we've not been gived any explicit head information, do the
* If we've not been given any explicit head information, do the
* default ones from .git/refs. We also consider the index file
* in this case (ie this implies --cache).
*/