From: Junio C Hamano Date: Sun, 13 Jun 2010 18:22:00 +0000 (-0700) Subject: Merge branch 'jk/maint-sha1-file-name-fix' X-Git-Tag: v1.7.2-rc0~74 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/e391fdfc69bd64e11f31416c38ab491a04c0ffa0?ds=inline;hp=-c Merge branch 'jk/maint-sha1-file-name-fix' * jk/maint-sha1-file-name-fix: remove over-eager caching in sha1_file_name --- e391fdfc69bd64e11f31416c38ab491a04c0ffa0 diff --combined sha1_file.c index d8e61a65d1,50259556b8..e42ef96d45 --- a/sha1_file.c +++ b/sha1_file.c @@@ -102,20 -102,22 +102,22 @@@ static void fill_sha1_path(char *pathbu */ char *sha1_file_name(const unsigned char *sha1) { - static char *name, *base; + static char buf[PATH_MAX]; + const char *objdir; + int len; - if (!base) { - const char *sha1_file_directory = get_object_directory(); - int len = strlen(sha1_file_directory); - base = xmalloc(len + 60); - memcpy(base, sha1_file_directory, len); - memset(base+len, 0, 60); - base[len] = '/'; - base[len+3] = '/'; - name = base + len + 1; - } - fill_sha1_path(name, sha1); - return base; + objdir = get_object_directory(); + len = strlen(objdir); + + /* '/' + sha1(2) + '/' + sha1(38) + '\0' */ + if (len + 43 > PATH_MAX) + die("insanely long object directory %s", objdir); + memcpy(buf, objdir, len); + buf[len] = '/'; + buf[len+3] = '/'; + buf[len+42] = '\0'; + fill_sha1_path(buf + len + 1, sha1); + return buf; } static char *sha1_get_pack_name(const unsigned char *sha1, @@@ -599,14 -601,6 +601,14 @@@ void unuse_pack(struct pack_window **w_ } } +void close_pack_index(struct packed_git *p) +{ + if (p->index_data) { + munmap((void *)p->index_data, p->index_size); + p->index_data = NULL; + } +} + /* * This is used by git-repack in case a newly created pack happens to * contain the same set of objects as an existing one. In that case @@@ -628,7 -622,8 +630,7 @@@ void free_pack_by_name(const char *pack close_pack_windows(p); if (p->pack_fd != -1) close(p->pack_fd); - if (p->index_data) - munmap((void *)p->index_data, p->index_size); + close_pack_index(p); free(p->bad_object_sha1); *pp = p->next; free(p); @@@ -838,8 -833,9 +840,8 @@@ struct packed_git *add_packed_git(cons return p; } -struct packed_git *parse_pack_index(unsigned char *sha1) +struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path) { - const char *idx_path = sha1_pack_index_name(sha1); const char *path = sha1_pack_name(sha1); struct packed_git *p = alloc_packed_git(strlen(path) + 1); @@@ -2523,13 -2519,3 +2525,13 @@@ int read_pack_header(int fd, struct pac return PH_ERROR_PROTOCOL; return 0; } + +void assert_sha1_type(const unsigned char *sha1, enum object_type expect) +{ + enum object_type type = sha1_object_info(sha1, NULL); + if (type < 0) + die("%s is not a valid object", sha1_to_hex(sha1)); + if (type != expect) + die("%s is not a valid '%s' object", sha1_to_hex(sha1), + typename(expect)); +}