X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=fsck-objects.c;h=17d05363e08b48275cb38631e82f0f48321fa728;hb=69779a562a171d9b70bbb17b89e076bd6b16ae6c;hp=6cb0f29be8a1eed5c22c90894560e399aa537f56;hpb=dbc37438687e110697574d175e4eca5f9cbeae81;p=git.git diff --git a/fsck-objects.c b/fsck-objects.c index 6cb0f29b..17d05363 100644 --- a/fsck-objects.c +++ b/fsck-objects.c @@ -30,7 +30,7 @@ static void objreport(struct object *obj, const char *severity, fputs("\n", stderr); } -int objerror(struct object *obj, const char *err, ...) +static int objerror(struct object *obj, const char *err, ...) { va_list params; va_start(params, err); @@ -39,7 +39,7 @@ int objerror(struct object *obj, const char *err, ...) return -1; } -int objwarning(struct object *obj, const char *err, ...) +static int objwarning(struct object *obj, const char *err, ...) { va_list params; va_start(params, err); @@ -329,9 +329,8 @@ static int fsck_dir(int i, char *path) DIR *dir = opendir(path); struct dirent *de; - if (!dir) { - return error("missing sha1 directory '%s'", path); - } + if (!dir) + return 0; while ((de = readdir(dir)) != NULL) { char name[100]; @@ -402,28 +401,17 @@ static void fsck_object_dir(const char *path) static int fsck_head_link(void) { - int fd, count; - char hex[40]; unsigned char sha1[20]; - static char path[PATH_MAX], link[PATH_MAX]; - const char *git_dir; - - git_dir = getenv(GIT_DIR_ENVIRONMENT); - if (!git_dir) git_dir = DEFAULT_GIT_DIR_ENVIRONMENT; - - snprintf(path, sizeof(path), "%s/HEAD", git_dir); - if (readlink(path, link, sizeof(link)) < 0) - return error("HEAD is not a symlink"); - if (strncmp("refs/heads/", link, 11)) - return error("HEAD points to something strange (%s)", link); - fd = open(path, O_RDONLY); - if (fd < 0) - return error("HEAD: %s", strerror(errno)); - count = read(fd, hex, sizeof(hex)); - close(fd); - if (count < 0) - return error("HEAD: %s", strerror(errno)); - if (count < 40 || get_sha1_hex(hex, sha1)) + 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 */ + + if (!git_refs_heads_master) + return error("HEAD is not a symbolic ref"); + if (strncmp(git_refs_heads_master + pfxlen, "refs/heads/", 11)) + return error("HEAD points to something strange (%s)", + git_refs_heads_master + pfxlen); + if (!memcmp(null_sha1, sha1, 20)) return error("HEAD: not a valid git pointer"); return 0; }