summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--it.class6
-rwxr-xr-xtests/exec.t52
2 files changed, 56 insertions, 2 deletions
diff --git a/it.class b/it.class
index 14cd8a2..0c6d4a6 100644
--- a/it.class
+++ b/it.class
@@ -550,15 +550,17 @@ static function shell_command(/* $cmd, $values1 = array(), ... */)
#for escapeshellarg in it::_exec_quotevalue
$oldlocale = setlocale(LC_CTYPE, 0);
setlocale(LC_CTYPE, 'de_CH');
- foreach (it::match('({(-?)([a-z0-9]\w*)})', $cmd, array('all' => true)) as $tags)
+ foreach (it::match('({(-?-?)([a-z0-9]\w*)})', $cmd, array('all' => true)) as $tags)
{
list($tag, $option, $key) = $tags;
$parts = array();
if ($option)
{
- foreach ((array)$values["-$key"] as $key => $value)
+ foreach ((array)$values[$option . $key] as $key => $value)
{
+ if ($option == '--')
+ $key = ($key[1] ? '--' : '-') . $key;
if ($value === true || $value === false || $value === null)
$parts[] = $value ? $key : "";
else foreach ((array)$value as $val)
diff --git a/tests/exec.t b/tests/exec.t
index 6418716..4702681 100755
--- a/tests/exec.t
+++ b/tests/exec.t
@@ -10,6 +10,58 @@ is(it::shell_command("echo {arg}", array('arg' => 'gna07,-:blah')), "echo gna07,
is(it::shell_command("echo {arg}", array('arg' => '2>&1')), "echo '2>&1'", "quote arguments with dangerous characters");
is(it::shell_command("echo {arg}", array('arg' => '')), "echo ''", "quote empty arguments");
+
+is(
+ it::shell_command("echo {-opts}", array('-opts' => array('--longopt' => true))),
+ "echo --longopt",
+ "options argument with long option"
+);
+is(
+ it::shell_command("echo {-opts}", array('-opts' => array('-onedash' => true))),
+ "echo -onedash",
+ "... with long option but only one dash"
+);
+is(
+ it::shell_command("echo {-opts}", array('-opts' => array('-s' => true))),
+ "echo -s",
+ "... with short option"
+);
+is(
+ it::shell_command("echo {-opts}", array('-opts' => array('--longopt' => 'val'))),
+ "echo --longopt val",
+ "... with long option with value"
+);
+is(
+ it::shell_command("echo {-opts}", array('-opts' => array('-onedash' => 'val'))),
+ "echo -onedash val",
+ "... with long option but only one dash and with value"
+);
+is(
+ it::shell_command("echo {-opts}", array('-opts' => array('-s' => 'val'))),
+ "echo -s val",
+ "... with short option with value"
+);
+is(
+ it::shell_command("echo {-opts}", array('-opts' => array('--longopt' => false))),
+ "echo ",
+ "... with disabled long option"
+);
+is(
+ it::shell_command("echo {-opts}", array('-opts' => array('-s' => false))),
+ "echo ",
+ "... with disabled short option"
+);
+is(
+ it::shell_command("echo {--opts}", array('--opts' => array('longopt' => true))),
+ "echo --longopt",
+ "... long option without dashes for --opts"
+);
+is(
+ it::shell_command("echo {--opts}", array('--opts' => array('s' => true))),
+ "echo -s",
+ "... short option without dashes for --opts"
+);
+
foreach (array("", "C", "de_CH", "de_CH.utf8") as $locale) {
setlocale(LC_ALL, $locale);
$arg = "preĆ¼post";