From cc726a00b85fdf827bf55757496748d7c7af8655 Mon Sep 17 00:00:00 2001 From: Imugiii Date: Mon, 15 Jun 2026 14:36:29 +0000 Subject: [PATCH 1/2] refactor(core): move app code to src/app/ (App\ -> src/app, separate from public docroots) --- src/{ => app}/Controllers/HealthController.php | 0 src/{ => app}/Controllers/HomeController.php | 0 src/{ => app}/Core/Autoloader.php | 8 ++++---- src/{ => app}/Core/Config.php | 0 src/{ => app}/Core/Controller.php | 2 +- src/{ => app}/Core/Database.php | 0 src/{ => app}/Core/Request.php | 0 src/{ => app}/Core/Response.php | 0 src/{ => app}/Core/Router.php | 0 src/{ => app}/Views/home.php | 0 src/{ => app}/Views/layout.php | 0 src/public/admin/index.php | 2 +- tests/bootstrap.php | 2 +- 13 files changed, 7 insertions(+), 7 deletions(-) rename src/{ => app}/Controllers/HealthController.php (100%) rename src/{ => app}/Controllers/HomeController.php (100%) rename src/{ => app}/Core/Autoloader.php (81%) rename src/{ => app}/Core/Config.php (100%) rename src/{ => app}/Core/Controller.php (95%) rename src/{ => app}/Core/Database.php (100%) rename src/{ => app}/Core/Request.php (100%) rename src/{ => app}/Core/Response.php (100%) rename src/{ => app}/Core/Router.php (100%) rename src/{ => app}/Views/home.php (100%) rename src/{ => app}/Views/layout.php (100%) diff --git a/src/Controllers/HealthController.php b/src/app/Controllers/HealthController.php similarity index 100% rename from src/Controllers/HealthController.php rename to src/app/Controllers/HealthController.php diff --git a/src/Controllers/HomeController.php b/src/app/Controllers/HomeController.php similarity index 100% rename from src/Controllers/HomeController.php rename to src/app/Controllers/HomeController.php diff --git a/src/Core/Autoloader.php b/src/app/Core/Autoloader.php similarity index 81% rename from src/Core/Autoloader.php rename to src/app/Core/Autoloader.php index 06f4a10..dc1ecf8 100644 --- a/src/Core/Autoloader.php +++ b/src/app/Core/Autoloader.php @@ -7,8 +7,8 @@ namespace App\Core; /** * PSR-4 autoloader manuel, sans Composer (exigence "from scratch" Cr 4.c.3). * - * Mappe le prefixe de namespace racine "App\" sur le dossier src/. - * Exemple : App\Core\Router -> {src}/Core/Router.php + * Mappe le prefixe de namespace racine "App\" sur le dossier src/app/. + * Exemple : App\Core\Router -> {src/app}/Core/Router.php */ final class Autoloader { @@ -17,8 +17,8 @@ final class Autoloader /** * Enregistre l'autoloader aupres de la pile SPL. * - * La racine src/ est calculee depuis l'emplacement de ce fichier - * (src/Core/Autoloader.php) : dirname(__DIR__) remonte de Core/ a src/. + * La racine src/app/ est calculee depuis l'emplacement de ce fichier + * (src/app/Core/Autoloader.php) : dirname(__DIR__) remonte de Core/ a src/app/. * Aucun chemin code en dur, donc portable host/conteneur. */ public static function register(): void diff --git a/src/Core/Config.php b/src/app/Core/Config.php similarity index 100% rename from src/Core/Config.php rename to src/app/Core/Config.php diff --git a/src/Core/Controller.php b/src/app/Core/Controller.php similarity index 95% rename from src/Core/Controller.php rename to src/app/Core/Controller.php index a481fd6..b2bab84 100644 --- a/src/Core/Controller.php +++ b/src/app/Core/Controller.php @@ -31,7 +31,7 @@ abstract class Controller } /** - * Rend une vue PHP sous src/Views/.php avec ses donnees extraites. + * Rend une vue PHP sous src/app/Views/.php avec ses donnees extraites. * * Le rendu est bufferise puis injecte dans le layout via la variable * $content, ce qui permet aux vues de rester de simples fragments. diff --git a/src/Core/Database.php b/src/app/Core/Database.php similarity index 100% rename from src/Core/Database.php rename to src/app/Core/Database.php diff --git a/src/Core/Request.php b/src/app/Core/Request.php similarity index 100% rename from src/Core/Request.php rename to src/app/Core/Request.php diff --git a/src/Core/Response.php b/src/app/Core/Response.php similarity index 100% rename from src/Core/Response.php rename to src/app/Core/Response.php diff --git a/src/Core/Router.php b/src/app/Core/Router.php similarity index 100% rename from src/Core/Router.php rename to src/app/Core/Router.php diff --git a/src/Views/home.php b/src/app/Views/home.php similarity index 100% rename from src/Views/home.php rename to src/app/Views/home.php diff --git a/src/Views/layout.php b/src/app/Views/layout.php similarity index 100% rename from src/Views/layout.php rename to src/app/Views/layout.php diff --git a/src/public/admin/index.php b/src/public/admin/index.php index 707255f..50279f4 100644 --- a/src/public/admin/index.php +++ b/src/public/admin/index.php @@ -21,7 +21,7 @@ use App\Core\Router; // src/public/admin/index.php : __DIR__ = src/public/admin ; remonter de deux // niveaux (admin -> public -> src) pour atteindre la racine src/. -require dirname(__DIR__, 2) . '/Core/Autoloader.php'; +require dirname(__DIR__, 2) . '/app/Core/Autoloader.php'; Autoloader::register(); // En-tetes de securite poses tot, valables sur toute reponse y compris une 500. diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 4aa2d11..5810c5f 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -8,6 +8,6 @@ declare(strict_types=1); * (src/public/admin/index.php). Les tests resolvent ainsi App\... via PSR-4. */ -require __DIR__ . '/../src/Core/Autoloader.php'; +require __DIR__ . '/../src/app/Core/Autoloader.php'; App\Core\Autoloader::register(); -- 2.45.3 From 9c0ea4a345289113e1eff37752f9abeaefe80724 Mon Sep 17 00:00:00 2001 From: Imugiii Date: Mon, 15 Jun 2026 14:36:29 +0000 Subject: [PATCH 2/2] fix(ci): gate auto-merge by label via API shell check (Forgejo if-expression matched even unlabeled) --- .forgejo/workflows/ci.yml | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/.forgejo/workflows/ci.yml b/.forgejo/workflows/ci.yml index 8b5bef4..b2a6530 100644 --- a/.forgejo/workflows/ci.yml +++ b/.forgejo/workflows/ci.yml @@ -97,24 +97,33 @@ jobs: auto-merge: # Fusion automatique OPT-IN : poser le label `auto-merge` sur la PR. - # Ne s'execute que si les 3 checks passent (needs) ET si le label est present. - # Plus fiable que le merge_when_checks_succeed natif de Forgejo (qui ne se - # declenche pas toujours au passage au vert). Fusionne via l'API REST. + # Ne s'execute que si les 3 checks passent (needs). + # IMPORTANT : le filtrage par label se fait DANS le step via l'API, pas dans + # `if:` — l'expression contains(github.event.pull_request.labels.*.name, ...) + # de Forgejo n'est pas fiable (elle s'evalue a vrai meme sans label, ce qui + # fusionnait toute PR verte). La verification shell sur l'API est le vrai gate. needs: [secret-scan, php-lint, static-tests] - if: github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'auto-merge') + if: github.event_name == 'pull_request' runs-on: docker steps: - name: Install curl run: apt-get update -qq && apt-get install -y -qq curl ca-certificates >/dev/null - - name: Merge PR (squash) once CI is green + - name: Merge PR (squash) si label auto-merge present et CI verte run: | API="${{ github.server_url }}/api/v1/repos/${{ github.repository }}" PR="${{ github.event.pull_request.number }}" + TOKEN="${{ secrets.FORGEJO_TOKEN }}" + labels=$(curl -s -H "Authorization: token $TOKEN" "$API/issues/$PR/labels") + if ! printf '%s' "$labels" | grep -q '"name"[[:space:]]*:[[:space:]]*"auto-merge"'; then + echo "Pas de label 'auto-merge' sur la PR #$PR -> relecture manuelle, pas de fusion auto." + exit 0 + fi + echo "Label 'auto-merge' present + CI verte -> fusion de la PR #$PR" code=$(curl -s -o /tmp/resp -w "%{http_code}" -X POST \ - -H "Authorization: token ${{ secrets.FORGEJO_TOKEN }}" \ + -H "Authorization: token $TOKEN" \ -H "Content-Type: application/json" \ -d '{"Do":"squash","delete_branch_after_merge":true}' \ "$API/pulls/$PR/merge") echo "merge HTTP $code"; cat /tmp/resp || true; echo [ "$code" = "200" ] || { echo "auto-merge failed (HTTP $code)"; exit 1; } - echo "PR #$PR merged." + echo "PR #$PR mergee." -- 2.45.3