Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57570
Signed-off-by: Eric Pouech epouech@codeweavers.com
-- v3: programs/cmd: Don't return syntax error code on empty lines. programs/cmd: Fix some CALL errorlevel propagation. programs/cmd: Skip trailing white spaces in FOR's option. programs/cmd: Add more tests.
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/tests/test_builtins.bat | 35 ++++++++++++++++++++++-- programs/cmd/tests/test_builtins.bat.exp | 10 +++++++ programs/cmd/tests/test_builtins.cmd | 35 ++++++++++++++++++++++-- programs/cmd/tests/test_builtins.cmd.exp | 12 ++++++++ 4 files changed, 86 insertions(+), 6 deletions(-)
diff --git a/programs/cmd/tests/test_builtins.bat b/programs/cmd/tests/test_builtins.bat index a95c94c5ad8..728a0e4eafc 100644 --- a/programs/cmd/tests/test_builtins.bat +++ b/programs/cmd/tests/test_builtins.bat @@ -35,12 +35,41 @@ rem call :setError 666 & (foobar.IDontExist &&echo SUCCESS !errorlevel!||echo FA cd .. && rd /q /s foo echo --- success/failure for CALL command mkdir foo & cd foo -echo exit /b %%1 > foobar.bat +rem generating different condition of child.bat termination (success/failure, errorlevel set or not...) +echo exit /b %%1 > foobarEB.bat +echo type NUL > foobarS0.bat +echo rmdir foobar.dir > foobarSEL.bat +echo title foo >> foobarSEL.bat +echo rmdir foobar.dir > foobarF2.bat +echo type NUL > foobarS0WS.bat +echo.>> foobarS0WS.bat +echo goto :EOF > foobarGE.bat +echo goto :end > foobarGL.bat +echo :end >> foobarGL.bat +echo goto :end > foobarGX.bat +echo rmdir foobar.dir > foobarFGE.bat +echo goto :EOF >> foobarFGE.bat +echo rmdir foobar.dir > foobarFGL.bat +echo goto :end >> foobarFGL.bat +echo :end >> foobarFGL.bat +echo rmdir foobar.dir > foobarFGX.bat +echo goto :end >> foobarFGX.bat + rem call :setError 666 & (call I\dont\exist.exe &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) rem terminates batch exec on native... call :setError 666 & (call Idontexist.exe &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -call :setError 666 & (call .\foobar.bat 0 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -call :setError 666 & (call .\foobar.bat 1024 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarEB.bat 0 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarEB.bat 1024 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarS0.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarS0WS.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarSEL.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarF2.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarGE.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarGL.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarGX.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarFGE.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarFGL.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarFGX.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & (call cmd.exe /c "echo foo & exit /b 0" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & (call cmd.exe /c "echo foo & exit /b 1025" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & (call rmdir foobar.dir &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) diff --git a/programs/cmd/tests/test_builtins.bat.exp b/programs/cmd/tests/test_builtins.bat.exp index a2cbe0cecd7..492aace865e 100644 --- a/programs/cmd/tests/test_builtins.bat.exp +++ b/programs/cmd/tests/test_builtins.bat.exp @@ -31,6 +31,16 @@ FAILURE 1 FAILURE 1 SUCCESS 0 FAILURE 1024 +SUCCESS 0 +@todo_wine@SUCCESS 0 +@todo_wine@FAILURE 666 +FAILURE 2 +FAILURE 666 +FAILURE 666 +FAILURE 1 +FAILURE 666 +FAILURE 666 +FAILURE 1 foo@space@ SUCCESS 0 foo@space@ diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index 3e102a7f366..ac4e3195be7 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -499,12 +499,39 @@ rem call :setError 666 & (foobar.IDontExist &&echo SUCCESS !errorlevel!||echo FA cd .. && rd /q /s foo echo --- success/failure for CALL command mkdir foo & cd foo -echo exit /b %%1 > foobar.bat +echo exit /b %%1 > foobarEB.bat +echo type NUL > foobarS0.bat +echo rmdir foobar.dir > foobarSEL.bat +echo title foo >> foobarSEL.bat +echo rmdir foobar.dir > foobarF2.bat +echo type NUL > foobarS0WS.bat +echo.>> foobarS0WS.bat +echo goto :EOF > foobarGE.bat +echo goto :end > foobarGL.bat +echo :end >> foobarGL.bat +echo goto :end > foobarGX.bat +echo rmdir foobar.dir > foobarFGE.bat +echo goto :EOF >> foobarFGE.bat +echo rmdir foobar.dir > foobarFGL.bat +echo goto :end >> foobarFGL.bat +echo :end >> foobarFGL.bat +echo rmdir foobar.dir > foobarFGX.bat +echo goto :end >> foobarFGX.bat rem call :setError 666 & (call I\dont\exist.exe &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) rem terminates batch exec on native... call :setError 666 & (call Idontexist.exe &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -call :setError 666 & (call .\foobar.bat 0 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -call :setError 666 & (call .\foobar.bat 1024 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarEB.bat 0 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarEB.bat 1024 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarS0.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarS0WS.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarSEL.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarF2.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarGE.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarGL.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarGX.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarFGE.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarFGL.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) +call :setError 666 & (call .\foobarFGX.bat &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & (call cmd.exe /c "echo foo & exit /b 0" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & (call cmd.exe /c "echo foo & exit /b 1025" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & (call rmdir foobar.dir &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) @@ -2423,6 +2450,8 @@ echo a > foo echo b >> foo echo c >> foo for /f "skip=2" %%i in (foo) do echo %%i +for /f "skip=2@tab@" %%i in (foo) do echo %%i +echo ---- resync for /f "skip=3" %%i in (foo) do echo %%i > output_file if not exist output_file (echo no output) else (del output_file) for /f "skip=4" %%i in (foo) do echo %%i > output_file diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 4499a3ce678..09eb0d958dc 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -482,6 +482,16 @@ FAILURE 1 FAILURE 1 SUCCESS 0 FAILURE 1024 +SUCCESS 0 +@todo_wine@SUCCESS 0 +@todo_wine@FAILURE 666 +FAILURE 2 +FAILURE 666 +FAILURE 666 +FAILURE 1 +FAILURE 666 +FAILURE 666 +FAILURE 1 foo@space@ SUCCESS 0 foo@space@ @@ -1588,6 +1598,8 @@ foo bar baz c:\ ------ skip option c +@todo_wine@c +---- resync no output no output c
From: Eric Pouech epouech@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57570
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/tests/test_builtins.cmd | 1 - programs/cmd/tests/test_builtins.cmd.exp | 3 +-- programs/cmd/wcmdmain.c | 3 +-- 3 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index ac4e3195be7..8552d51930a 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -2451,7 +2451,6 @@ echo b >> foo echo c >> foo for /f "skip=2" %%i in (foo) do echo %%i for /f "skip=2@tab@" %%i in (foo) do echo %%i -echo ---- resync for /f "skip=3" %%i in (foo) do echo %%i > output_file if not exist output_file (echo no output) else (del output_file) for /f "skip=4" %%i in (foo) do echo %%i > output_file diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 09eb0d958dc..e7cde79523c 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -1598,8 +1598,7 @@ foo bar baz c:\ ------ skip option c -@todo_wine@c ----- resync +c no output no output c diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 1018fd56624..a510459cefa 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -2120,9 +2120,8 @@ static CMD_FOR_CONTROL *for_control_parse(WCHAR *opts_var) p[len - 1] = L'\0'; p++; } - for ( ; *p; p = end) + for ( ; *(p = WCMD_skip_leading_spaces(p)); p = end) { - p = WCMD_skip_leading_spaces(p); /* Save End of line character (Ignore line if first token (based on delims) starts with it) */ if ((end = for_fileset_option_split(p, L"eol="))) {
From: Eric Pouech epouech@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57649
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/batch.c | 4 +++- programs/cmd/tests/test_builtins.bat.exp | 2 +- programs/cmd/tests/test_builtins.cmd.exp | 2 +- programs/cmd/wcmdmain.c | 2 -- 4 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c index 2a19b7105fd..81f1092c921 100644 --- a/programs/cmd/batch.c +++ b/programs/cmd/batch.c @@ -90,7 +90,9 @@ RETURN_CODE WCMD_call_batch(const WCHAR *file, WCHAR *command) free(context); context = prev_context;
- return return_code; + if (return_code != NO_ERROR && return_code != RETURN_CODE_ABORTED) + errorlevel = return_code; + return errorlevel; }
/******************************************************************* diff --git a/programs/cmd/tests/test_builtins.bat.exp b/programs/cmd/tests/test_builtins.bat.exp index 492aace865e..41c21afbb2a 100644 --- a/programs/cmd/tests/test_builtins.bat.exp +++ b/programs/cmd/tests/test_builtins.bat.exp @@ -33,7 +33,7 @@ SUCCESS 0 FAILURE 1024 SUCCESS 0 @todo_wine@SUCCESS 0 -@todo_wine@FAILURE 666 +FAILURE 666 FAILURE 2 FAILURE 666 FAILURE 666 diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index e7cde79523c..c0d37439bd6 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -484,7 +484,7 @@ SUCCESS 0 FAILURE 1024 SUCCESS 0 @todo_wine@SUCCESS 0 -@todo_wine@FAILURE 666 +FAILURE 666 FAILURE 2 FAILURE 666 FAILURE 666 diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index a510459cefa..0b9de9d5f74 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1324,8 +1324,6 @@ static RETURN_CODE run_full_path(const WCHAR *file, WCHAR *full_cmdline, BOOL ca TRACE("Batch completed, but was not 'called' so skipping outer batch too\n"); context->skip_rest = TRUE; } - if (return_code != RETURN_CODE_ABORTED) - errorlevel = return_code; return return_code; }
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/batch.c | 7 +++++-- programs/cmd/tests/test_builtins.bat.exp | 2 +- programs/cmd/tests/test_builtins.cmd.exp | 2 +- programs/cmd/wcmdmain.c | 5 +++++ 4 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c index 81f1092c921..20ae894dbfd 100644 --- a/programs/cmd/batch.c +++ b/programs/cmd/batch.c @@ -38,8 +38,11 @@ static RETURN_CODE WCMD_batch_main_loop(void) context->skip_rest = TRUE; break; case RPL_SUCCESS: - return_code = node_execute(node); - node_dispose_tree(node); + if (node) + { + return_code = node_execute(node); + node_dispose_tree(node); + } break; case RPL_SYNTAXERROR: return_code = RETURN_CODE_SYNTAX_ERROR; diff --git a/programs/cmd/tests/test_builtins.bat.exp b/programs/cmd/tests/test_builtins.bat.exp index 41c21afbb2a..a6b583f78c1 100644 --- a/programs/cmd/tests/test_builtins.bat.exp +++ b/programs/cmd/tests/test_builtins.bat.exp @@ -32,7 +32,7 @@ FAILURE 1 SUCCESS 0 FAILURE 1024 SUCCESS 0 -@todo_wine@SUCCESS 0 +SUCCESS 0 FAILURE 666 FAILURE 2 FAILURE 666 diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index c0d37439bd6..292c24985e8 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -483,7 +483,7 @@ FAILURE 1 SUCCESS 0 FAILURE 1024 SUCCESS 0 -@todo_wine@SUCCESS 0 +SUCCESS 0 FAILURE 666 FAILURE 2 FAILURE 666 diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 0b9de9d5f74..b19f8453438 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -2536,6 +2536,11 @@ static BOOL node_builder_generate(struct node_builder *builder, CMD_NODE **node) } else { + if (!builder->num) /* line without tokens */ + { + *node = NULL; + return TRUE; + } if (node_builder_parse(builder, 0, node) && builder->pos + 1 >= builder->num) /* consumed all tokens? */ return TRUE;
V3 pushed:
* added test case for initial patch * handled another BZ ticket (added relevant tests + fix)