From fa5fc15d6ecfb9452c578bb4c80e98ccca12750c Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Mon, 19 Apr 2010 07:23:06 -0700 Subject: [PATCH] Introduce close_pack_index to permit replacement By closing the pack index, a caller can later overwrite the index with an updated index file, possibly after converting from v1 to the v2 format. Because p->index_data is NULL after close, on the next access the index will be opened again and the other members will be updated with new data. Signed-off-by: Shawn O. Pearce Signed-off-by: Junio C Hamano --- cache.h | 1 + sha1_file.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/cache.h b/cache.h index 6e54993256..0eba039dbf 100644 --- a/cache.h +++ b/cache.h @@ -911,6 +911,7 @@ extern struct packed_git *find_sha1_pack(const unsigned char *sha1, extern void pack_report(void); extern int open_pack_index(struct packed_git *); +extern void close_pack_index(struct packed_git *); extern unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t, unsigned int *); extern void close_pack_windows(struct packed_git *); extern void unuse_pack(struct pack_window **); diff --git a/sha1_file.c b/sha1_file.c index c23cc5e6e1..4e82654d7c 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -606,6 +606,14 @@ void unuse_pack(struct pack_window **w_cursor) } } +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 @@ -627,8 +635,7 @@ void free_pack_by_name(const char *pack_name) 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); -- 2.11.4.GIT