X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=fsck-objects.c;h=46b628cb94375e3f645f868efb04547ffc20e6e7;hb=255cae88bcc8fcb0088459df13b55fa3d311b9e2;hp=ef54a8a411b01bb4f6becd24c68fad3fcbd15211;hpb=b296990c3bcf942dc7601b31a901c7714a353a0a;p=git.git diff --git a/fsck-objects.c b/fsck-objects.c index ef54a8a41..46b628cb9 100644 --- a/fsck-objects.c +++ b/fsck-objects.c @@ -14,12 +14,12 @@ #define REACHABLE 0x0001 #define SEEN 0x0002 -static int show_root = 0; -static int show_tags = 0; -static int show_unreachable = 0; -static int check_full = 0; -static int check_strict = 0; -static int keep_cache_objects = 0; +static int show_root; +static int show_tags; +static int show_unreachable; +static int check_full; +static int check_strict; +static int keep_cache_objects; static unsigned char head_sha1[20]; #ifdef NO_D_INO_IN_DIRENT @@ -297,13 +297,13 @@ static int fsck_sha1(unsigned char *sha1) if (obj->flags & SEEN) return 0; obj->flags |= SEEN; - if (obj->type == TYPE_BLOB) + if (obj->type == OBJ_BLOB) return 0; - if (obj->type == TYPE_TREE) + if (obj->type == OBJ_TREE) return fsck_tree((struct tree *) obj); - if (obj->type == TYPE_COMMIT) + if (obj->type == OBJ_COMMIT) return fsck_commit((struct commit *) obj); - if (obj->type == TYPE_TAG) + if (obj->type == OBJ_TAG) return fsck_tag((struct tag *) obj); /* By now, parse_object() would've returned NULL instead. */ return objerror(obj, "unknown type '%d' (internal fsck error)", obj->type); @@ -356,7 +356,7 @@ static void add_sha1_list(unsigned char *sha1, unsigned long ino) int nr; entry->ino = ino; - memcpy(entry->sha1, sha1, 20); + hashcpy(entry->sha1, sha1); nr = sha1_list.nr; if (nr == MAX_SHA1_ENTRIES) { fsck_sha1_list(); @@ -366,13 +366,13 @@ static void add_sha1_list(unsigned char *sha1, unsigned long ino) sha1_list.nr = ++nr; } -static int fsck_dir(int i, char *path) +static void fsck_dir(int i, char *path) { DIR *dir = opendir(path); struct dirent *de; if (!dir) - return 0; + return; while ((de = readdir(dir)) != NULL) { char name[100]; @@ -398,12 +398,11 @@ static int fsck_dir(int i, char *path) fprintf(stderr, "bad sha1 file: %s/%s\n", path, de->d_name); } closedir(dir); - return 0; } -static int default_refs = 0; +static int default_refs; -static int fsck_handle_ref(const char *refname, const unsigned char *sha1) +static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data) { struct object *obj; @@ -425,9 +424,24 @@ static int fsck_handle_ref(const char *refname, const unsigned char *sha1) static void get_default_heads(void) { - for_each_ref(fsck_handle_ref); - if (!default_refs) - die("No default references"); + for_each_ref(fsck_handle_ref, NULL); + + /* + * Not having any default heads isn't really fatal, but + * it does mean that "--unreachable" no longer makes any + * sense (since in this case everything will obviously + * be unreachable by definition. + * + * Showing dangling objects is valid, though (as those + * dangling objects are likely lost heads). + * + * So we just print a warning about it, and clear the + * "show_unreachable" flag. + */ + if (!default_refs) { + error("No default references"); + show_unreachable = 0; + } } static void fsck_object_dir(const char *path) @@ -444,16 +458,15 @@ static void fsck_object_dir(const char *path) static int fsck_head_link(void) { unsigned char sha1[20]; - const char *git_HEAD = strdup(git_path("HEAD")); - const char *git_refs_heads_master = resolve_ref(git_HEAD, sha1, 1); - int pfxlen = strlen(git_HEAD) - 4; /* strip .../.git/ part */ + int flag; + const char *head_points_at = resolve_ref("HEAD", sha1, 1, &flag); - if (!git_refs_heads_master) + if (!head_points_at || !(flag & REF_ISSYMREF)) return error("HEAD is not a symbolic ref"); - if (strncmp(git_refs_heads_master + pfxlen, "refs/heads/", 11)) + if (strncmp(head_points_at, "refs/heads/", 11)) return error("HEAD points to something strange (%s)", - git_refs_heads_master + pfxlen); - if (!memcmp(null_sha1, sha1, 20)) + head_points_at); + if (is_null_sha1(sha1)) return error("HEAD: not a valid git pointer"); return 0; } @@ -472,7 +485,7 @@ static int fsck_cache_tree(struct cache_tree *it) } mark_reachable(obj, REACHABLE); obj->used = 1; - if (obj->type != TYPE_TREE) + if (obj->type != OBJ_TREE) err |= objerror(obj, "non-tree in cache-tree"); } for (i = 0; i < it->subtree_nr; i++)