0
0
mirror of https://github.com/mpv-player/mpv.git synced 2024-09-20 12:02:23 +02:00

m_config: avoid accidentally causing deprecation warnings

It has to copy each option, whether it's deprecated or not. This would
print a warning on every deprecated sub-option, even if it's not used.
Yep, this is very stupid.

At least m_config_get_co() gets actually slightly cleaner, because it
separates the search and the deprecation handling.
This commit is contained in:
wm4 2016-09-05 21:15:56 +02:00
parent 1d9032f011
commit c4e01cc00d

View File

@ -80,6 +80,9 @@ struct m_opt_backup {
void *backup; void *backup;
}; };
static struct m_config_option *m_config_get_co_raw(const struct m_config *config,
struct bstr name);
static int parse_include(struct m_config *config, struct bstr param, bool set, static int parse_include(struct m_config *config, struct bstr param, bool set,
int flags) int flags)
{ {
@ -319,7 +322,7 @@ struct m_config *m_config_from_obj_desc_and_args(void *ta_parent,
struct m_config_option *co = &config->opts[n]; struct m_config_option *co = &config->opts[n];
char opt[100]; char opt[100];
snprintf(opt, sizeof(opt), "%s-%s", desc->legacy_prefix, co->name); snprintf(opt, sizeof(opt), "%s-%s", desc->legacy_prefix, co->name);
struct m_config_option *g = m_config_get_co(root, bstr0(opt)); struct m_config_option *g = m_config_get_co_raw(root, bstr0(opt));
assert(g); assert(g);
m_option_copy(co->opt, co->data, g->data); m_option_copy(co->opt, co->data, g->data);
} }
@ -539,8 +542,8 @@ static void m_config_add_option(struct m_config *config,
MP_TARRAY_APPEND(config, config->opts, config->num_opts, co); MP_TARRAY_APPEND(config, config->opts, config->num_opts, co);
} }
struct m_config_option *m_config_get_co(const struct m_config *config, static struct m_config_option *m_config_get_co_raw(const struct m_config *config,
struct bstr name) struct bstr name)
{ {
if (!name.len) if (!name.len)
return NULL; return NULL;
@ -548,54 +551,62 @@ struct m_config_option *m_config_get_co(const struct m_config *config,
for (int n = 0; n < config->num_opts; n++) { for (int n = 0; n < config->num_opts; n++) {
struct m_config_option *co = &config->opts[n]; struct m_config_option *co = &config->opts[n];
struct bstr coname = bstr0(co->name); struct bstr coname = bstr0(co->name);
bool matches = false;
if ((co->opt->type->flags & M_OPT_TYPE_ALLOW_WILDCARD) if ((co->opt->type->flags & M_OPT_TYPE_ALLOW_WILDCARD)
&& bstr_endswith0(coname, "*")) { && bstr_endswith0(coname, "*")) {
coname.len--; coname.len--;
if (bstrcmp(bstr_splice(name, 0, coname.len), coname) == 0) if (bstrcmp(bstr_splice(name, 0, coname.len), coname) == 0)
matches = true; return co;
} else if (bstrcmp(coname, name) == 0) } else if (bstrcmp(coname, name) == 0) {
matches = true;
if (matches) {
const char *prefix = config->is_toplevel ? "--" : "";
if (co->opt->type == &m_option_type_alias) {
const char *alias = (const char *)co->opt->priv;
// deprecation_message is not used, but decides whether it's a
// proper or deprecated alias.
if (co->opt->deprecation_message && !co->warning_was_printed) {
MP_WARN(config, "Warning: option %s%s was replaced with "
"%s%s and might be removed in the future.\n",
prefix, co->name, prefix, alias);
co->warning_was_printed = true;
}
return m_config_get_co(config, bstr0(alias));
} else if (co->opt->type == &m_option_type_removed) {
if (!co->warning_was_printed) {
char *msg = co->opt->priv;
if (msg) {
MP_FATAL(config, "Option %s%s was removed: %s\n",
prefix, co->name, msg);
} else {
MP_FATAL(config, "Option %s%s was removed.\n",
prefix, co->name);
}
co->warning_was_printed = true;
}
return NULL;
} else if (co->opt->deprecation_message) {
if (!co->warning_was_printed) {
MP_WARN(config, "Warning: option %s%s is deprecated "
"and might be removed in the future (%s).\n",
prefix, co->name, co->opt->deprecation_message);
co->warning_was_printed = true;
}
}
return co; return co;
} }
} }
return NULL; return NULL;
} }
struct m_config_option *m_config_get_co(const struct m_config *config,
struct bstr name)
{
struct m_config_option *co = m_config_get_co_raw(config, name);
if (!co)
return NULL;
const char *prefix = config->is_toplevel ? "--" : "";
if (co->opt->type == &m_option_type_alias) {
const char *alias = (const char *)co->opt->priv;
// deprecation_message is not used, but decides whether it's a
// proper or deprecated alias.
if (co->opt->deprecation_message && !co->warning_was_printed) {
MP_WARN(config, "Warning: option %s%s was replaced with "
"%s%s and might be removed in the future.\n",
prefix, co->name, prefix, alias);
co->warning_was_printed = true;
}
return m_config_get_co(config, bstr0(alias));
} else if (co->opt->type == &m_option_type_removed) {
if (!co->warning_was_printed) {
char *msg = co->opt->priv;
if (msg) {
MP_FATAL(config, "Option %s%s was removed: %s\n",
prefix, co->name, msg);
} else {
MP_FATAL(config, "Option %s%s was removed.\n",
prefix, co->name);
}
co->warning_was_printed = true;
}
return NULL;
} else if (co->opt->deprecation_message) {
if (!co->warning_was_printed) {
MP_WARN(config, "Warning: option %s%s is deprecated "
"and might be removed in the future (%s).\n",
prefix, co->name, co->opt->deprecation_message);
co->warning_was_printed = true;
}
}
return co;
}
int m_config_get_co_count(struct m_config *config) int m_config_get_co_count(struct m_config *config)
{ {
return config->num_opts; return config->num_opts;