summaryrefslogtreecommitdiffstats
path: root/options/parse_commandline.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2020-01-07 23:08:45 +0100
committerwm4 <wm4@nowhere>2020-01-07 23:08:45 +0100
commitd3cef97ad38fb027262a905bd82e1d3d2549aec7 (patch)
tree200c7c376af503ee826a50a8b812d1f0aceb316a /options/parse_commandline.c
parent5b56be0e91a78565d51e69ef0df625f52c140820 (diff)
downloadmpv-d3cef97ad38fb027262a905bd82e1d3d2549aec7.tar.bz2
mpv-d3cef97ad38fb027262a905bd82e1d3d2549aec7.tar.xz
options: change option parsing when using a single dash
Addresses dumb things like accidentally overwriting a media file with e.g. "mpv --log-file test.mkv" (when the user thought that --log-file was a flag option, when it actually takes a filename). This example will now print an error. It still works with "-log-file overwritten.mkv", but prints a warning. Not sure if I'm being too careful or not "radical" enough. In any case, both the syntax that stops working and the syntax that produces a warning now have been discouraged and were called legacy for almost a decade.
Diffstat (limited to 'options/parse_commandline.c')
-rw-r--r--options/parse_commandline.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/options/parse_commandline.c b/options/parse_commandline.c
index e89239c33b..f5ff330230 100644
--- a/options/parse_commandline.c
+++ b/options/parse_commandline.c
@@ -40,6 +40,7 @@
struct parse_state {
struct m_config *config;
char **argv;
+ struct mp_log *log; // silent if NULL
bool no_more_opts;
bool error;
@@ -52,6 +53,7 @@ struct parse_state {
// Returns 0 if a valid option/file is available, <0 on error, 1 on end of args.
static int split_opt_silent(struct parse_state *p)
{
+ struct mp_log *log = p->log ? p->log : mp_null_log;
assert(!p->error);
if (!p->argv || !p->argv[0])
@@ -73,7 +75,8 @@ static int split_opt_silent(struct parse_state *p)
p->is_opt = true;
- if (!bstr_eatstart0(&p->arg, "--"))
+ bool new_opt = bstr_eatstart0(&p->arg, "--");
+ if (!new_opt)
bstr_eatstart0(&p->arg, "-");
bool ambiguous = !bstr_split_tok(p->arg, "=", &p->arg, &p->param);
@@ -81,10 +84,13 @@ static int split_opt_silent(struct parse_state *p)
bool need_param = m_config_option_requires_param(p->config, p->arg) > 0;
if (ambiguous && need_param) {
- if (!p->argv[0])
+ if (!p->argv[0] || new_opt)
return M_OPT_MISSING_PARAM;
p->param = bstr0(p->argv[0]);
p->argv++;
+ mp_warn(log, "The legacy option syntax ('-%.*s value') is deprecated "
+ "and dangerous.\nPlease use '--%.*s=value'.\n",
+ BSTR_P(p->arg), BSTR_P(p->arg));
}
return 0;
@@ -140,7 +146,7 @@ int m_config_parse_mp_command_line(m_config_t *config, struct playlist *files,
mode = GLOBAL;
- struct parse_state p = {config, argv};
+ struct parse_state p = {config, argv, config->log};
while (split_opt(&p)) {
if (p.is_opt) {
int flags = M_SETOPT_FROM_CMDLINE;