gc: do not repack promisor packfiles
Teach gc to stop traversal at promisor objects, and to leave promisor packfiles alone. This has the effect of only repacking non-promisor packfiles, and preserves the distinction between promisor packfiles and non-promisor packfiles. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
df11e19648
commit
0c16cd499d
@ -75,6 +75,8 @@ static int use_bitmap_index = -1;
|
||||
static int write_bitmap_index;
|
||||
static uint16_t write_bitmap_options;
|
||||
|
||||
static int exclude_promisor_objects;
|
||||
|
||||
static unsigned long delta_cache_size = 0;
|
||||
static unsigned long max_delta_cache_size = 256 * 1024 * 1024;
|
||||
static unsigned long cache_max_small_delta_size = 1000;
|
||||
@ -84,8 +86,9 @@ static unsigned long window_memory_limit = 0;
|
||||
static struct list_objects_filter_options filter_options;
|
||||
|
||||
enum missing_action {
|
||||
MA_ERROR = 0, /* fail if any missing objects are encountered */
|
||||
MA_ALLOW_ANY, /* silently allow ALL missing objects */
|
||||
MA_ERROR = 0, /* fail if any missing objects are encountered */
|
||||
MA_ALLOW_ANY, /* silently allow ALL missing objects */
|
||||
MA_ALLOW_PROMISOR, /* silently allow all missing PROMISOR objects */
|
||||
};
|
||||
static enum missing_action arg_missing_action;
|
||||
static show_object_fn fn_show_object;
|
||||
@ -2577,6 +2580,20 @@ static void show_object__ma_allow_any(struct object *obj, const char *name, void
|
||||
show_object(obj, name, data);
|
||||
}
|
||||
|
||||
static void show_object__ma_allow_promisor(struct object *obj, const char *name, void *data)
|
||||
{
|
||||
assert(arg_missing_action == MA_ALLOW_PROMISOR);
|
||||
|
||||
/*
|
||||
* Quietly ignore EXPECTED missing objects. This avoids problems with
|
||||
* staging them now and getting an odd error later.
|
||||
*/
|
||||
if (!has_object_file(&obj->oid) && is_promisor_object(&obj->oid))
|
||||
return;
|
||||
|
||||
show_object(obj, name, data);
|
||||
}
|
||||
|
||||
static int option_parse_missing_action(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
@ -2591,10 +2608,18 @@ static int option_parse_missing_action(const struct option *opt,
|
||||
|
||||
if (!strcmp(arg, "allow-any")) {
|
||||
arg_missing_action = MA_ALLOW_ANY;
|
||||
fetch_if_missing = 0;
|
||||
fn_show_object = show_object__ma_allow_any;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(arg, "allow-promisor")) {
|
||||
arg_missing_action = MA_ALLOW_PROMISOR;
|
||||
fetch_if_missing = 0;
|
||||
fn_show_object = show_object__ma_allow_promisor;
|
||||
return 0;
|
||||
}
|
||||
|
||||
die(_("invalid value for --missing"));
|
||||
return 0;
|
||||
}
|
||||
@ -3008,6 +3033,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
|
||||
{ OPTION_CALLBACK, 0, "missing", NULL, N_("action"),
|
||||
N_("handling for missing objects"), PARSE_OPT_NONEG,
|
||||
option_parse_missing_action },
|
||||
OPT_BOOL(0, "exclude-promisor-objects", &exclude_promisor_objects,
|
||||
N_("do not pack objects in promisor packfiles")),
|
||||
OPT_END(),
|
||||
};
|
||||
|
||||
@ -3053,6 +3080,12 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
|
||||
argv_array_push(&rp, "--unpacked");
|
||||
}
|
||||
|
||||
if (exclude_promisor_objects) {
|
||||
use_internal_rev_list = 1;
|
||||
fetch_if_missing = 0;
|
||||
argv_array_push(&rp, "--exclude-promisor-objects");
|
||||
}
|
||||
|
||||
if (!reuse_object)
|
||||
reuse_delta = 0;
|
||||
if (pack_compression_level == -1)
|
||||
|
Reference in New Issue
Block a user