mirror of
https://github.com/git-for-windows/git.git
synced 2026-04-10 16:54:08 -05:00
Expose the incremental MIDX repacking mode (implemented in an earlier commit) via a new --write-midx=incremental option for `git repack`. Add "incremental" as a recognized argument to the --write-midx OPT_CALLBACK, mapping it to REPACK_WRITE_MIDX_INCREMENTAL. When this mode is active and --geometric is in use, set the midx_layer_threshold on the pack geometry so that only packs in sufficiently large tip layers are considered for repacking. Two new configuration options control the compaction behavior: - repack.midxSplitFactor (default: 2): the factor used in the geometric merging condition for MIDX layers. - repack.midxNewLayerThreshold (default: 8): the minimum number of packs in the tip MIDX layer before its packs are considered as candidates for geometric repacking. Add tests exercising the new mode across a variety of scenarios including basic geometric violations, multi-round chain integrity, branching and merging histories, cross-layer object uniqueness, and threshold-based compaction. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
174 lines
5.1 KiB
C
174 lines
5.1 KiB
C
#ifndef REPACK_H
|
|
#define REPACK_H
|
|
|
|
#include "list-objects-filter-options.h"
|
|
#include "string-list.h"
|
|
|
|
struct pack_objects_args {
|
|
char *window;
|
|
char *window_memory;
|
|
char *depth;
|
|
char *threads;
|
|
unsigned long max_pack_size;
|
|
int no_reuse_delta;
|
|
int no_reuse_object;
|
|
int quiet;
|
|
int local;
|
|
int name_hash_version;
|
|
int path_walk;
|
|
int delta_base_offset;
|
|
int pack_kept_objects;
|
|
struct list_objects_filter_options filter_options;
|
|
};
|
|
|
|
#define PACK_OBJECTS_ARGS_INIT { \
|
|
.delta_base_offset = 1, \
|
|
.pack_kept_objects = -1, \
|
|
}
|
|
|
|
struct child_process;
|
|
|
|
void prepare_pack_objects(struct child_process *cmd,
|
|
const struct pack_objects_args *args,
|
|
const char *out);
|
|
void pack_objects_args_release(struct pack_objects_args *args);
|
|
|
|
void repack_remove_redundant_pack(struct repository *repo, const char *dir_name,
|
|
const char *base_name,
|
|
bool wrote_incremental_midx);
|
|
|
|
struct write_pack_opts {
|
|
struct pack_objects_args *po_args;
|
|
const char *destination;
|
|
const char *packdir;
|
|
const char *packtmp;
|
|
};
|
|
|
|
const char *write_pack_opts_pack_prefix(const struct write_pack_opts *opts);
|
|
bool write_pack_opts_is_local(const struct write_pack_opts *opts);
|
|
|
|
int finish_pack_objects_cmd(const struct git_hash_algo *algop,
|
|
const struct write_pack_opts *opts,
|
|
struct child_process *cmd,
|
|
struct string_list *names);
|
|
|
|
struct repository;
|
|
struct packed_git;
|
|
|
|
struct existing_packs {
|
|
struct repository *repo;
|
|
struct odb_source *source;
|
|
struct string_list kept_packs;
|
|
struct string_list non_kept_packs;
|
|
struct string_list cruft_packs;
|
|
struct string_list midx_packs;
|
|
};
|
|
|
|
#define EXISTING_PACKS_INIT { \
|
|
.kept_packs = STRING_LIST_INIT_DUP, \
|
|
.non_kept_packs = STRING_LIST_INIT_DUP, \
|
|
.cruft_packs = STRING_LIST_INIT_DUP, \
|
|
}
|
|
|
|
/*
|
|
* Adds all packs hex strings (pack-$HASH) to either packs->non_kept
|
|
* or packs->kept based on whether each pack has a corresponding
|
|
* .keep file or not. Packs without a .keep file are not to be kept
|
|
* if we are going to pack everything into one file.
|
|
*/
|
|
void existing_packs_collect(struct existing_packs *existing,
|
|
const struct string_list *extra_keep);
|
|
int existing_packs_has_non_kept(const struct existing_packs *existing);
|
|
int existing_pack_is_marked_for_deletion(struct string_list_item *item);
|
|
void existing_packs_retain_cruft(struct existing_packs *existing,
|
|
struct packed_git *cruft);
|
|
void existing_packs_mark_for_deletion(struct existing_packs *existing,
|
|
struct string_list *names);
|
|
void existing_packs_remove_redundant(struct existing_packs *existing,
|
|
const char *packdir,
|
|
bool wrote_incremental_midx);
|
|
void existing_packs_release(struct existing_packs *existing);
|
|
|
|
struct generated_pack;
|
|
|
|
struct generated_pack *generated_pack_populate(const char *name,
|
|
const char *packtmp);
|
|
int generated_pack_has_ext(const struct generated_pack *pack, const char *ext);
|
|
void generated_pack_install(struct generated_pack *pack, const char *name,
|
|
const char *packdir, const char *packtmp);
|
|
|
|
void repack_promisor_objects(struct repository *repo,
|
|
const struct pack_objects_args *args,
|
|
struct string_list *names, const char *packtmp);
|
|
|
|
struct pack_geometry {
|
|
struct packed_git **pack;
|
|
uint32_t pack_nr, pack_alloc;
|
|
uint32_t split;
|
|
|
|
struct packed_git **promisor_pack;
|
|
uint32_t promisor_pack_nr, promisor_pack_alloc;
|
|
uint32_t promisor_split;
|
|
|
|
uint32_t midx_layer_threshold;
|
|
bool midx_layer_threshold_set;
|
|
bool midx_tip_rewritten;
|
|
|
|
int split_factor;
|
|
};
|
|
|
|
void pack_geometry_repack_promisors(struct repository *repo,
|
|
const struct pack_objects_args *args,
|
|
const struct pack_geometry *geometry,
|
|
struct string_list *names,
|
|
const char *packtmp);
|
|
|
|
void pack_geometry_init(struct pack_geometry *geometry,
|
|
struct existing_packs *existing,
|
|
const struct pack_objects_args *args);
|
|
void pack_geometry_split(struct pack_geometry *geometry);
|
|
struct packed_git *pack_geometry_preferred_pack(struct pack_geometry *geometry);
|
|
void pack_geometry_remove_redundant(struct pack_geometry *geometry,
|
|
struct string_list *names,
|
|
struct existing_packs *existing,
|
|
const char *packdir,
|
|
bool wrote_incremental_midx);
|
|
void pack_geometry_release(struct pack_geometry *geometry);
|
|
|
|
struct tempfile;
|
|
|
|
enum repack_write_midx_mode {
|
|
REPACK_WRITE_MIDX_NONE,
|
|
REPACK_WRITE_MIDX_DEFAULT,
|
|
REPACK_WRITE_MIDX_INCREMENTAL,
|
|
};
|
|
|
|
struct repack_write_midx_opts {
|
|
struct existing_packs *existing;
|
|
struct pack_geometry *geometry;
|
|
struct string_list *names;
|
|
const char *refs_snapshot;
|
|
const char *packdir;
|
|
int show_progress;
|
|
int write_bitmaps;
|
|
int midx_must_contain_cruft;
|
|
int midx_split_factor;
|
|
int midx_new_layer_threshold;
|
|
enum repack_write_midx_mode mode;
|
|
};
|
|
|
|
void midx_snapshot_refs(struct repository *repo, struct tempfile *f);
|
|
int repack_write_midx(struct repack_write_midx_opts *opts);
|
|
|
|
int write_filtered_pack(const struct write_pack_opts *opts,
|
|
struct existing_packs *existing,
|
|
struct string_list *names);
|
|
|
|
int write_cruft_pack(const struct write_pack_opts *opts,
|
|
const char *cruft_expiration,
|
|
unsigned long combine_cruft_below_size,
|
|
struct string_list *names,
|
|
struct existing_packs *existing);
|
|
|
|
#endif /* REPACK_H */
|