mirror of
https://github.com/git/git.git
synced 2026-06-30 19:58:12 +00:00
midx: support custom --base for incremental MIDX writes
Both `compact` and `write --incremental` fix the base of the resulting MIDX layer: `compact` always places the compacted result on top of "from's" immediate parent in the chain, and `write --incremental` always appends a new layer to the existing tip. In both cases the base is not configurable. Future callers need additional flexibility. For instance, the incremental MIDX-based repacking code may wish to write a layer based on some intermediate ancestor rather than the current tip, or produce a root layer when replacing the bottommost entries in the chain. Introduce a new `--base` option for both subcommands to specify the checksum of the MIDX layer to use as the base. The given checksum must refer to a valid layer in the MIDX chain that is an ancestor of the topmost layer being written or compacted. The special value "none" is accepted to produce a root layer with no parent. This will be needed when the incremental repacking machinery determines that the bottommost layers of the chain should be replaced. If no `--base` is given, behavior is unchanged: `compact` uses "from's" immediate parent in the chain, and `write` appends to the existing tip. For the `write` subcommand, `--base` requires `--no-write-chain-file`. A plain `write --incremental` appends a new layer to the live chain tip with no mechanism to atomically replace it; overriding the base would produce a layer that does not extend the tip, breaking chain invariants. With `--no-write-chain-file` the chain is left unmodified and the caller is responsible for assembling a valid chain. For `compact`, no such restriction applies. The compaction operation atomically replaces the compacted range in the chain file, so writing the result on top of any valid ancestor preserves chain invariants. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
8d342ed4b5
commit
0cd2255e64
34
midx-write.c
34
midx-write.c
@@ -1247,6 +1247,7 @@ struct write_midx_opts {
|
||||
|
||||
const char *preferred_pack_name;
|
||||
const char *refs_snapshot;
|
||||
const char *incremental_base;
|
||||
unsigned flags;
|
||||
};
|
||||
|
||||
@@ -1330,11 +1331,32 @@ static int write_midx_internal(struct write_midx_opts *opts)
|
||||
|
||||
/*
|
||||
* If compacting MIDX layer(s) in the range [from, to], then the
|
||||
* compacted MIDX will share the same base MIDX as 'from'.
|
||||
* compacted MIDX will share the same base MIDX as 'from',
|
||||
* unless a custom --base is specified (see below).
|
||||
*/
|
||||
if (ctx.compact)
|
||||
ctx.base_midx = ctx.compact_from->base_midx;
|
||||
|
||||
if (opts->incremental_base) {
|
||||
if (!strcmp(opts->incremental_base, "none")) {
|
||||
ctx.base_midx = NULL;
|
||||
} else {
|
||||
while (ctx.base_midx) {
|
||||
const char *cmp = midx_get_checksum_hex(ctx.base_midx);
|
||||
if (!strcmp(opts->incremental_base, cmp))
|
||||
break;
|
||||
|
||||
ctx.base_midx = ctx.base_midx->base_midx;
|
||||
}
|
||||
|
||||
if (!ctx.base_midx) {
|
||||
error(_("could not find base MIDX '%s'"),
|
||||
opts->incremental_base);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ctx.nr = 0;
|
||||
ctx.alloc = ctx.m ? ctx.m->num_packs + ctx.m->num_packs_in_base : 16;
|
||||
ctx.info = NULL;
|
||||
@@ -1827,7 +1849,8 @@ cleanup:
|
||||
|
||||
int write_midx_file(struct odb_source *source,
|
||||
const char *preferred_pack_name,
|
||||
const char *refs_snapshot, unsigned flags)
|
||||
const char *refs_snapshot,
|
||||
unsigned flags)
|
||||
{
|
||||
struct write_midx_opts opts = {
|
||||
.source = source,
|
||||
@@ -1842,13 +1865,16 @@ int write_midx_file(struct odb_source *source,
|
||||
int write_midx_file_only(struct odb_source *source,
|
||||
struct string_list *packs_to_include,
|
||||
const char *preferred_pack_name,
|
||||
const char *refs_snapshot, unsigned flags)
|
||||
const char *refs_snapshot,
|
||||
const char *incremental_base,
|
||||
unsigned flags)
|
||||
{
|
||||
struct write_midx_opts opts = {
|
||||
.source = source,
|
||||
.packs_to_include = packs_to_include,
|
||||
.preferred_pack_name = preferred_pack_name,
|
||||
.refs_snapshot = refs_snapshot,
|
||||
.incremental_base = incremental_base,
|
||||
.flags = flags,
|
||||
};
|
||||
|
||||
@@ -1858,12 +1884,14 @@ int write_midx_file_only(struct odb_source *source,
|
||||
int write_midx_file_compact(struct odb_source *source,
|
||||
struct multi_pack_index *from,
|
||||
struct multi_pack_index *to,
|
||||
const char *incremental_base,
|
||||
unsigned flags)
|
||||
{
|
||||
struct write_midx_opts opts = {
|
||||
.source = source,
|
||||
.compact_from = from,
|
||||
.compact_to = to,
|
||||
.incremental_base = incremental_base,
|
||||
.flags = flags | MIDX_WRITE_COMPACT,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user