Skip to content

Check for exclamation marks on Windows #13166

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
May 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 26 additions & 55 deletions bin/elixir.bat
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
@if defined ELIXIR_CLI_ECHO (@echo on) else (@echo off)
@echo off

set ELIXIR_VERSION=1.17.0-dev

setlocal enabledelayedexpansion
if ""%1""=="""" if ""%2""=="""" goto documentation
if /I ""%1""==""--help"" if ""%2""=="""" goto documentation
if /I ""%1""==""-h"" if ""%2""=="""" goto documentation
Expand Down Expand Up @@ -64,13 +63,11 @@ echo ** Standalone options can't be combined with other options.
goto end

:shortversion
echo !ELIXIR_VERSION!
echo %ELIXIR_VERSION%
goto end

:parseopts

rem Parameters for Elixir
set parsElixir=
setlocal enabledelayedexpansion

rem Parameters for Erlang
set parsErlang=
Expand All @@ -97,48 +94,24 @@ if "!par!"=="" (
)
shift
set par="!par:"=\"!"
if !endLoop! == 1 (
set parsElixir=!parsElixir! !par!
goto startloop
)
rem ******* EXECUTION OPTIONS **********************
if !par!=="--werl" (set useWerl=1 && goto startloop)
if !par!=="+iex" (set parsElixir=!parsElixir! +iex && set useIEx=1 && goto startloop)
if !par!=="+elixirc" (set parsElixir=!parsElixir! +elixirc && goto startloop)
rem ******* EVAL PARAMETERS ************************
if ""==!par:-e=! (
set "VAR=%~1"
if not defined VAR (set VAR= )
set parsElixir=!parsElixir! -e "!VAR:"=\"!"
shift
goto startloop
)
if ""==!par:--eval=! (
set "VAR=%~1"
if not defined VAR (set VAR= )
set parsElixir=!parsElixir! --eval "!VAR:"=\"!"
shift
goto startloop
)
if ""==!par:--rpc-eval=! (
set "VAR=%~2"
if not defined VAR (set VAR= )
set parsElixir=!parsElixir! --rpc-eval %1 "!VAR:"=\"!"
shift
shift
goto startloop
)
if !par!=="+iex" (set useIEx=1 && goto startloop)
if !par!=="+elixirc" (goto startloop)
rem ******* ELIXIR PARAMETERS **********************
if ""==!par:-r=! (set "parsElixir=!parsElixir! -r "%~1"" && shift && goto startloop)
if ""==!par:-pr=! (set "parsElixir=!parsElixir! -pr "%~1"" && shift && goto startloop)
if ""==!par:-pa=! (set "parsElixir=!parsElixir! -pa "%~1"" && shift && goto startloop)
if ""==!par:-pz=! (set "parsElixir=!parsElixir! -pz "%~1"" && shift && goto startloop)
if ""==!par:-v=! (set "parsElixir=!parsElixir! -v" && goto startloop)
if ""==!par:--version=! (set "parsElixir=!parsElixir! --version" && goto startloop)
if ""==!par:--no-halt=! (set "parsElixir=!parsElixir! --no-halt" && goto startloop)
if ""==!par:--remsh=! (set "parsElixir=!parsElixir! --remsh "%~1"" && shift && goto startloop)
if ""==!par:--dot-iex=! (set "parsElixir=!parsElixir! --dot-iex "%~1"" && shift && goto startloop)
if ""==!par:--dbg=! (set "parsElixir=!parsElixir! --dbg "%~1"" && shift && goto startloop)
if ""==!par:-e=! (shift && goto startloop)
if ""==!par:--eval=! (shift && goto startloop)
if ""==!par:--rpc-eval=! (shift && shift && goto startloop)
if ""==!par:-r=! (shift && goto startloop)
if ""==!par:-pr=! (shift && goto startloop)
if ""==!par:-pa=! (shift && goto startloop)
if ""==!par:-pz=! (shift && goto startloop)
if ""==!par:-v=! (goto startloop)
if ""==!par:--version=! (goto startloop)
if ""==!par:--no-halt=! (goto startloop)
if ""==!par:--remsh=! (shift && goto startloop)
if ""==!par:--dot-iex=! (shift && goto startloop)
if ""==!par:--dbg=! (shift && goto startloop)
rem ******* ERLANG PARAMETERS **********************
if ""==!par:--boot=! (set "parsErlang=!parsErlang! -boot "%~1"" && shift && goto startloop)
if ""==!par:--boot-var=! (set "parsErlang=!parsErlang! -boot_var "%~1" "%~2"" && shift && shift && goto startloop)
Expand All @@ -152,32 +125,30 @@ if ""==!par:--sname=! (set "parsErlang=!parsErlang! -sname "%~1""
if ""==!par:--vm-args=! (set "parsErlang=!parsErlang! -args_file "%~1"" && shift && goto startloop)
if ""==!par:--erl=! (set "beforeExtra=!beforeExtra! %~1" && shift && goto startloop)
if ""==!par:--pipe-to=! (echo --pipe-to : Option is not supported on Windows && goto end)
set endLoop=1
set parsElixir=!parsElixir! !par!
goto startloop

:run
setlocal disabledelayedexpansion
reg query HKCU\Console /v VirtualTerminalLevel 2>nul | findstr /e "0x1" >nul 2>nul
if %errorlevel% == 0 (
set beforeExtra=-elixir ansi_enabled true !beforeExtra!
set beforeExtra=-elixir ansi_enabled true %beforeExtra%
)
if not defined useIEx (
set beforeExtra=-s elixir start_cli !beforeExtra!
set beforeExtra=-s elixir start_cli %beforeExtra%
)

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

if defined ELIXIR_CLI_DRY_RUN (
if defined useWerl (
echo start "" "!ERTS_BIN!werl.exe" !ext_libs! !ELIXIR_ERL_OPTIONS! !parsErlang! !beforeExtra! -extra !parsElixir!
echo start "" "%ERTS_BIN%werl.exe" %ext_libs% %ELIXIR_ERL_OPTIONS% %parsErlang% %beforeExtra% -extra %*
) else (
echo "!ERTS_BIN!erl.exe" !ext_libs! !ELIXIR_ERL_OPTIONS! !parsErlang! !beforeExtra! -extra !parsElixir!
echo "%ERTS_BIN%erl.exe" %ext_libs% %ELIXIR_ERL_OPTIONS% %parsErlang% %beforeExtra% -extra %*
)
) else (
if defined useWerl (
start "" "!ERTS_BIN!werl.exe" !ext_libs! !ELIXIR_ERL_OPTIONS! !parsErlang! !beforeExtra! -extra !parsElixir!
start "" "%ERTS_BIN%werl.exe" %ext_libs% %ELIXIR_ERL_OPTIONS% %parsErlang% %beforeExtra% -extra %*
) else (
"!ERTS_BIN!erl.exe" !ext_libs! !ELIXIR_ERL_OPTIONS! !parsErlang! !beforeExtra! -extra !parsElixir!
"%ERTS_BIN%erl.exe" %ext_libs% %ELIXIR_ERL_OPTIONS% %parsErlang% %beforeExtra% -extra %*
)
)
exit /B %ERRORLEVEL%
Expand Down
2 changes: 1 addition & 1 deletion bin/elixirc.bat
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
@if defined ELIXIR_CLI_ECHO (@echo on) else (@echo off)
@echo off
setlocal
set argc=0
for %%A in (%*) do (
Expand Down
2 changes: 1 addition & 1 deletion bin/iex.bat
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
@if defined ELIXIR_CLI_ECHO (@echo on) else (@echo off)
@echo off
setlocal
if /I ""%1""==""--help"" goto documentation
if /I ""%1""==""-h"" goto documentation
Expand Down
2 changes: 1 addition & 1 deletion bin/mix.bat
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
@if defined ELIXIR_CLI_ECHO (@echo on) else (@echo off)
@echo off
call "%~dp0\elixir.bat" "%~dp0\mix" %*
17 changes: 17 additions & 0 deletions lib/elixir/lib/kernel/cli.ex
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,8 @@ defmodule Kernel.CLI do
parse_argv(t, %{config | profile: :time})
end

## IEx

defp parse_argv([~c"--dbg", backend | t], %{mode: :iex} = config) do
case backend do
~c"pry" ->
Expand All @@ -344,6 +346,21 @@ defmodule Kernel.CLI do
defp parse_argv([~c"--dot-iex", _ | t], %{mode: :iex} = config), do: parse_argv(t, config)
defp parse_argv([~c"--remsh", _ | t], %{mode: :iex} = config), do: parse_argv(t, config)

## Erlang flags

defp parse_argv([~c"--boot", _ | t], config), do: parse_argv(t, config)
defp parse_argv([~c"--boot-var", _, _ | t], config), do: parse_argv(t, config)
defp parse_argv([~c"--cookie", _ | t], config), do: parse_argv(t, config)
defp parse_argv([~c"--hidden" | t], config), do: parse_argv(t, config)
defp parse_argv([~c"--erl-config", _ | t], config), do: parse_argv(t, config)
defp parse_argv([~c"--logger-otp-reports", _ | t], config), do: parse_argv(t, config)
defp parse_argv([~c"--logger-sasl-reports", _ | t], config), do: parse_argv(t, config)
defp parse_argv([~c"--name", _ | t], config), do: parse_argv(t, config)
defp parse_argv([~c"--sname", _ | t], config), do: parse_argv(t, config)
defp parse_argv([~c"--vm-args", _ | t], config), do: parse_argv(t, config)
defp parse_argv([~c"--erl", _ | t], config), do: parse_argv(t, config)
defp parse_argv([~c"--pipe-to", _, _ | t], config), do: parse_argv(t, config)

## Fallback

defp parse_argv([h | t], %{mode: :elixirc} = config) do
Expand Down
12 changes: 10 additions & 2 deletions lib/elixir/test/elixir/kernel/cli_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,20 @@ defmodule Kernel.CLITest do
end)
end

@tag :tmp_dir
test "file smoke test", context do
file = Path.join(context.tmp_dir, "hello_world!.exs")
File.write!(file, "IO.puts :hello_world123")
{output, 0} = System.cmd(elixir_executable(), [file])
assert output =~ "hello_world123"
end

test "--eval smoke test" do
{output, 0} = System.cmd(elixir_executable(), ["--eval", "IO.puts :hello_world123"])
assert output =~ "hello_world123"

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

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