X-Git-Url: https://git.octo.it/?p=git.git;a=blobdiff_plain;f=sha1_file.c;h=b4ff233bad3c15692610f93549b25cd0cf042392;hp=f77c18934af507e6f55628e6b0c60ca69bf60aae;hb=HEAD;hpb=31262627109476c529418132e0820687003fb1fe diff --git a/sha1_file.c b/sha1_file.c index f77c1893..b4ff233b 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -50,29 +50,6 @@ int get_sha1_hex(const char *hex, unsigned char *sha1) return 0; } -int adjust_shared_perm(const char *path) -{ - struct stat st; - int mode; - - if (!shared_repository) - return 0; - if (lstat(path, &st) < 0) - return -1; - mode = st.st_mode; - if (mode & S_IRUSR) - mode |= S_IRGRP; - if (mode & S_IWUSR) - mode |= S_IWGRP; - if (mode & S_IXUSR) - mode |= S_IXGRP; - if (S_ISDIR(mode)) - mode |= S_ISGID; - if (chmod(path, mode) < 0) - return -2; - return 0; -} - int safe_create_leading_directories(char *path) { char *pos = path; @@ -617,6 +594,12 @@ static void prepare_packed_git_one(char *objdir, int local) /* we have .idx. Is it a file we can map? */ strcpy(path + len, de->d_name); + for (p = packed_git; p; p = p->next) { + if (!memcmp(path, p->pack_name, len + namelen - 4)) + break; + } + if (p) + continue; p = add_packed_git(path, len + namelen, local); if (!p) continue; @@ -626,12 +609,12 @@ static void prepare_packed_git_one(char *objdir, int local) closedir(dir); } +static int prepare_packed_git_run_once = 0; void prepare_packed_git(void) { - static int run_once = 0; struct alternate_object_database *alt; - if (run_once) + if (prepare_packed_git_run_once) return; prepare_packed_git_one(get_object_directory(), 1); prepare_alt_odb(); @@ -640,7 +623,13 @@ void prepare_packed_git(void) prepare_packed_git_one(alt->base, 0); alt->name[-1] = '/'; } - run_once = 1; + prepare_packed_git_run_once = 1; +} + +static void reprepare_packed_git(void) +{ + prepare_packed_git_run_once = 0; + prepare_packed_git(); } int check_sha1_signature(const unsigned char *sha1, void *map, unsigned long size, const char *type) @@ -1212,9 +1201,12 @@ int sha1_object_info(const unsigned char *sha1, char *type, unsigned long *sizep if (!map) { struct pack_entry e; - if (!find_pack_entry(sha1, &e)) - return error("unable to find %s", sha1_to_hex(sha1)); - return packed_object_info(&e, type, sizep); + if (find_pack_entry(sha1, &e)) + return packed_object_info(&e, type, sizep); + reprepare_packed_git(); + if (find_pack_entry(sha1, &e)) + return packed_object_info(&e, type, sizep); + return error("unable to find %s", sha1_to_hex(sha1)); } if (unpack_sha1_header(&stream, map, mapsize, hdr, sizeof(hdr)) < 0) status = error("unable to unpack %s header", @@ -1256,6 +1248,9 @@ void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size munmap(map, mapsize); return buf; } + reprepare_packed_git(); + if (find_pack_entry(sha1, &e)) + return read_packed_sha1(sha1, type, size); return NULL; }