rabbitmq-server/deps/rabbitmq_cli/rabbitmqctl_check_formatted...

136 lines
3.9 KiB
Python

load(
"@rules_erlang//:util.bzl",
"path_join",
"windows_path",
)
load(
"//bazel/elixir:elixir_toolchain.bzl",
"elixir_dirs",
"erlang_dirs",
"maybe_install_erlang",
)
def _impl(ctx):
(erlang_home, _, erlang_runfiles) = erlang_dirs(ctx)
(elixir_home, elixir_runfiles) = elixir_dirs(ctx, short_path = True)
package_dir = path_join(
ctx.label.workspace_root,
ctx.label.package,
)
if not ctx.attr.is_windows:
output = ctx.actions.declare_file(ctx.label.name)
script = """set -euo pipefail
{maybe_install_erlang}
if [[ "{elixir_home}" == /* ]]; then
ABS_ELIXIR_HOME="{elixir_home}"
else
ABS_ELIXIR_HOME=$PWD/{elixir_home}
fi
export PATH="$ABS_ELIXIR_HOME"/bin:"{erlang_home}"/bin:${{PATH}}
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
INITIAL_DIR="$(pwd)"
if [ ! -f ${{INITIAL_DIR}}/{package_dir}/test/test_helper.exs ]; then
echo "test_helper.exs cannot be found. 'bazel clean' might fix this."
exit 1
fi
cp -r ${{INITIAL_DIR}}/{package_dir}/config ${{TEST_UNDECLARED_OUTPUTS_DIR}}
cp -r ${{INITIAL_DIR}}/{package_dir}/lib ${{TEST_UNDECLARED_OUTPUTS_DIR}}
cp -r ${{INITIAL_DIR}}/{package_dir}/test ${{TEST_UNDECLARED_OUTPUTS_DIR}}
cp ${{INITIAL_DIR}}/{package_dir}/mix.exs ${{TEST_UNDECLARED_OUTPUTS_DIR}}
cp ${{INITIAL_DIR}}/{package_dir}/.formatter.exs ${{TEST_UNDECLARED_OUTPUTS_DIR}}
cd ${{TEST_UNDECLARED_OUTPUTS_DIR}}
export IS_BAZEL=true
export HOME=${{PWD}}
export MIX_ENV=test
export ERL_COMPILER_OPTIONS=deterministic
set -x
"${{ABS_ELIXIR_HOME}}"/bin/mix format --check-formatted
""".format(
maybe_install_erlang = maybe_install_erlang(ctx, short_path = True),
erlang_home = erlang_home,
elixir_home = elixir_home,
package_dir = package_dir,
)
else:
output = ctx.actions.declare_file(ctx.label.name + ".bat")
script = """@echo off
:: set LANG="en_US.UTF-8"
:: set LC_ALL="en_US.UTF-8"
set PATH="{elixir_home}\\bin";"{erlang_home}\\bin";%PATH%
set OUTPUTS_DIR=%TEST_UNDECLARED_OUTPUTS_DIR:/=\\%
:: robocopy exits non-zero when files are copied successfully
:: https://social.msdn.microsoft.com/Forums/en-US/d599833c-dcea-46f5-85e9-b1f028a0fefe/robocopy-exits-with-error-code-1?forum=tfsbuild
robocopy {package_dir}\\config %OUTPUTS_DIR%\\config /E /NFL /NDL /NJH /NJS /nc /ns /np
robocopy {package_dir}\\lib %OUTPUTS_DIR%\\lib /E /NFL /NDL /NJH /NJS /nc /ns /np
robocopy {package_dir}\\test %OUTPUTS_DIR%\\test /E /NFL /NDL /NJH /NJS /nc /ns /np
copy {package_dir}\\mix.exs %OUTPUTS_DIR%\\mix.exs || goto :error
copy {package_dir}\\.formatter.exs %OUTPUTS_DIR%\\.formatter.exs || goto :error
cd %OUTPUTS_DIR% || goto :error
set ERL_COMPILER_OPTIONS=deterministic
set MIX_ENV=test
"{elixir_home}\\bin\\mix" format --check-formatted || goto :error
goto :EOF
:error
exit /b 1
""".format(
erlang_home = windows_path(erlang_home),
elixir_home = windows_path(elixir_home),
package_dir = windows_path(ctx.label.package),
)
ctx.actions.write(
output = output,
content = script,
)
runfiles = ctx.runfiles(
files = ctx.files.srcs + ctx.files.data,
).merge_all([
erlang_runfiles,
elixir_runfiles,
])
return [DefaultInfo(
runfiles = runfiles,
executable = output,
)]
rabbitmqctl_check_formatted_private_test = rule(
implementation = _impl,
attrs = {
"is_windows": attr.bool(mandatory = True),
"srcs": attr.label_list(allow_files = [".ex", ".exs"]),
"data": attr.label_list(allow_files = True),
},
toolchains = [
"//bazel/elixir:toolchain_type",
],
test = True,
)
def rabbitmqctl_check_formatted_test(**kwargs):
rabbitmqctl_check_formatted_private_test(
is_windows = select({
"@bazel_tools//src/conditions:host_windows": True,
"//conditions:default": False,
}),
**kwargs
)