blob: ccae4322ed59ada6c5004a9d4f368ef07a9847e5 [file]
"""Generate helper scripts from ``*.PL`` templates.
The suite ships ``*.PL`` files (CGI scripts, rewrite-map programs, passphrase
helpers) that the httpd config references by their generated name (``foo.pl``
from ``foo.pl.PL``). Apache::TestMM::generate_script / write_perlscript produce
these by prepending a perl shebang and marking the file executable.
Only the bare ``write_perlscript`` behavior is needed for the htdocs/conf
helpers (no ``$Apache::TestConfig::Argv`` injection — that is specific to the
top-level t/TEST runner, which the pytest framework replaces).
"""
from __future__ import annotations
import os
import stat
import sys
from pathlib import Path
# Match make_shebang(): a short perlpath gets a plain shebang.
PERL = os.environ.get("APACHE_TEST_PERL", "/usr/bin/perl")
def _shebang() -> str:
perl = PERL
if len(perl) < 62:
return f"#!{perl}\n"
# Long-path eval workaround (rare); mirrors the $Config{startperl} fallback.
return (
"#!/bin/sh\n"
f" eval 'exec {perl} -S $0 ${{1+\"$@\"}}'\n"
" if $running_under_some_shell;\n"
)
def generate_pl_scripts(root: Path, *, perl: str | None = None) -> list[Path]:
"""For every ``*.PL`` under ``root``, write the generated script executable.
``foo.pl.PL`` -> ``foo.pl`` (shebang + body, mode 0755). Returns the list of
generated paths. Skips emacs lock files (``.#name``), matching the finddepth
filter used in Makefile.PL.
"""
global PERL # noqa: PLW0603 - simple module-level default override
if perl:
PERL = perl
generated: list[Path] = []
for pl in sorted(root.rglob("*.PL")):
if pl.name.startswith(".#"):
continue
target = pl.with_suffix("") # strip ".PL" -> "...pl"
body = pl.read_text()
target.write_text(_shebang() + body, newline="\n")
target.chmod(target.stat().st_mode | stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP)
generated.append(target)
return generated
def default_perl() -> str:
"""Best-effort path to a perl interpreter for the generated shebangs."""
from shutil import which
path = PERL or which("perl") or sys.executable
return path.replace("\\", "/")