From fdb03951ee708a42795d4abb36d3a8637c478975 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Wed, 26 Aug 2015 22:24:02 +0200 Subject: [PATCH 1/1] Introduce new syntax for com_ls(). The ls command is the only command that takes one-letter arguments which immediately follow the option. For example, -lv activates verbose listing mode. If we ever want to support short option combining (like in rm -rf) for paraslash commands, the one-letter arguments are problematic because, in the above example, -lv can also be interpreted as -l -v. This commit encourages a different syntax for the -l and -s options of the ls command while keeping the one-letter options working for backwards compatibility. The new official way to enable verbose listing mode is -l=v. This is analogous to how the "stat" and "touch" commands expect their arguments. The ls completer and the documentation are also updated according to the new syntax. --- afs.cmd | 44 +++++++++++++++++++++++--------------------- aft.c | 30 ++++++++++++++++++++---------- client.c | 6 +++--- web/manual.m4 | 2 +- 4 files changed, 47 insertions(+), 35 deletions(-) diff --git a/afs.cmd b/afs.cmd index 9d87d18c..fb496aa5 100644 --- a/afs.cmd +++ b/afs.cmd @@ -36,19 +36,20 @@ H: only the tables given by table_name... are created. N: ls P: AFS_READ D: List audio files. -U: ls [-l[s|l|v|m]] [-p] [-a] [-r] [-d] [-s{p|s|l|n|f|c|i|y|b|d|a}] [pattern...] +U: ls [-l=mode] [-p] [-a] [-r] [-d] [-s=order] [pattern...] H: Print a list of all audio files matching pattern. H: H: Options: H: -H: -l Change listing mode. Defaults to short listing if not given. +H: -l=mode Change listing mode. Defaults to short listing if not given. H: -H: -ls: short listing mode -H: -ll: long listing mode (equivalent to -l) -H: -lv: verbose listing mode -H: -lp: parser-friendly mode -H: -lm: mbox listing mode -H: -lc: chunk-table listing mode +H: Available modes: +H: s: short listing mode +H: l: long listing mode (equivalent to -l) +H: v: verbose listing mode +H: p: parser-friendly mode +H: m: mbox listing mode +H: c: chunk-table listing mode H: H: -p List full paths. If this option is not specified, only the basename H: of each file is printed. @@ -60,19 +61,20 @@ H: -r Reverse sort order. H: H: -d Print dates as seconds after the epoch. H: -H: -s Change sort order. Defaults to alphabetical path sort if not given. -H: -H: -sp: by path -H: -sl: by last played time -H: -ss: by score (implies -a) -H: -sn: by num played count -H: -sf: by frequency -H: -sc: by number of channels -H: -si: by image id -H: -sy: by lyrics id -H: -sb: by bit rate -H: -sd: by duration -H: -sa: by audio format +H: -s=order Change sort order. Defaults to alphabetical path sort if not given. +H: +H: Possible values for order: +H: p: by path +H: l: by last played time +H: s: by score (implies -a) +H: n: by num played count +H: f: by frequency +H: c: by number of channels +H: i: by image id +H: y: by lyrics id +H: b: by bit rate +H: d: by duration +H: a: by audio format --- N: lsatt P: AFS_READ diff --git a/aft.c b/aft.c index c4558f20..cfb1f697 100644 --- a/aft.c +++ b/aft.c @@ -1439,18 +1439,26 @@ int com_ls(struct command_context *cc) i++; break; } + /* + * Compatibility: Prior to 0.5.5 it was necessary to specify + * the listing mode without the '=' character as in -lv, for + * example. Now the variant with '=' is preferred and + * documented but we still accept the old way to specify the + * listing mode. + * + * Support for the legacy syntax can be dropped at 0.6.0 + * or later. + */ if (!strncmp(arg, "-l", 2)) { - if (!*(arg + 2)) { - mode = LS_MODE_LONG; - continue; - } - if (*(arg + 3)) - return -E_AFT_SYNTAX; - switch(*(arg + 2)) { + arg += 2; + if (*arg == '=') + arg++; + switch (*arg) { case 's': mode = LS_MODE_SHORT; continue; case 'l': + case '\0': mode = LS_MODE_LONG; continue; case 'v': @@ -1485,10 +1493,12 @@ int com_ls(struct command_context *cc) flags |= LS_FLAG_UNIXDATE; continue; } + /* The compatibility remark above applies also to -s. */ if (!strncmp(arg, "-s", 2)) { - if (!*(arg + 2) || *(arg + 3)) - return -E_AFT_SYNTAX; - switch(*(arg + 2)) { + arg += 2; + if (*arg == '=') + arg++; + switch (*arg) { case 'p': sort = LS_SORT_BY_PATH; continue; diff --git a/client.c b/client.c index f3bb92f8..35b49a16 100644 --- a/client.c +++ b/client.c @@ -270,9 +270,9 @@ static void ls_completer(struct i9e_completion_info *ci, struct i9e_completion_result *cr) { char *opts[] = { - "--", "-l", "-ls", "-ll", "-lv", "-lp", "-lm", "-lc", "-p", - "-a", "-r", "-d", "-sp", "-sl", "-ss", "-sn", "-sf", "-sc", - "-si", "-sy", "-sb", "-sd", "-sa", NULL + "--", "-l", "-l=s", "-l=l", "-l=v", "-l=p", "-l=m", "-l=c", + "-p", "-a", "-r", "-d", "-s=p", "-s=l", "-s=s", "-s=n", "-s=f", + "-s=c", "-s=i", "-s=y", "-s=b", "-s=d", "-s=a", NULL }; if (ci->word[0] == '-') i9e_complete_option(opts, ci, cr); diff --git a/web/manual.m4 b/web/manual.m4 index d0fe28e0..8c00c99b 100644 --- a/web/manual.m4 +++ b/web/manual.m4 @@ -751,7 +751,7 @@ is applied to all audio files matching this pattern: The command - para_client -- ls -lv + para_client -- ls -l=v gives you a verbose listing of your audio files also showing which attributes are set. -- 2.39.2