mirror of
https://github.com/spantaleev/matrix-docker-ansible-deploy.git
synced 2026-11-02 03:34:15 +00:00
Find Ansible's interpreter also behind python-exec and wrapper scripts
On Gentoo, the shebang of `ansible-playbook` is the python-exec dispatcher (`#!/usr/bin/python-exec2c`), which bin/ansible-python.sh took for an interpreter, because its name starts with `python`. python-exec only runs the programs it wraps, so every `just run…` recipe failed with "no python-exec wrapped executable found". Now only names like `python`, `python3` or `python3.14` are trusted. For anything else (python-exec, wrapper scripts as on Nix), Ansible is asked which interpreter it runs on (`ansible-playbook --version`), before falling back to `python3`, which may lack PyYAML (e.g. in an active virtualenv). Same as https://github.com/mother-of-all-self-hosting/mash-playbook/commit/a685940a Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
c4eee6cb62
commit
415d784ca0
+21
-10
@@ -11,12 +11,12 @@
|
||||
# where the system's `python3` may lack it.
|
||||
#
|
||||
# The interpreter is taken from the first line (shebang) of `ansible-playbook`.
|
||||
# If that is not a Python interpreter (e.g. `ansible-playbook` is a wrapper script), or Ansible is not installed,
|
||||
# `python3` is used.
|
||||
# If that is not a Python interpreter (e.g. `ansible-playbook` is a wrapper script, or Gentoo's python-exec),
|
||||
# Ansible is asked which interpreter it runs on. If that fails too, or Ansible is not installed, `python3` is used.
|
||||
|
||||
set -eu
|
||||
|
||||
python=python3
|
||||
interpreter=
|
||||
|
||||
ansible_playbook_path=$(command -v ansible-playbook 2>/dev/null || true)
|
||||
if [ -n "$ansible_playbook_path" ] && [ -f "$ansible_playbook_path" ]; then
|
||||
@@ -30,15 +30,26 @@ EOF
|
||||
if [ "$(basename "$interpreter")" = "env" ]; then
|
||||
interpreter=${next_word:-}
|
||||
fi
|
||||
case "$(basename "${interpreter:-none}")" in
|
||||
python*)
|
||||
if command -v "$interpreter" >/dev/null 2>&1; then
|
||||
python=$interpreter
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
# Only names like `python`, `python3` or `python3.14` are interpreters (`python-exec2c` is not)
|
||||
case "$(basename "${interpreter:-none}")" in
|
||||
python | python[0-9] | python[0-9].[0-9]*) ;;
|
||||
*) interpreter= ;;
|
||||
esac
|
||||
|
||||
if [ -z "$interpreter" ] || ! command -v "$interpreter" >/dev/null 2>&1; then
|
||||
# The interpreter ends a line like: ` python version = 3.14.0 (main, …) [GCC …] (/usr/bin/python3.14)`
|
||||
interpreter=$("$ansible_playbook_path" --version 2>/dev/null \
|
||||
| sed -n 's/^ *python version = .*(\([^()]*\))$/\1/p' | head -n 1) || true
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$interpreter" ] && command -v "$interpreter" >/dev/null 2>&1; then
|
||||
python=$interpreter
|
||||
else
|
||||
python=python3
|
||||
fi
|
||||
|
||||
exec "$python" "$@"
|
||||
|
||||
Reference in New Issue
Block a user