packfile: add repository to struct packed_git
The struct `packed_git` holds information regarding a packed object file. Let's add the repository variable to this object, to represent the repository that this packfile belongs to. This helps remove dependency on the global `the_repository` object in `packfile.c` by simply using repository information now readily available in the struct. We do need to consider that a packfile could be part of the alternates of a repository, but considering that we only have one repository struct and also that we currently anyways use 'the_repository', we should be OK with this change. We also modify `alloc_packed_git` to ensure that the repository is added to newly created `packed_git` structs. This requires modifying the function and all its callee to pass the repository object down the levels. Helped-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Karthik Nayak <karthik.188@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
8f8d6eee53
commit
2cf3fe63f6
@@ -765,6 +765,7 @@ static void start_packfile(void)
|
||||
|
||||
p->pack_fd = pack_fd;
|
||||
p->do_not_close = 1;
|
||||
p->repo = the_repository;
|
||||
pack_file = hashfd(pack_fd, p->pack_name);
|
||||
|
||||
pack_data = p;
|
||||
@@ -888,7 +889,7 @@ static void end_packfile(void)
|
||||
idx_name = keep_pack(create_index());
|
||||
|
||||
/* Register the packfile with core git's machinery. */
|
||||
new_p = add_packed_git(idx_name, strlen(idx_name), 1);
|
||||
new_p = add_packed_git(pack_data->repo, idx_name, strlen(idx_name), 1);
|
||||
if (!new_p)
|
||||
die("core git rejected index %s", idx_name);
|
||||
all_packs[pack_id] = new_p;
|
||||
|
||||
@@ -1552,7 +1552,8 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
|
||||
|
||||
if (do_fsck_object) {
|
||||
struct packed_git *p;
|
||||
p = add_packed_git(final_index_name, strlen(final_index_name), 0);
|
||||
p = add_packed_git(the_repository, final_index_name,
|
||||
strlen(final_index_name), 0);
|
||||
if (p)
|
||||
install_packed_git(the_repository, p);
|
||||
}
|
||||
@@ -1650,7 +1651,8 @@ static void read_v2_anomalous_offsets(struct packed_git *p,
|
||||
|
||||
static void read_idx_option(struct pack_idx_option *opts, const char *pack_name)
|
||||
{
|
||||
struct packed_git *p = add_packed_git(pack_name, strlen(pack_name), 1);
|
||||
struct packed_git *p = add_packed_git(the_repository, pack_name,
|
||||
strlen(pack_name), 1);
|
||||
|
||||
if (!p)
|
||||
die(_("Cannot open existing pack file '%s'"), pack_name);
|
||||
|
||||
@@ -1914,7 +1914,7 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
|
||||
struct packed_git *p;
|
||||
strbuf_setlen(&packname, dirlen);
|
||||
strbuf_addstr(&packname, pack_indexes->items[i].string);
|
||||
p = add_packed_git(packname.buf, packname.len, 1);
|
||||
p = add_packed_git(ctx->r, packname.buf, packname.len, 1);
|
||||
if (!p) {
|
||||
ret = error(_("error adding pack %s"), packname.buf);
|
||||
goto cleanup;
|
||||
|
||||
@@ -54,7 +54,8 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
|
||||
strbuf_add(&idx_file, transport->pack_lockfiles.items[0].string,
|
||||
base_len);
|
||||
strbuf_addstr(&idx_file, ".idx");
|
||||
new_pack = add_packed_git(idx_file.buf, idx_file.len, 1);
|
||||
new_pack = add_packed_git(the_repository, idx_file.buf,
|
||||
idx_file.len, 1);
|
||||
strbuf_release(&idx_file);
|
||||
}
|
||||
|
||||
|
||||
2
http.c
2
http.c
@@ -2439,7 +2439,7 @@ static int fetch_and_setup_pack_index(struct packed_git **packs_head,
|
||||
if (!tmp_idx)
|
||||
return -1;
|
||||
|
||||
new_pack = parse_pack_index(sha1, tmp_idx);
|
||||
new_pack = parse_pack_index(the_repository, sha1, tmp_idx);
|
||||
if (!new_pack) {
|
||||
unlink(tmp_idx);
|
||||
free(tmp_idx);
|
||||
|
||||
@@ -154,7 +154,7 @@ static void add_pack_to_midx(const char *full_path, size_t full_path_len,
|
||||
return;
|
||||
|
||||
ALLOC_GROW(ctx->info, ctx->nr + 1, ctx->alloc);
|
||||
p = add_packed_git(full_path, full_path_len, 0);
|
||||
p = add_packed_git(the_repository, full_path, full_path_len, 0);
|
||||
if (!p) {
|
||||
warning(_("failed to add packfile '%s'"),
|
||||
full_path);
|
||||
|
||||
2
midx.c
2
midx.c
@@ -464,7 +464,7 @@ int prepare_midx_pack(struct repository *r, struct multi_pack_index *m,
|
||||
strhash(key.buf), key.buf,
|
||||
struct packed_git, packmap_ent);
|
||||
if (!p) {
|
||||
p = add_packed_git(pack_name.buf, pack_name.len, m->local);
|
||||
p = add_packed_git(r, pack_name.buf, pack_name.len, m->local);
|
||||
if (p) {
|
||||
install_packed_git(r, p);
|
||||
list_add_tail(&p->mru, &r->objects->packed_git_mru);
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
struct oidmap;
|
||||
struct oidtree;
|
||||
struct strbuf;
|
||||
struct repository;
|
||||
|
||||
struct object_directory {
|
||||
struct object_directory *next;
|
||||
@@ -135,6 +136,10 @@ struct packed_git {
|
||||
*/
|
||||
const uint32_t *mtimes_map;
|
||||
size_t mtimes_size;
|
||||
|
||||
/* repo denotes the repository this packfile belongs to */
|
||||
struct repository *repo;
|
||||
|
||||
/* something like ".git/objects/pack/xxxxx.pack" */
|
||||
char pack_name[FLEX_ARRAY]; /* more */
|
||||
};
|
||||
|
||||
15
packfile.c
15
packfile.c
@@ -217,11 +217,12 @@ uint32_t get_pack_fanout(struct packed_git *p, uint32_t value)
|
||||
return ntohl(level1_ofs[value]);
|
||||
}
|
||||
|
||||
static struct packed_git *alloc_packed_git(int extra)
|
||||
static struct packed_git *alloc_packed_git(struct repository *r, int extra)
|
||||
{
|
||||
struct packed_git *p = xmalloc(st_add(sizeof(*p), extra));
|
||||
memset(p, 0, sizeof(*p));
|
||||
p->pack_fd = -1;
|
||||
p->repo = r;
|
||||
return p;
|
||||
}
|
||||
|
||||
@@ -233,11 +234,12 @@ static char *pack_path_from_idx(const char *idx_path)
|
||||
return xstrfmt("%.*s.pack", (int)len, idx_path);
|
||||
}
|
||||
|
||||
struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path)
|
||||
struct packed_git *parse_pack_index(struct repository *r, unsigned char *sha1,
|
||||
const char *idx_path)
|
||||
{
|
||||
char *path = pack_path_from_idx(idx_path);
|
||||
size_t alloc = st_add(strlen(path), 1);
|
||||
struct packed_git *p = alloc_packed_git(alloc);
|
||||
struct packed_git *p = alloc_packed_git(r, alloc);
|
||||
|
||||
memcpy(p->pack_name, path, alloc); /* includes NUL */
|
||||
free(path);
|
||||
@@ -703,7 +705,8 @@ void unuse_pack(struct pack_window **w_cursor)
|
||||
}
|
||||
}
|
||||
|
||||
struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
|
||||
struct packed_git *add_packed_git(struct repository *r, const char *path,
|
||||
size_t path_len, int local)
|
||||
{
|
||||
struct stat st;
|
||||
size_t alloc;
|
||||
@@ -721,7 +724,7 @@ struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
|
||||
* the use xsnprintf double-checks that)
|
||||
*/
|
||||
alloc = st_add3(path_len, strlen(".promisor"), 1);
|
||||
p = alloc_packed_git(alloc);
|
||||
p = alloc_packed_git(r, alloc);
|
||||
memcpy(p->pack_name, path, path_len);
|
||||
|
||||
xsnprintf(p->pack_name + path_len, alloc - path_len, ".keep");
|
||||
@@ -877,7 +880,7 @@ static void prepare_pack(const char *full_name, size_t full_name_len,
|
||||
|
||||
/* Don't reopen a pack we already have. */
|
||||
if (!hashmap_get(&data->r->objects->pack_map, &hent, pack_name)) {
|
||||
p = add_packed_git(full_name, full_name_len, data->local);
|
||||
p = add_packed_git(data->r, full_name, full_name_len, data->local);
|
||||
if (p)
|
||||
install_packed_git(data->r, p);
|
||||
}
|
||||
|
||||
@@ -46,7 +46,8 @@ const char *pack_basename(struct packed_git *p);
|
||||
* and does not add the resulting packed_git struct to the internal list of
|
||||
* packs. You probably want add_packed_git() instead.
|
||||
*/
|
||||
struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path);
|
||||
struct packed_git *parse_pack_index(struct repository *r, unsigned char *sha1,
|
||||
const char *idx_path);
|
||||
|
||||
typedef void each_file_in_pack_dir_fn(const char *full_path, size_t full_path_len,
|
||||
const char *file_name, void *data);
|
||||
@@ -113,7 +114,8 @@ void close_pack(struct packed_git *);
|
||||
void close_object_store(struct raw_object_store *o);
|
||||
void unuse_pack(struct pack_window **);
|
||||
void clear_delta_base_cache(void);
|
||||
struct packed_git *add_packed_git(const char *path, size_t path_len, int local);
|
||||
struct packed_git *add_packed_git(struct repository *r, const char *path,
|
||||
size_t path_len, int local);
|
||||
|
||||
/*
|
||||
* Unlink the .pack and associated extension files.
|
||||
|
||||
Reference in New Issue
Block a user