shared/platform-tools was a git submodule. On this branch it is a plain
directory of tracked files, frozen at ea3616abae30106df283e73a3e2f9e5bb0e6ae90
— the same commit fotografia.andmore.pt pins. Contents are byte-identical to
that tree, verified blob by blob.
The submodule caused every deployment failure this site has had:
- .gitmodules named no `branch`, so the update fell back to
refs/remotes/origin/HEAD — a ref a plain server-side clone never writes.
"Atualizar submódulo" failed with "Unable to find refs/remotes/origin/HEAD
revision in submodule path".
- Its URL was http://, which the origin answers with 523.
- This install is deployed by uploading files, and a submodule is invisible
to that. The tree moved forward while shared/platform-tools stayed on the
old pin, config/functions_secrets.php died on a missing compat_secrets.php,
and the whole site — public pages included — went down.
Each of those was separately fixable. Together they mean a second repository
nobody can see from the deployment path, gating whether the first one boots. A
plain directory deploys like every other file and cannot fall out of step.
The cost is that platform-tools updates no longer arrive by bumping a pin; they
are a copy-over-and-commit. shared/platform-tools/VENDORED.md records the
upstream SHA, the procedure, and which four files differ from upstream in line
endings only (social/*.js, .css, functions_publications.php — CRLF upstream,
normalised to LF here; content otherwise identical).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
29 lines
1.2 KiB
PHP
29 lines
1.2 KiB
PHP
<?php
|
|
// ─── Server capability probes (shared) ──────────────────────────────────────
|
|
//
|
|
// Shared hosting frequently disables process-spawning functions via
|
|
// `disable_functions` in php.ini — calling one is then a FATAL "undefined
|
|
// function" error. Everything that shells out (git, composer) must probe
|
|
// first and degrade gracefully: hide the tool, refuse the action, never fatal.
|
|
|
|
/**
|
|
* True when PHP can spawn and manage subprocesses. Checks the whole proc_*
|
|
* family the toolkit uses (git_run needs open/close; composer_run also needs
|
|
* get_status/terminate) — hosts disable them as a set, and a partial set is
|
|
* as unusable as none.
|
|
*/
|
|
function platform_proc_open_available(): bool {
|
|
static $ok = null;
|
|
if ($ok === null) {
|
|
$disabled = array_map('trim', explode(',', strtolower((string) ini_get('disable_functions'))));
|
|
$ok = true;
|
|
foreach (['proc_open', 'proc_close', 'proc_get_status', 'proc_terminate'] as $fn) {
|
|
if (!function_exists($fn) || in_array($fn, $disabled, true)) {
|
|
$ok = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return $ok;
|
|
}
|