tags 336343 + patch
thanks

* Alexander Tait Brotman <[EMAIL PROTECTED]> [2005-10-29 11:31]:
> When attempting to use jack, the command line option parsing seems to be
> broken, and perhaps inconsistent.
> 
> jack -Q --encoder-name "lame" -t 3 --rename-fmt "%a-%l-%n-%t"
> --unusable-chars " " --replacement-chars "_"
> 
> In the first example, the program will replace the " " with "%" when
> renaming.  You can get it to work by using --replacement-chars="_", but
> the man page doesn't say to do this.

Actually, jack is correct and this is a user error.  However, jack can
do better.  The man page gives an example of a proper command line -
even tough I see that the example is not rendered properly because of
a syntax error (I'll fix this).  Anyway, the correct example is:

   jack -Q --rename-fmt "%n-%t" --unusable-chars A I \; --replacement-chars a i 
\;

In other words, you have to stop lists with a ';' sign, and since
shells will interpret ';' to separate commands, you have to escape it.

In your example the ; is missing, so the --replacement-chars "_" is
simply seen as an argument to --unusable-chars...

> --unusable-chars " " --replacement-chars "_" --save
> In the second, the program will not save my preferences.  If
> I put the --save earlier in the command, then it does work.

That's because --save is interpreted as another argument of the list
given to --unusable-chars.

Anyway, I agree this list stuff is not intuitive and that jack can do
better.  In particular, jack could recognize when a valid option is
given as part of a list and then simply stop and take that option as
the next one.  This effectively means that the ; is no longer
necessary to signal the end of a list, although it's still supported.

Arne, what do you think?  I think this has no negative side-effects at
all and will really improve usability.


--- jack_argv.py~       2005-11-01 19:30:34.000000000 +0000
+++ jack_argv.py        2005-11-01 19:41:11.000000000 +0000
@@ -117,11 +117,23 @@
     if ty == types.ListType:
         l = []
         if origin == "argv":
+            valid_short_opts = [cf[key]['short'] for key in cf.keys() if 
cf[key].has_key('short')]
+            valid_long_opts = [cf[key]['long'] for key in cf.keys() if 
cf[key].has_key('long')]
             while 1:
                 i, data = get_next(argv, i, alt_arg, 0)
                 if data != None:
                     if data == ";":
                         break
+                    # The end of a list has to be signaled with a semicolon but
+                    # many users forget this; therefore, check whether the 
next list
+                    # entry is a valid option, and if so, assume the end of 
the list
+                    # has been reached.
+                    if data.startswith("--") and data[2:].split('=', 1)[0] in 
valid_long_opts:
+                        i -= 1
+                        break
+                    if data.startswith("-") and len(data) == 2 and data[1] in 
valid_short_opts:
+                        i -= 1
+                        break
                     l.append(data)
                     if alt_arg: # only one option in --opt=val form
                         break

-- 
Martin Michlmayr
http://www.cyrius.com/


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to