Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> --- cache.h | 9 +++++++++ environment.c | 4 ++++ external-odb.c | 6 ++++++ sha1_file.c | 3 +++ 4 files changed, 22 insertions(+) diff --git a/cache.h b/cache.h index b419b9b7ce..503b618a1f 100644 --- a/cache.h +++ b/cache.h @@ -422,6 +422,7 @@ static inline enum object_type object_type(unsigned int mode) #define CEILING_DIRECTORIES_ENVIRONMENT "GIT_CEILING_DIRECTORIES" #define NO_REPLACE_OBJECTS_ENVIRONMENT "GIT_NO_REPLACE_OBJECTS" #define GIT_REPLACE_REF_BASE_ENVIRONMENT "GIT_REPLACE_REF_BASE" +#define NO_EXTERNAL_ODB_ENVIRONMENT "GIT_NO_EXTERNAL_ODB" #define GITATTRIBUTES_FILE ".gitattributes" #define INFOATTRIBUTES_FILE "info/attributes" #define ATTRIBUTE_MACRO_PREFIX "[attr]" @@ -698,6 +699,14 @@ void reset_shared_repository(void); extern int check_replace_refs; extern char *git_replace_ref_base; +/* + * Do external odbs need to be used this run? This variable is + * initialized to true unless $GIT_NO_EXTERNAL_ODB is set, but it + * maybe set to false by some commands that do not want external + * odbs to be active. + */ +extern int use_external_odb; + extern int fsync_object_files; extern int core_preload_index; extern int core_apply_sparse_checkout; diff --git a/environment.c b/environment.c index 0935ec696e..8aecdd0544 100644 --- a/environment.c +++ b/environment.c @@ -47,6 +47,7 @@ const char *excludes_file; enum auto_crlf auto_crlf = AUTO_CRLF_FALSE; int check_replace_refs = 1; char *git_replace_ref_base; +int use_external_odb = 1; enum eol core_eol = EOL_UNSET; enum safe_crlf safe_crlf = SAFE_CRLF_WARN; unsigned whitespace_rule_cfg = WS_DEFAULT_RULE; @@ -120,6 +121,7 @@ const char * const local_repo_env[] = { INDEX_ENVIRONMENT, NO_REPLACE_OBJECTS_ENVIRONMENT, GIT_REPLACE_REF_BASE_ENVIRONMENT, + NO_EXTERNAL_ODB_ENVIRONMENT, GIT_PREFIX_ENVIRONMENT, GIT_SUPER_PREFIX_ENVIRONMENT, GIT_SHALLOW_FILE_ENVIRONMENT, @@ -185,6 +187,8 @@ static void setup_git_env(void) replace_ref_base = getenv(GIT_REPLACE_REF_BASE_ENVIRONMENT); git_replace_ref_base = xstrdup(replace_ref_base ? replace_ref_base : "refs/replace/"); + if (getenv(NO_EXTERNAL_ODB_ENVIRONMENT)) + use_external_odb = 0; namespace = expand_namespace(getenv(GIT_NAMESPACE_ENVIRONMENT)); namespace_len = strlen(namespace); shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT); diff --git a/external-odb.c b/external-odb.c index 6dd7b2548b..a980fbfbf2 100644 --- a/external-odb.c +++ b/external-odb.c @@ -63,6 +63,9 @@ int external_odb_has_object(const unsigned char *sha1) { struct odb_helper *o; + if (!use_external_odb) + return 0; + external_odb_init(); for (o = helpers; o; o = o->next) @@ -133,6 +136,9 @@ int external_odb_write_object(const void *buf, unsigned long len, { struct odb_helper *o; + if (!use_external_odb) + return 1; + /* For now accept only blobs */ if (strcmp(type, "blob")) return 1; diff --git a/sha1_file.c b/sha1_file.c index 3532c1c598..92f1244205 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -556,6 +556,9 @@ void prepare_external_alt_odb(void) static int linked_external; const char *path; + if (!use_external_odb) + return; + if (linked_external) return; -- 2.11.0.rc2.37.geb49ca6