]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'jk/maint-sha1-file-name-fix' into maint
authorJunio C Hamano <gitster@pobox.com>
Mon, 21 Jun 2010 12:40:41 +0000 (05:40 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 21 Jun 2010 12:40:41 +0000 (05:40 -0700)
* jk/maint-sha1-file-name-fix:
  remove over-eager caching in sha1_file_name

1  2 
sha1_file.c

diff --combined sha1_file.c
index 1efa9154eda4e1ec064d627dfb21c876c914f4d7,50259556b8bbda00073d3aaa161228ab34952e2a..72de38909ef6b05f0aa709b78fd803c632a02044
@@@ -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;
-       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;
+       static char buf[PATH_MAX];
+       const char *objdir;
+       int len;
+       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);