aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--odb.c3
-rw-r--r--odb.h7
-rw-r--r--refs.c2
-rw-r--r--repository.c2
-rw-r--r--repository.h9
-rw-r--r--setup.c2
6 files changed, 13 insertions, 12 deletions
diff --git a/odb.c b/odb.c
index 29cf6496c5..ccc6e999e7 100644
--- a/odb.c
+++ b/odb.c
@@ -360,7 +360,7 @@ struct odb_source *odb_set_temporary_primary_source(struct object_database *odb,
* Disable ref updates while a temporary odb is active, since
* the objects in the database may roll back.
*/
- source->disable_ref_updates = 1;
+ odb->repo->disable_ref_updates = true;
source->will_destroy = will_destroy;
source->next = odb->sources;
odb->sources = source;
@@ -387,6 +387,7 @@ void odb_restore_primary_source(struct object_database *odb,
if (cur_source->next != restore_source)
BUG("we expect the old primary object store to be the first alternate");
+ odb->repo->disable_ref_updates = false;
odb->sources = restore_source;
odb_source_free(cur_source);
}
diff --git a/odb.h b/odb.h
index 77b313b784..99c4d48972 100644
--- a/odb.h
+++ b/odb.h
@@ -67,13 +67,6 @@ struct odb_source {
bool local;
/*
- * This is a temporary object store created by the tmp_objdir
- * facility. Disable ref updates since the objects in the store
- * might be discarded on rollback.
- */
- int disable_ref_updates;
-
- /*
* This object store is ephemeral, so there is no need to fsync.
*/
int will_destroy;
diff --git a/refs.c b/refs.c
index 965381367e..6c7283d9eb 100644
--- a/refs.c
+++ b/refs.c
@@ -2491,7 +2491,7 @@ int ref_transaction_prepare(struct ref_transaction *transaction,
break;
}
- if (refs->repo->objects->sources->disable_ref_updates) {
+ if (refs->repo->disable_ref_updates) {
strbuf_addstr(err,
_("ref updates forbidden inside quarantine environment"));
return -1;
diff --git a/repository.c b/repository.c
index 3c8b3813b0..455c2d279f 100644
--- a/repository.c
+++ b/repository.c
@@ -179,7 +179,7 @@ void repo_set_gitdir(struct repository *repo,
repo->objects->sources->path = objects_path;
}
- repo->objects->sources->disable_ref_updates = o->disable_ref_updates;
+ repo->disable_ref_updates = o->disable_ref_updates;
free(repo->objects->alternate_db);
repo->objects->alternate_db = xstrdup_or_null(o->alternate_db);
diff --git a/repository.h b/repository.h
index 5808a5d610..614649413b 100644
--- a/repository.h
+++ b/repository.h
@@ -72,6 +72,13 @@ struct repository {
struct ref_store *refs_private;
/*
+ * Disable ref updates. This is especially used in contexts where
+ * transactions may still be rolled back so that we don't start to
+ * reference objects that may vanish.
+ */
+ bool disable_ref_updates;
+
+ /*
* A strmap of ref_stores, stored by submodule name, accessible via
* `repo_get_submodule_ref_store()`.
*/
@@ -187,7 +194,7 @@ struct set_gitdir_args {
const char *graft_file;
const char *index_file;
const char *alternate_db;
- int disable_ref_updates;
+ bool disable_ref_updates;
};
void repo_set_gitdir(struct repository *repo, const char *root,
diff --git a/setup.c b/setup.c
index 8bf52df716..a752e9fc84 100644
--- a/setup.c
+++ b/setup.c
@@ -1682,7 +1682,7 @@ void setup_git_env(const char *git_dir)
args.index_file = getenv_safe(&to_free, INDEX_ENVIRONMENT);
args.alternate_db = getenv_safe(&to_free, ALTERNATE_DB_ENVIRONMENT);
if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
- args.disable_ref_updates = 1;
+ args.disable_ref_updates = true;
}
repo_set_gitdir(the_repository, git_dir, &args);