зеркало из https://github.com/microsoft/git.git
midx: expose `write_midx_file_only()` publicly
Expose a variant of the write_midx_file() function which ignores packs that aren't included in an explicit "allow" list. This will be used in an upcoming patch to power a new `--stdin-packs` mode of `git multi-pack-index write` for callers that only want to include certain packs in a MIDX (and ignore any packs which may have happened to enter the repository independently, e.g., from pushes). Those patches will provide test coverage for this new function. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
73cd7d9420
Коммит
56d863e979
49
midx.c
49
midx.c
|
@ -475,6 +475,8 @@ struct write_midx_context {
|
|||
uint32_t num_large_offsets;
|
||||
|
||||
int preferred_pack_idx;
|
||||
|
||||
struct string_list *to_include;
|
||||
};
|
||||
|
||||
static void add_pack_to_midx(const char *full_path, size_t full_path_len,
|
||||
|
@ -484,8 +486,26 @@ static void add_pack_to_midx(const char *full_path, size_t full_path_len,
|
|||
|
||||
if (ends_with(file_name, ".idx")) {
|
||||
display_progress(ctx->progress, ++ctx->pack_paths_checked);
|
||||
/*
|
||||
* Note that at most one of ctx->m and ctx->to_include are set,
|
||||
* so we are testing midx_contains_pack() and
|
||||
* string_list_has_string() independently (guarded by the
|
||||
* appropriate NULL checks).
|
||||
*
|
||||
* We could support passing to_include while reusing an existing
|
||||
* MIDX, but don't currently since the reuse process drags
|
||||
* forward all packs from an existing MIDX (without checking
|
||||
* whether or not they appear in the to_include list).
|
||||
*
|
||||
* If we added support for that, these next two conditional
|
||||
* should be performed independently (likely checking
|
||||
* to_include before the existing MIDX).
|
||||
*/
|
||||
if (ctx->m && midx_contains_pack(ctx->m, file_name))
|
||||
return;
|
||||
else if (ctx->to_include &&
|
||||
!string_list_has_string(ctx->to_include, file_name))
|
||||
return;
|
||||
|
||||
ALLOC_GROW(ctx->info, ctx->nr + 1, ctx->alloc);
|
||||
|
||||
|
@ -1058,6 +1078,7 @@ cleanup:
|
|||
}
|
||||
|
||||
static int write_midx_internal(const char *object_dir,
|
||||
struct string_list *packs_to_include,
|
||||
struct string_list *packs_to_drop,
|
||||
const char *preferred_pack_name,
|
||||
unsigned flags)
|
||||
|
@ -1082,12 +1103,19 @@ static int write_midx_internal(const char *object_dir,
|
|||
die_errno(_("unable to create leading directories of %s"),
|
||||
midx_name);
|
||||
|
||||
if (!packs_to_include) {
|
||||
/*
|
||||
* Only reference an existing MIDX when not filtering which
|
||||
* packs to include, since all packs and objects are copied
|
||||
* blindly from an existing MIDX if one is present.
|
||||
*/
|
||||
for (cur = get_multi_pack_index(the_repository); cur; cur = cur->next) {
|
||||
if (!strcmp(object_dir, cur->object_dir)) {
|
||||
ctx.m = cur;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx.m && !midx_checksum_valid(ctx.m)) {
|
||||
warning(_("ignoring existing multi-pack-index; checksum mismatch"));
|
||||
|
@ -1136,10 +1164,13 @@ static int write_midx_internal(const char *object_dir,
|
|||
else
|
||||
ctx.progress = NULL;
|
||||
|
||||
ctx.to_include = packs_to_include;
|
||||
|
||||
for_each_file_in_pack_dir(object_dir, add_pack_to_midx, &ctx);
|
||||
stop_progress(&ctx.progress);
|
||||
|
||||
if (ctx.m && ctx.nr == ctx.m->num_packs && !packs_to_drop) {
|
||||
if ((ctx.m && ctx.nr == ctx.m->num_packs) &&
|
||||
!(packs_to_include || packs_to_drop)) {
|
||||
struct bitmap_index *bitmap_git;
|
||||
int bitmap_exists;
|
||||
int want_bitmap = flags & MIDX_WRITE_BITMAP;
|
||||
|
@ -1380,7 +1411,17 @@ int write_midx_file(const char *object_dir,
|
|||
const char *preferred_pack_name,
|
||||
unsigned flags)
|
||||
{
|
||||
return write_midx_internal(object_dir, NULL, preferred_pack_name, flags);
|
||||
return write_midx_internal(object_dir, NULL, NULL, preferred_pack_name,
|
||||
flags);
|
||||
}
|
||||
|
||||
int write_midx_file_only(const char *object_dir,
|
||||
struct string_list *packs_to_include,
|
||||
const char *preferred_pack_name,
|
||||
unsigned flags)
|
||||
{
|
||||
return write_midx_internal(object_dir, packs_to_include, NULL,
|
||||
preferred_pack_name, flags);
|
||||
}
|
||||
|
||||
struct clear_midx_data {
|
||||
|
@ -1660,7 +1701,7 @@ int expire_midx_packs(struct repository *r, const char *object_dir, unsigned fla
|
|||
free(count);
|
||||
|
||||
if (packs_to_drop.nr) {
|
||||
result = write_midx_internal(object_dir, &packs_to_drop, NULL, flags);
|
||||
result = write_midx_internal(object_dir, NULL, &packs_to_drop, NULL, flags);
|
||||
m = NULL;
|
||||
}
|
||||
|
||||
|
@ -1851,7 +1892,7 @@ int midx_repack(struct repository *r, const char *object_dir, size_t batch_size,
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
result = write_midx_internal(object_dir, NULL, NULL, flags);
|
||||
result = write_midx_internal(object_dir, NULL, NULL, NULL, flags);
|
||||
m = NULL;
|
||||
|
||||
cleanup:
|
||||
|
|
9
midx.h
9
midx.h
|
@ -2,6 +2,7 @@
|
|||
#define MIDX_H
|
||||
|
||||
#include "repository.h"
|
||||
#include "string-list.h"
|
||||
|
||||
struct object_id;
|
||||
struct pack_entry;
|
||||
|
@ -62,6 +63,14 @@ int midx_contains_pack(struct multi_pack_index *m, const char *idx_or_pack_name)
|
|||
int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local);
|
||||
|
||||
int write_midx_file(const char *object_dir, const char *preferred_pack_name, unsigned flags);
|
||||
/*
|
||||
* Variant of write_midx_file which writes a MIDX containing only the packs
|
||||
* specified in packs_to_include.
|
||||
*/
|
||||
int write_midx_file_only(const char *object_dir,
|
||||
struct string_list *packs_to_include,
|
||||
const char *preferred_pack_name,
|
||||
unsigned flags);
|
||||
void clear_midx_file(struct repository *r);
|
||||
int verify_midx_file(struct repository *r, const char *object_dir, unsigned flags);
|
||||
int expire_midx_packs(struct repository *r, const char *object_dir, unsigned flags);
|
||||
|
|
Загрузка…
Ссылка в новой задаче