Skip to content

Commit 18db522

Browse files
authored
Check for exclamation marks on Windows (#13166)
Closes #13165.
1 parent ba579f1 commit 18db522

File tree

6 files changed

+56
-60
lines changed

6 files changed

+56
-60
lines changed

bin/elixir.bat

Lines changed: 26 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
@if defined ELIXIR_CLI_ECHO (@echo on) else (@echo off)
1+
@echo off
22

33
set ELIXIR_VERSION=1.17.0-dev
44

5-
setlocal enabledelayedexpansion
65
if ""%1""=="""" if ""%2""=="""" goto documentation
76
if /I ""%1""==""--help"" if ""%2""=="""" goto documentation
87
if /I ""%1""==""-h"" if ""%2""=="""" goto documentation
@@ -64,13 +63,11 @@ echo ** Standalone options can't be combined with other options.
6463
goto end
6564

6665
:shortversion
67-
echo !ELIXIR_VERSION!
66+
echo %ELIXIR_VERSION%
6867
goto end
6968

7069
:parseopts
71-
72-
rem Parameters for Elixir
73-
set parsElixir=
70+
setlocal enabledelayedexpansion
7471

7572
rem Parameters for Erlang
7673
set parsErlang=
@@ -97,48 +94,24 @@ if "!par!"=="" (
9794
)
9895
shift
9996
set par="!par:"=\"!"
100-
if !endLoop! == 1 (
101-
set parsElixir=!parsElixir! !par!
102-
goto startloop
103-
)
10497
rem ******* EXECUTION OPTIONS **********************
10598
if !par!=="--werl" (set useWerl=1 && goto startloop)
106-
if !par!=="+iex" (set parsElixir=!parsElixir! +iex && set useIEx=1 && goto startloop)
107-
if !par!=="+elixirc" (set parsElixir=!parsElixir! +elixirc && goto startloop)
108-
rem ******* EVAL PARAMETERS ************************
109-
if ""==!par:-e=! (
110-
set "VAR=%~1"
111-
if not defined VAR (set VAR= )
112-
set parsElixir=!parsElixir! -e "!VAR:"=\"!"
113-
shift
114-
goto startloop
115-
)
116-
if ""==!par:--eval=! (
117-
set "VAR=%~1"
118-
if not defined VAR (set VAR= )
119-
set parsElixir=!parsElixir! --eval "!VAR:"=\"!"
120-
shift
121-
goto startloop
122-
)
123-
if ""==!par:--rpc-eval=! (
124-
set "VAR=%~2"
125-
if not defined VAR (set VAR= )
126-
set parsElixir=!parsElixir! --rpc-eval %1 "!VAR:"=\"!"
127-
shift
128-
shift
129-
goto startloop
130-
)
99+
if !par!=="+iex" (set useIEx=1 && goto startloop)
100+
if !par!=="+elixirc" (goto startloop)
131101
rem ******* ELIXIR PARAMETERS **********************
132-
if ""==!par:-r=! (set "parsElixir=!parsElixir! -r "%~1"" && shift && goto startloop)
133-
if ""==!par:-pr=! (set "parsElixir=!parsElixir! -pr "%~1"" && shift && goto startloop)
134-
if ""==!par:-pa=! (set "parsElixir=!parsElixir! -pa "%~1"" && shift && goto startloop)
135-
if ""==!par:-pz=! (set "parsElixir=!parsElixir! -pz "%~1"" && shift && goto startloop)
136-
if ""==!par:-v=! (set "parsElixir=!parsElixir! -v" && goto startloop)
137-
if ""==!par:--version=! (set "parsElixir=!parsElixir! --version" && goto startloop)
138-
if ""==!par:--no-halt=! (set "parsElixir=!parsElixir! --no-halt" && goto startloop)
139-
if ""==!par:--remsh=! (set "parsElixir=!parsElixir! --remsh "%~1"" && shift && goto startloop)
140-
if ""==!par:--dot-iex=! (set "parsElixir=!parsElixir! --dot-iex "%~1"" && shift && goto startloop)
141-
if ""==!par:--dbg=! (set "parsElixir=!parsElixir! --dbg "%~1"" && shift && goto startloop)
102+
if ""==!par:-e=! (shift && goto startloop)
103+
if ""==!par:--eval=! (shift && goto startloop)
104+
if ""==!par:--rpc-eval=! (shift && shift && goto startloop)
105+
if ""==!par:-r=! (shift && goto startloop)
106+
if ""==!par:-pr=! (shift && goto startloop)
107+
if ""==!par:-pa=! (shift && goto startloop)
108+
if ""==!par:-pz=! (shift && goto startloop)
109+
if ""==!par:-v=! (goto startloop)
110+
if ""==!par:--version=! (goto startloop)
111+
if ""==!par:--no-halt=! (goto startloop)
112+
if ""==!par:--remsh=! (shift && goto startloop)
113+
if ""==!par:--dot-iex=! (shift && goto startloop)
114+
if ""==!par:--dbg=! (shift && goto startloop)
142115
rem ******* ERLANG PARAMETERS **********************
143116
if ""==!par:--boot=! (set "parsErlang=!parsErlang! -boot "%~1"" && shift && goto startloop)
144117
if ""==!par:--boot-var=! (set "parsErlang=!parsErlang! -boot_var "%~1" "%~2"" && shift && shift && goto startloop)
@@ -152,32 +125,30 @@ if ""==!par:--sname=! (set "parsErlang=!parsErlang! -sname "%~1""
152125
if ""==!par:--vm-args=! (set "parsErlang=!parsErlang! -args_file "%~1"" && shift && goto startloop)
153126
if ""==!par:--erl=! (set "beforeExtra=!beforeExtra! %~1" && shift && goto startloop)
154127
if ""==!par:--pipe-to=! (echo --pipe-to : Option is not supported on Windows && goto end)
155-
set endLoop=1
156-
set parsElixir=!parsElixir! !par!
157-
goto startloop
158128

159129
:run
130+
setlocal disabledelayedexpansion
160131
reg query HKCU\Console /v VirtualTerminalLevel 2>nul | findstr /e "0x1" >nul 2>nul
161132
if %errorlevel% == 0 (
162-
set beforeExtra=-elixir ansi_enabled true !beforeExtra!
133+
set beforeExtra=-elixir ansi_enabled true %beforeExtra%
163134
)
164135
if not defined useIEx (
165-
set beforeExtra=-s elixir start_cli !beforeExtra!
136+
set beforeExtra=-s elixir start_cli %beforeExtra%
166137
)
167138

168-
set beforeExtra=-noshell -elixir_root "!SCRIPT_PATH!..\lib" -pa "!SCRIPT_PATH!..\lib\elixir\ebin" !beforeExtra!
139+
set beforeExtra=-noshell -elixir_root "%SCRIPT_PATH%..\lib" -pa "%SCRIPT_PATH%..\lib\elixir\ebin" %beforeExtra%
169140

170141
if defined ELIXIR_CLI_DRY_RUN (
171142
if defined useWerl (
172-
echo start "" "!ERTS_BIN!werl.exe" !ext_libs! !ELIXIR_ERL_OPTIONS! !parsErlang! !beforeExtra! -extra !parsElixir!
143+
echo start "" "%ERTS_BIN%werl.exe" %ext_libs% %ELIXIR_ERL_OPTIONS% %parsErlang% %beforeExtra% -extra %*
173144
) else (
174-
echo "!ERTS_BIN!erl.exe" !ext_libs! !ELIXIR_ERL_OPTIONS! !parsErlang! !beforeExtra! -extra !parsElixir!
145+
echo "%ERTS_BIN%erl.exe" %ext_libs% %ELIXIR_ERL_OPTIONS% %parsErlang% %beforeExtra% -extra %*
175146
)
176147
) else (
177148
if defined useWerl (
178-
start "" "!ERTS_BIN!werl.exe" !ext_libs! !ELIXIR_ERL_OPTIONS! !parsErlang! !beforeExtra! -extra !parsElixir!
149+
start "" "%ERTS_BIN%werl.exe" %ext_libs% %ELIXIR_ERL_OPTIONS% %parsErlang% %beforeExtra% -extra %*
179150
) else (
180-
"!ERTS_BIN!erl.exe" !ext_libs! !ELIXIR_ERL_OPTIONS! !parsErlang! !beforeExtra! -extra !parsElixir!
151+
"%ERTS_BIN%erl.exe" %ext_libs% %ELIXIR_ERL_OPTIONS% %parsErlang% %beforeExtra% -extra %*
181152
)
182153
)
183154
exit /B %ERRORLEVEL%

bin/elixirc.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@if defined ELIXIR_CLI_ECHO (@echo on) else (@echo off)
1+
@echo off
22
setlocal
33
set argc=0
44
for %%A in (%*) do (

bin/iex.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@if defined ELIXIR_CLI_ECHO (@echo on) else (@echo off)
1+
@echo off
22
setlocal
33
if /I ""%1""==""--help"" goto documentation
44
if /I ""%1""==""-h"" goto documentation

bin/mix.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
@if defined ELIXIR_CLI_ECHO (@echo on) else (@echo off)
1+
@echo off
22
call "%~dp0\elixir.bat" "%~dp0\mix" %*

lib/elixir/lib/kernel/cli.ex

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,8 @@ defmodule Kernel.CLI do
327327
parse_argv(t, %{config | profile: :time})
328328
end
329329

330+
## IEx
331+
330332
defp parse_argv([~c"--dbg", backend | t], %{mode: :iex} = config) do
331333
case backend do
332334
~c"pry" ->
@@ -344,6 +346,21 @@ defmodule Kernel.CLI do
344346
defp parse_argv([~c"--dot-iex", _ | t], %{mode: :iex} = config), do: parse_argv(t, config)
345347
defp parse_argv([~c"--remsh", _ | t], %{mode: :iex} = config), do: parse_argv(t, config)
346348

349+
## Erlang flags
350+
351+
defp parse_argv([~c"--boot", _ | t], config), do: parse_argv(t, config)
352+
defp parse_argv([~c"--boot-var", _, _ | t], config), do: parse_argv(t, config)
353+
defp parse_argv([~c"--cookie", _ | t], config), do: parse_argv(t, config)
354+
defp parse_argv([~c"--hidden" | t], config), do: parse_argv(t, config)
355+
defp parse_argv([~c"--erl-config", _ | t], config), do: parse_argv(t, config)
356+
defp parse_argv([~c"--logger-otp-reports", _ | t], config), do: parse_argv(t, config)
357+
defp parse_argv([~c"--logger-sasl-reports", _ | t], config), do: parse_argv(t, config)
358+
defp parse_argv([~c"--name", _ | t], config), do: parse_argv(t, config)
359+
defp parse_argv([~c"--sname", _ | t], config), do: parse_argv(t, config)
360+
defp parse_argv([~c"--vm-args", _ | t], config), do: parse_argv(t, config)
361+
defp parse_argv([~c"--erl", _ | t], config), do: parse_argv(t, config)
362+
defp parse_argv([~c"--pipe-to", _, _ | t], config), do: parse_argv(t, config)
363+
347364
## Fallback
348365

349366
defp parse_argv([h | t], %{mode: :elixirc} = config) do

lib/elixir/test/elixir/kernel/cli_test.exs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,20 @@ defmodule Kernel.CLITest do
6161
end)
6262
end
6363

64+
@tag :tmp_dir
65+
test "file smoke test", context do
66+
file = Path.join(context.tmp_dir, "hello_world!.exs")
67+
File.write!(file, "IO.puts :hello_world123")
68+
{output, 0} = System.cmd(elixir_executable(), [file])
69+
assert output =~ "hello_world123"
70+
end
71+
6472
test "--eval smoke test" do
6573
{output, 0} = System.cmd(elixir_executable(), ["--eval", "IO.puts :hello_world123"])
6674
assert output =~ "hello_world123"
6775

68-
{output, 0} = System.cmd(elixir_executable(), ["-e", "IO.puts :hello_world123"])
69-
assert output =~ "hello_world123"
76+
# Check for -e and exclamation mark handling on Windows
77+
assert {_output, 0} = System.cmd(elixir_executable(), ["-e", "Time.new!(0, 0, 0)"])
7078

7179
# TODO: remove this once we bump CI to 26.3
7280
unless windows?() and System.otp_release() == "26" do

0 commit comments

Comments
 (0)