From: Andre Noll <maan@tuebingen.mpg.de>
Date: Wed, 26 Aug 2015 20:24:02 +0000 (+0200)
Subject: Introduce new syntax for com_ls().
X-Git-Tag: v0.5.5~1^2
X-Git-Url: https://git.tue.mpg.de/?a=commitdiff_plain;h=fdb03951ee708a42795d4abb36d3a8637c478975;p=paraslash.git

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.
---

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.