Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Documentation/technical/partial-clone.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ and prefetch those objects in bulk.
- `repack` in GC has been updated to not touch promisor packfiles at all,
and to only repack other objects.

- The global variable "fetch_if_missing" is used to control whether an
- The per-repository flag "fetch_if_missing" is used to control whether an
object lookup will attempt to dynamically fetch a missing object or
report an error.
+
Expand Down
2 changes: 1 addition & 1 deletion builtin/fetch-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ int cmd_fetch_pack(int argc,
struct packet_reader reader;
enum protocol_version version;

fetch_if_missing = 0;
the_repository->fetch_if_missing = 0;

packet_trace_identity("fetch-pack");

Expand Down
6 changes: 3 additions & 3 deletions builtin/fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -1017,15 +1017,15 @@ int cmd_fsck(int argc,
.ref = NULL
};

/* fsck knows how to handle missing promisor objects */
fetch_if_missing = 0;

errors_found = 0;
disable_replace_refs();
save_commit_buffer = 0;

argc = parse_options(argc, argv, prefix, fsck_opts, fsck_usage, 0);

/* fsck knows how to handle missing promisor objects */
repo->fetch_if_missing = 0;

fsck_options_init(&fsck_walk_options, repo, FSCK_OPTIONS_DEFAULT);
fsck_walk_options.walk = mark_object;

Expand Down
9 changes: 5 additions & 4 deletions builtin/index-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -1881,7 +1881,7 @@ static void repack_local_links(void)
int cmd_index_pack(int argc,
const char **argv,
const char *prefix,
struct repository *repo UNUSED)
struct repository *repo)
{
int i, fix_thin_pack = 0, verify = 0, stat_only = 0, rev_index;
const char *curr_index;
Expand All @@ -1898,15 +1898,16 @@ int cmd_index_pack(int argc,
int report_end_of_input = 0;
int hash_algo = 0;

show_usage_if_asked(argc, argv, index_pack_usage);

/*
* index-pack never needs to fetch missing objects except when
* REF_DELTA bases are missing (which are explicitly handled). It only
* accesses the repo to do hash collision checks and to check which
* REF_DELTA bases need to be fetched.
*/
fetch_if_missing = 0;

show_usage_if_asked(argc, argv, index_pack_usage);
if (repo)
repo->fetch_if_missing = 0;

disable_replace_refs();

Expand Down
14 changes: 7 additions & 7 deletions builtin/pack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -4059,15 +4059,15 @@ static void add_unreachable_loose_objects(struct rev_info *revs);

static void read_stdin_packs(enum stdin_packs_mode mode, int rev_list_unpacked)
{
int prev_fetch_if_missing = fetch_if_missing;
int prev_fetch_if_missing = the_repository->fetch_if_missing;
struct rev_info revs;

/*
* The revision walk may hit objects that are promised, only. As the
* walk is best-effort though we don't want to perform backfill fetches
* for them.
*/
fetch_if_missing = 0;
the_repository->fetch_if_missing = 0;

repo_init_revisions(the_repository, &revs, NULL);
/*
Expand Down Expand Up @@ -4115,7 +4115,7 @@ static void read_stdin_packs(enum stdin_packs_mode mode, int rev_list_unpacked)
trace2_data_intmax("pack-objects", the_repository, "stdin_packs_hints",
stdin_packs_hints_nr);

fetch_if_missing = prev_fetch_if_missing;
the_repository->fetch_if_missing = prev_fetch_if_missing;
}

static void add_cruft_object_entry(const struct object_id *oid, enum object_type type,
Expand Down Expand Up @@ -4451,14 +4451,14 @@ static int option_parse_missing_action(const struct option *opt UNUSED,

if (!strcmp(arg, "allow-any")) {
arg_missing_action = MA_ALLOW_ANY;
fetch_if_missing = 0;
the_repository->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;
the_repository->fetch_if_missing = 0;
fn_show_object = show_object__ma_allow_promisor;
return 0;
}
Expand Down Expand Up @@ -5247,7 +5247,7 @@ int cmd_pack_objects(int argc,
exclude_promisor_objects_best_effort,
"--exclude-promisor-objects-best-effort");
if (exclude_promisor_objects) {
fetch_if_missing = 0;
the_repository->fetch_if_missing = 0;

/* --stdin-packs handles promisor objects separately. */
if (!stdin_packs) {
Expand All @@ -5256,7 +5256,7 @@ int cmd_pack_objects(int argc,
}
} else if (exclude_promisor_objects_best_effort) {
use_internal_rev_list = 1;
fetch_if_missing = 0;
the_repository->fetch_if_missing = 0;
option_parse_missing_action(NULL, "allow-any", 0);
/* revs configured below */
}
Expand Down
2 changes: 1 addition & 1 deletion builtin/prune.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ int cmd_prune(int argc,
if (show_progress == -1)
show_progress = isatty(2);
if (exclude_promisor_objects) {
fetch_if_missing = 0;
repo->fetch_if_missing = 0;
revs.exclude_promisor_objects = 1;
}

Expand Down
10 changes: 5 additions & 5 deletions builtin/rev-list.c
Original file line number Diff line number Diff line change
Expand Up @@ -509,25 +509,25 @@ static inline int parse_missing_action_value(const char *value)

if (!strcmp(value, "allow-any")) {
arg_missing_action = MA_ALLOW_ANY;
fetch_if_missing = 0;
the_repository->fetch_if_missing = 0;
return 1;
}

if (!strcmp(value, "print")) {
arg_missing_action = MA_PRINT;
fetch_if_missing = 0;
the_repository->fetch_if_missing = 0;
return 1;
}

if (!strcmp(value, "print-info")) {
arg_missing_action = MA_PRINT_INFO;
fetch_if_missing = 0;
the_repository->fetch_if_missing = 0;
return 1;
}

if (!strcmp(value, "allow-promisor")) {
arg_missing_action = MA_ALLOW_PROMISOR;
fetch_if_missing = 0;
the_repository->fetch_if_missing = 0;
return 1;
}

Expand Down Expand Up @@ -745,7 +745,7 @@ int cmd_rev_list(int argc,
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
if (!strcmp(arg, "--exclude-promisor-objects")) {
fetch_if_missing = 0;
the_repository->fetch_if_missing = 0;
revs.exclude_promisor_objects = 1;
} else if (skip_prefix(arg, "--missing=", &arg)) {
parse_missing_action_value(arg);
Expand Down
2 changes: 1 addition & 1 deletion git.c
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
if (envchanged)
*envchanged = 1;
} else if (!strcmp(cmd, "--no-lazy-fetch")) {
fetch_if_missing = 0;
the_repository->fetch_if_missing = 0;
setenv(NO_LAZY_FETCH_ENVIRONMENT, "1", 1);
if (envchanged)
*envchanged = 1;
Expand Down
2 changes: 1 addition & 1 deletion midx-write.c
Original file line number Diff line number Diff line change
Expand Up @@ -865,7 +865,7 @@ static void find_commits_for_midx_bitmap(struct commit_stack *commits,
* complain later that we don't have reachability closure (and fail
* appropriately).
*/
fetch_if_missing = 0;
ctx->repo->fetch_if_missing = 0;
revs.exclude_promisor_objects = 1;

if (prepare_revision_walk(&revs))
Expand Down
4 changes: 1 addition & 3 deletions odb.c
Original file line number Diff line number Diff line change
Expand Up @@ -528,8 +528,6 @@ void disable_obj_read_lock(void)
pthread_mutex_destroy(&obj_read_mutex);
}

int fetch_if_missing = 1;

static int register_all_submodule_sources(struct object_database *odb)
{
int ret = odb->submodule_source_paths.nr;
Expand Down Expand Up @@ -595,7 +593,7 @@ static int do_oid_object_info_extended(struct object_database *odb,
continue;

/* Check if it is a missing object */
if (fetch_if_missing && repo_has_promisor_remote(odb->repo) &&
if (odb->repo->fetch_if_missing && repo_has_promisor_remote(odb->repo) &&
!already_retried &&
!(flags & OBJECT_INFO_SKIP_FETCH_OBJECT)) {
promisor_remote_get_direct(odb->repo, real, 1);
Expand Down
8 changes: 0 additions & 8 deletions odb.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,6 @@ struct repository;
struct strbuf;
struct strvec;

/*
* Set this to 0 to prevent odb_read_object_info_extended() from fetching missing
* blobs. This has a difference only if extensions.partialClone is set.
*
* Its default value is 1.
*/
extern int fetch_if_missing;

/*
* Compute the exact path an alternate is at and returns it. In case of
* error NULL is returned and the human readable error is added to `err`
Expand Down
1 change: 1 addition & 0 deletions repository.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ void initialize_repository(struct repository *repo)
ALLOC_ARRAY(repo->index, 1);
index_state_init(repo->index, repo);
repo->check_deprecated_config = true;
repo->fetch_if_missing = 1;
repo_config_values_init(&repo->config_values_private_);

/*
Expand Down
6 changes: 6 additions & 0 deletions repository.h
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,12 @@ struct repository {
/* True if commit-graph has been disabled within this process. */
int commit_graph_disabled;

/*
* Controls whether the repository should lazily fetch missing
* objects from promisor remotes. Defaults to 1.
*/
int fetch_if_missing;

/*
* Lazily-populated cache mapping hook event names to configured hooks.
* NULL until first hook use.
Expand Down
2 changes: 1 addition & 1 deletion revision.c
Original file line number Diff line number Diff line change
Expand Up @@ -2714,7 +2714,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
revs->ignore_missing = 1;
} else if (opt && opt->allow_exclude_promisor_objects &&
!strcmp(arg, "--exclude-promisor-objects")) {
if (fetch_if_missing)
if (revs->repo->fetch_if_missing)
BUG("exclude_promisor_objects can only be used when fetch_if_missing is 0");
revs->exclude_promisor_objects = 1;
} else {
Expand Down
2 changes: 1 addition & 1 deletion setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -1064,7 +1064,7 @@ static void setup_git_env_internal(struct repository *repo,
set_alternate_shallow_file(repo, shallow_file, 0);

if (git_env_bool(NO_LAZY_FETCH_ENVIRONMENT, 0))
fetch_if_missing = 0;
the_repository->fetch_if_missing = 0;
}

static void set_git_dir_1(struct repository *repo, const char *path)
Expand Down
Loading