Junio C Hamano [off-list ref] writes:
An alternative may be to grandfather some extensions that were
enabled by git by mistake without updating the format version, and
we update the repository even if the repository has extensions that
should not exist, but those offending extensions are limited only to
those that we decide to special case. That would make the end-user
experience even smoother.
Is extenions.worktreeCOnfig the only one that needs this escape
hatch?
Assuming that worktreeconfig is the only thing, the change may look
like this. With this change, we might want to drop the new warning
in hunk ll.542- to avoid encouraging people to muck with their
repository with random configuration variables that happen to share
extensions.* prefix with us.
cache.h | 2 +-
setup.c | 17 +++++++++++++----
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/cache.h b/cache.h
index e5885cc9ea..8ff46857f6 100644
--- a/cache.h
+++ b/cache.h
@@ -1042,8 +1042,8 @@ struct repository_format {
int worktree_config;
int is_bare;
int hash_algo;
- int has_extensions;
char *work_tree;
+ int has_unallowed_extensions;
struct string_list unknown_extensions;
};
diff --git a/setup.c b/setup.c
index eb066db6d8..5f4786d3b9 100644
--- a/setup.c
+++ b/setup.c
@@ -455,12 +455,13 @@ static int check_repo_format(const char *var, const char *value, void *vdata)
if (strcmp(var, "core.repositoryformatversion") == 0)
data->version = git_config_int(var, value);
else if (skip_prefix(var, "extensions.", &ext)) {
- data->has_extensions = 1;
/*
* record any known extensions here; otherwise,
* we fall through to recording it as unknown, and
* check_repository_format will complain
*/
+ int is_unallowed_extension = 1;
+
if (!strcmp(ext, "noop"))
;
else if (!strcmp(ext, "preciousobjects"))@@ -469,10 +470,13 @@ static int check_repo_format(const char *var, const char *value, void *vdata)
if (!value)
return config_error_nonbool(var);
data->partial_clone = xstrdup(value);
- } else if (!strcmp(ext, "worktreeconfig"))
+ } else if (!strcmp(ext, "worktreeconfig")) {
data->worktree_config = git_config_bool(var, value);
- else
+ is_unallowed_extension = 0;
+ } else
string_list_append(&data->unknown_extensions, ext);
+
+ data->has_unallowed_extensions |= is_unallowed_extension;
}
return read_worktree_config(var, value, vdata);@@ -542,6 +546,11 @@ static int check_repository_format_gently(const char *gitdir, struct repository_
}
}
+ if (candidate->version == 0 && candidate->has_unallowed_extensions) {
+ warning(_("some extensions are enabled, but core.repositoryFormatVersion=0"));
+ warning(_("if you intended to use extensions, run 'git config core.repositoryFormatVersion 1'"));
+ }
+
return 0;
}
@@ -560,7 +569,7 @@ int upgrade_repository_format(int target_version)
return 0;
if (verify_repository_format(&repo_fmt, &err) < 0 ||
- (!repo_fmt.version && repo_fmt.has_extensions)) {
+ (!repo_fmt.version && repo_fmt.has_unallowed_extensions)) {
warning("unable to upgrade repository format from %d to %d: %s",
repo_fmt.version, target_version, err.buf);
strbuf_release(&err);