You've already forked tribes-plugin-supertest
forked from tribes/tribes-plugin-template
6eaa4beb80
Forward ash.codegen and ecto.migration through the Supertest plugin wrapper and update agent guidance to keep AshPostgres codegen as the default migration workflow.
107 lines
2.5 KiB
Bash
Executable File
107 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
Usage:
|
|
plugin validate
|
|
plugin test [mix test args...]
|
|
plugin precommit [mix precommit args...]
|
|
plugin ecto.migration <name> [mix ecto.gen.migration args...]
|
|
plugin ash.codegen <name> [mix ash_postgres.generate_migrations args...]
|
|
plugin smoke
|
|
plugin shell
|
|
EOF
|
|
}
|
|
|
|
fail() {
|
|
echo "plugin: $*" >&2
|
|
exit 1
|
|
}
|
|
|
|
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
|
|
plugin_root="$(cd "$script_dir/.." && pwd -P)"
|
|
host_root="${TRIBES_HOST_ROOT:-$plugin_root/../tribes}"
|
|
host_root="$(cd "$host_root" && pwd -P)"
|
|
host_script="$host_root/scripts/plugin"
|
|
|
|
json_field() {
|
|
local field="$1"
|
|
|
|
FIELD="$field" mix run --no-start -e '
|
|
field = System.fetch_env!("FIELD")
|
|
manifest = "manifest.json" |> File.read!() |> JSON.decode!()
|
|
value = Map.fetch!(manifest, field)
|
|
IO.write(value)
|
|
'
|
|
}
|
|
|
|
run_smoke() {
|
|
cd "$plugin_root"
|
|
|
|
mix compile
|
|
|
|
local otp_app
|
|
local entry_module
|
|
otp_app="$(json_field otp_app)"
|
|
entry_module="$(json_field entry_module)"
|
|
|
|
local beam_path="_build/dev/lib/$otp_app/ebin/Elixir.$entry_module.beam"
|
|
[[ -f "$beam_path" ]] || fail "expected entry module beam at $beam_path"
|
|
|
|
cd "$host_root"
|
|
PLUGIN_ROOT="$plugin_root" ENTRY_MODULE="$entry_module" mix run --no-start -e '
|
|
plugin_root = System.fetch_env!("PLUGIN_ROOT")
|
|
entry_module = System.fetch_env!("ENTRY_MODULE")
|
|
|
|
plugin_root
|
|
|> Path.join("_build/dev/lib/*/ebin")
|
|
|> Path.wildcard()
|
|
|> Enum.each(&(:code.add_patha(String.to_charlist(&1))))
|
|
|
|
module = String.to_atom("Elixir." <> entry_module)
|
|
|
|
case Code.ensure_loaded(module) do
|
|
{:module, ^module} ->
|
|
IO.puts("Loaded #{entry_module}")
|
|
|
|
other ->
|
|
raise "failed to load #{entry_module}: #{inspect(other)}"
|
|
end
|
|
'
|
|
}
|
|
|
|
command_name="${1:-}"
|
|
if [[ -z "$command_name" ]]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
shift
|
|
|
|
case "$command_name" in
|
|
validate | test | precommit | ecto.migration | ash.codegen | smoke | shell) ;;
|
|
-h | --help | help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
usage
|
|
fail "unknown command: $command_name"
|
|
;;
|
|
esac
|
|
|
|
[[ -x "$host_script" || -f "$host_script" ]] || fail "expected host plugin script at $host_script"
|
|
|
|
if [[ "$command_name" == "smoke" ]]; then
|
|
run_smoke "$@"
|
|
exit 0
|
|
fi
|
|
|
|
if [[ "${DEVENV_ROOT:-}" == "$plugin_root" ]]; then
|
|
command -v devenv >/dev/null 2>&1 || fail "devenv is required when running from the plugin devenv shell"
|
|
cd "$host_root"
|
|
exec devenv shell -- bash ./scripts/plugin "$command_name" "$plugin_root" "$@"
|
|
fi
|
|
|
|
exec bash "$host_script" "$command_name" "$plugin_root" "$@"
|