summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--exec.c19
-rwxr-xr-xtests.sh10
-rw-r--r--tests/test_ok_plus_semicolon.out19
-rw-r--r--tests/test_okdir_plus_semicolon.out19
4 files changed, 58 insertions, 9 deletions
diff --git a/exec.c b/exec.c
index 250bba7..42deccf 100644
--- a/exec.c
+++ b/exec.c
@@ -127,21 +127,22 @@ struct bfs_exec *parse_bfs_exec(char **argv, enum bfs_exec_flags flags, const st
for (i = 1; ; ++i) {
const char *arg = argv[i];
if (!arg) {
- cfprintf(cerr, "%{er}error: %s: Expected ';' or '+'.%{rs}\n", argv[0]);
+ if (execbuf->flags & BFS_EXEC_CONFIRM) {
+ cfprintf(cerr, "%{er}error: %s: Expected '... ;'.%{rs}\n", argv[0]);
+ } else {
+ cfprintf(cerr, "%{er}error: %s: Expected '... ;' or '... {} +'.%{rs}\n", argv[0]);
+ }
goto fail;
} else if (strcmp(arg, ";") == 0) {
break;
- } else if (strcmp(arg, "+") == 0 && strcmp(argv[i - 1], "{}") == 0) {
- execbuf->flags |= BFS_EXEC_MULTI;
- break;
+ } else if (strcmp(arg, "+") == 0) {
+ if (!(execbuf->flags & BFS_EXEC_CONFIRM) && strcmp(argv[i - 1], "{}") == 0) {
+ execbuf->flags |= BFS_EXEC_MULTI;
+ break;
+ }
}
}
- if ((execbuf->flags & BFS_EXEC_CONFIRM) && (execbuf->flags & BFS_EXEC_MULTI)) {
- cfprintf(cerr, "%{er}error: %s ... + is not supported.%{rs}\n", argv[0]);
- goto fail;
- }
-
execbuf->tmpl_argv = argv + 1;
execbuf->tmpl_argc = i - 1;
diff --git a/tests.sh b/tests.sh
index 3da8d5e..cf9e1a3 100755
--- a/tests.sh
+++ b/tests.sh
@@ -198,6 +198,7 @@ posix_tests=(
test_perm_leading_plus_symbolic_minus
test_permcopy
test_ok_stdin
+ test_ok_plus_semicolon
test_parens
test_bang
test_implicit_and
@@ -307,6 +308,7 @@ gnu_tests=(
test_execdir_slash
test_execdir_slash_pwd
test_execdir_slashes
+ test_okdir_plus_semicolon
test_weird_names
test_flag_weird_names
test_follow_comma
@@ -967,6 +969,14 @@ function test_okdir_stdin() {
yes | bfs_diff basic -okdir bash -c "printf '%s? ' {} && head -n1" \; 2>/dev/null
}
+function test_ok_plus_semicolon() {
+ yes | bfs_diff basic -ok echo '{}' + \; 2>/dev/null
+}
+
+function test_okdir_plus_semicolon() {
+ yes | bfs_diff basic -okdir echo '{}' + \; 2>/dev/null
+}
+
function test_delete() {
rm -rf scratch/*
touchp scratch/foo/bar/baz
diff --git a/tests/test_ok_plus_semicolon.out b/tests/test_ok_plus_semicolon.out
new file mode 100644
index 0000000..85d27e5
--- /dev/null
+++ b/tests/test_ok_plus_semicolon.out
@@ -0,0 +1,19 @@
+basic +
+basic/a +
+basic/b +
+basic/c +
+basic/e +
+basic/g +
+basic/i +
+basic/j +
+basic/k +
+basic/l +
+basic/c/d +
+basic/e/f +
+basic/g/h +
+basic/j/foo +
+basic/k/foo +
+basic/l/foo +
+basic/k/foo/bar +
+basic/l/foo/bar +
+basic/l/foo/bar/baz +
diff --git a/tests/test_okdir_plus_semicolon.out b/tests/test_okdir_plus_semicolon.out
new file mode 100644
index 0000000..1909d27
--- /dev/null
+++ b/tests/test_okdir_plus_semicolon.out
@@ -0,0 +1,19 @@
+./a +
+./b +
+./bar +
+./bar +
+./basic +
+./baz +
+./c +
+./d +
+./e +
+./f +
+./foo +
+./foo +
+./foo +
+./g +
+./h +
+./i +
+./j +
+./k +
+./l +