Introduce new syntax for com_ls().
authorAndre Noll <maan@tuebingen.mpg.de>
Wed, 26 Aug 2015 20:24:02 +0000 (22:24 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Tue, 1 Sep 2015 17:15:18 +0000 (19:15 +0200)
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
aft.c
client.c
web/manual.m4

diff --git a/afs.cmd b/afs.cmd
index 9d87d18..fb496aa 100644 (file)
--- 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 c4558f2..cfb1f69 100644 (file)
--- 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;
index f3bb92f..35b49a1 100644 (file)
--- 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);
index d0fe28e..8c00c99 100644 (file)
@@ -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.