pack: move add_packed_git()
Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
97de1803f8
commit
9a42865374
1
cache.h
1
cache.h
@ -1640,7 +1640,6 @@ extern int odb_mkstemp(struct strbuf *template, const char *pattern);
|
||||
extern int odb_pack_keep(const char *name);
|
||||
|
||||
extern void clear_delta_base_cache(void);
|
||||
extern struct packed_git *add_packed_git(const char *path, size_t path_len, int local);
|
||||
|
||||
/*
|
||||
* Make sure that a pointer access into an mmap'd index file is within bounds,
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "sigchain.h"
|
||||
#include "connected.h"
|
||||
#include "transport.h"
|
||||
#include "pack.h"
|
||||
|
||||
/*
|
||||
* If we feed all the commits we want to verify to this command
|
||||
|
53
packfile.c
53
packfile.c
@ -605,3 +605,56 @@ void unuse_pack(struct pack_window **w_cursor)
|
||||
*w_cursor = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void try_to_free_pack_memory(size_t size)
|
||||
{
|
||||
release_pack_memory(size);
|
||||
}
|
||||
|
||||
struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
|
||||
{
|
||||
static int have_set_try_to_free_routine;
|
||||
struct stat st;
|
||||
size_t alloc;
|
||||
struct packed_git *p;
|
||||
|
||||
if (!have_set_try_to_free_routine) {
|
||||
have_set_try_to_free_routine = 1;
|
||||
set_try_to_free_routine(try_to_free_pack_memory);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure a corresponding .pack file exists and that
|
||||
* the index looks sane.
|
||||
*/
|
||||
if (!strip_suffix_mem(path, &path_len, ".idx"))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* ".pack" is long enough to hold any suffix we're adding (and
|
||||
* the use xsnprintf double-checks that)
|
||||
*/
|
||||
alloc = st_add3(path_len, strlen(".pack"), 1);
|
||||
p = alloc_packed_git(alloc);
|
||||
memcpy(p->pack_name, path, path_len);
|
||||
|
||||
xsnprintf(p->pack_name + path_len, alloc - path_len, ".keep");
|
||||
if (!access(p->pack_name, F_OK))
|
||||
p->pack_keep = 1;
|
||||
|
||||
xsnprintf(p->pack_name + path_len, alloc - path_len, ".pack");
|
||||
if (stat(p->pack_name, &st) || !S_ISREG(st.st_mode)) {
|
||||
free(p);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* ok, it looks sane as far as we can check without
|
||||
* actually mapping the pack file.
|
||||
*/
|
||||
p->pack_size = st.st_size;
|
||||
p->pack_local = local;
|
||||
p->mtime = st.st_mtime;
|
||||
if (path_len < 40 || get_sha1_hex(path + path_len - 40, p->sha1))
|
||||
hashclr(p->sha1);
|
||||
return p;
|
||||
}
|
||||
|
@ -46,6 +46,7 @@ extern unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t
|
||||
extern void close_pack_windows(struct packed_git *);
|
||||
extern void close_all_packs(void);
|
||||
extern void unuse_pack(struct pack_window **);
|
||||
extern struct packed_git *add_packed_git(const char *path, size_t path_len, int local);
|
||||
|
||||
extern void release_pack_memory(size_t);
|
||||
|
||||
|
61
sha1_file.c
61
sha1_file.c
@ -719,67 +719,6 @@ void *xmmap(void *start, size_t length,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct packed_git *alloc_packed_git(int extra)
|
||||
{
|
||||
struct packed_git *p = xmalloc(st_add(sizeof(*p), extra));
|
||||
memset(p, 0, sizeof(*p));
|
||||
p->pack_fd = -1;
|
||||
return p;
|
||||
}
|
||||
|
||||
static void try_to_free_pack_memory(size_t size)
|
||||
{
|
||||
release_pack_memory(size);
|
||||
}
|
||||
|
||||
struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
|
||||
{
|
||||
static int have_set_try_to_free_routine;
|
||||
struct stat st;
|
||||
size_t alloc;
|
||||
struct packed_git *p;
|
||||
|
||||
if (!have_set_try_to_free_routine) {
|
||||
have_set_try_to_free_routine = 1;
|
||||
set_try_to_free_routine(try_to_free_pack_memory);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure a corresponding .pack file exists and that
|
||||
* the index looks sane.
|
||||
*/
|
||||
if (!strip_suffix_mem(path, &path_len, ".idx"))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* ".pack" is long enough to hold any suffix we're adding (and
|
||||
* the use xsnprintf double-checks that)
|
||||
*/
|
||||
alloc = st_add3(path_len, strlen(".pack"), 1);
|
||||
p = alloc_packed_git(alloc);
|
||||
memcpy(p->pack_name, path, path_len);
|
||||
|
||||
xsnprintf(p->pack_name + path_len, alloc - path_len, ".keep");
|
||||
if (!access(p->pack_name, F_OK))
|
||||
p->pack_keep = 1;
|
||||
|
||||
xsnprintf(p->pack_name + path_len, alloc - path_len, ".pack");
|
||||
if (stat(p->pack_name, &st) || !S_ISREG(st.st_mode)) {
|
||||
free(p);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* ok, it looks sane as far as we can check without
|
||||
* actually mapping the pack file.
|
||||
*/
|
||||
p->pack_size = st.st_size;
|
||||
p->pack_local = local;
|
||||
p->mtime = st.st_mtime;
|
||||
if (path_len < 40 || get_sha1_hex(path + path_len - 40, p->sha1))
|
||||
hashclr(p->sha1);
|
||||
return p;
|
||||
}
|
||||
|
||||
void install_packed_git(struct packed_git *pack)
|
||||
{
|
||||
if (pack->pack_fd != -1)
|
||||
|
Loading…
Reference in New Issue
Block a user