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>
40 lines
1.5 KiB
PHP
40 lines
1.5 KiB
PHP
<?php
|
|
// ─── Changelog reader ────────────────────────────────────────────────────────
|
|
// Reads the repository CHANGELOG.md and exposes the most recent version entry,
|
|
// so the backoffice can show "Versão X — what changed" without a DB round-trip.
|
|
// The file is versioned with the code, so it updates automatically on git pull.
|
|
|
|
/**
|
|
* Return the latest CHANGELOG.md entry.
|
|
*
|
|
* Expected format:
|
|
* ## v2.2 — Adicionado pagamentos parciais
|
|
* - primeira alteração
|
|
* - segunda alteração
|
|
*
|
|
* @return array{version: ?string, changes: string[]}
|
|
*/
|
|
function changelog_latest(): array {
|
|
$file = dirname(__DIR__, 2) . '/CHANGELOG.md';
|
|
if (!is_file($file)) return ['version' => null, 'changes' => []];
|
|
|
|
$lines = @file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
|
if ($lines === false) return ['version' => null, 'changes' => []];
|
|
|
|
$version = null;
|
|
$changes = [];
|
|
foreach ($lines as $line) {
|
|
if (preg_match('/^##\s+(.+)$/', $line, $m)) {
|
|
if ($version === null) {
|
|
$version = trim($m[1]);
|
|
continue;
|
|
}
|
|
break; // reached the next version entry
|
|
}
|
|
if ($version !== null && str_starts_with(ltrim($line), '-')) {
|
|
$changes[] = ltrim(ltrim($line), '- ');
|
|
}
|
|
}
|
|
return ['version' => $version, 'changes' => $changes];
|
|
}
|