refactor(core): src/app structure + fix auto-merge label gate (#10)
This commit is contained in:
parent
93a6b8e292
commit
c8f5370cfd
14 changed files with 23 additions and 14 deletions
|
|
@ -97,24 +97,33 @@ jobs:
|
||||||
|
|
||||||
auto-merge:
|
auto-merge:
|
||||||
# Fusion automatique OPT-IN : poser le label `auto-merge` sur la PR.
|
# 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.
|
# Ne s'execute que si les 3 checks passent (needs).
|
||||||
# Plus fiable que le merge_when_checks_succeed natif de Forgejo (qui ne se
|
# IMPORTANT : le filtrage par label se fait DANS le step via l'API, pas dans
|
||||||
# declenche pas toujours au passage au vert). Fusionne via l'API REST.
|
# `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]
|
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
|
runs-on: docker
|
||||||
steps:
|
steps:
|
||||||
- name: Install curl
|
- name: Install curl
|
||||||
run: apt-get update -qq && apt-get install -y -qq curl ca-certificates >/dev/null
|
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: |
|
run: |
|
||||||
API="${{ github.server_url }}/api/v1/repos/${{ github.repository }}"
|
API="${{ github.server_url }}/api/v1/repos/${{ github.repository }}"
|
||||||
PR="${{ github.event.pull_request.number }}"
|
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 \
|
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" \
|
-H "Content-Type: application/json" \
|
||||||
-d '{"Do":"squash","delete_branch_after_merge":true}' \
|
-d '{"Do":"squash","delete_branch_after_merge":true}' \
|
||||||
"$API/pulls/$PR/merge")
|
"$API/pulls/$PR/merge")
|
||||||
echo "merge HTTP $code"; cat /tmp/resp || true; echo
|
echo "merge HTTP $code"; cat /tmp/resp || true; echo
|
||||||
[ "$code" = "200" ] || { echo "auto-merge failed (HTTP $code)"; exit 1; }
|
[ "$code" = "200" ] || { echo "auto-merge failed (HTTP $code)"; exit 1; }
|
||||||
echo "PR #$PR merged."
|
echo "PR #$PR mergee."
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ namespace App\Core;
|
||||||
/**
|
/**
|
||||||
* PSR-4 autoloader manuel, sans Composer (exigence "from scratch" Cr 4.c.3).
|
* PSR-4 autoloader manuel, sans Composer (exigence "from scratch" Cr 4.c.3).
|
||||||
*
|
*
|
||||||
* Mappe le prefixe de namespace racine "App\" sur le dossier src/.
|
* Mappe le prefixe de namespace racine "App\" sur le dossier src/app/.
|
||||||
* Exemple : App\Core\Router -> {src}/Core/Router.php
|
* Exemple : App\Core\Router -> {src/app}/Core/Router.php
|
||||||
*/
|
*/
|
||||||
final class Autoloader
|
final class Autoloader
|
||||||
{
|
{
|
||||||
|
|
@ -17,8 +17,8 @@ final class Autoloader
|
||||||
/**
|
/**
|
||||||
* Enregistre l'autoloader aupres de la pile SPL.
|
* Enregistre l'autoloader aupres de la pile SPL.
|
||||||
*
|
*
|
||||||
* La racine src/ est calculee depuis l'emplacement de ce fichier
|
* La racine src/app/ est calculee depuis l'emplacement de ce fichier
|
||||||
* (src/Core/Autoloader.php) : dirname(__DIR__) remonte de Core/ a src/.
|
* (src/app/Core/Autoloader.php) : dirname(__DIR__) remonte de Core/ a src/app/.
|
||||||
* Aucun chemin code en dur, donc portable host/conteneur.
|
* Aucun chemin code en dur, donc portable host/conteneur.
|
||||||
*/
|
*/
|
||||||
public static function register(): void
|
public static function register(): void
|
||||||
|
|
@ -31,7 +31,7 @@ abstract class Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rend une vue PHP sous src/Views/<name>.php avec ses donnees extraites.
|
* Rend une vue PHP sous src/app/Views/<name>.php avec ses donnees extraites.
|
||||||
*
|
*
|
||||||
* Le rendu est bufferise puis injecte dans le layout via la variable
|
* Le rendu est bufferise puis injecte dans le layout via la variable
|
||||||
* $content, ce qui permet aux vues de rester de simples fragments.
|
* $content, ce qui permet aux vues de rester de simples fragments.
|
||||||
|
|
@ -21,7 +21,7 @@ use App\Core\Router;
|
||||||
|
|
||||||
// src/public/admin/index.php : __DIR__ = src/public/admin ; remonter de deux
|
// src/public/admin/index.php : __DIR__ = src/public/admin ; remonter de deux
|
||||||
// niveaux (admin -> public -> src) pour atteindre la racine src/.
|
// 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();
|
Autoloader::register();
|
||||||
|
|
||||||
// En-tetes de securite poses tot, valables sur toute reponse y compris une 500.
|
// En-tetes de securite poses tot, valables sur toute reponse y compris une 500.
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,6 @@ declare(strict_types=1);
|
||||||
* (src/public/admin/index.php). Les tests resolvent ainsi App\... via PSR-4.
|
* (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();
|
App\Core\Autoloader::register();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue