diff --git a/core/module/config/view/autoupdate/autoupdate.php b/core/module/config/view/autoupdate/autoupdate.php index 6813a826..341c742a 100644 --- a/core/module/config/view/autoupdate/autoupdate.php +++ b/core/module/config/view/autoupdate/autoupdate.php @@ -3,101 +3,75 @@ error_reporting(E_ALL); ini_set('display_errors', 1); +// Définir le fichier de journalisation +$logFile = 'update_log.txt'; + // Chemins de travail $repoUrl = 'https://forge.chapril.org/api/v1/repos/ZwiiCMS-Team/ZwiiCMS'; // URL de l'API du dépôt $siteRoot = "."; // Racine du site (répertoire actuel) -echo "

Début du script de mise à jour...

"; +// Afficher le champ HTML pour les logs +echo ''; flush(); ob_flush(); // Appels de fonctions -echo "

Récupération du dernier tag...

"; -flush(); ob_flush(); +logMessage("Début du script de mise à jour..."); +logMessage("Récupération du dernier tag..."); $latestVersion = getLatestTag($repoUrl); -echo "

Dernier tag récupéré : $latestVersion

"; -flush(); ob_flush(); +logMessage("Dernier tag récupéré : $latestVersion"); // Comparer la version actuelle avec la dernière version if (common::ZWII_VERSION === $latestVersion) { - echo "

Aucune mise à jour nécessaire. Version actuelle : " . common::ZWII_VERSION . "

"; + logMessage("Aucune mise à jour nécessaire. Version actuelle : " . common::ZWII_VERSION); exit; } -echo "

Récupération des SHAs des commits associés aux tags...

"; -flush(); ob_flush(); +logMessage("Récupération des SHAs des commits associés aux tags..."); $fromSHA = getCommitSHAFromTag($repoUrl, common::ZWII_VERSION); $toSHA = getCommitSHAFromTag($repoUrl, $latestVersion); -echo "

SHA de départ : $fromSHA, SHA de fin : $toSHA

"; -flush(); ob_flush(); +logMessage("SHA de départ : $fromSHA, SHA de fin : $toSHA"); -// Récupérer les commits entre les deux SHAs sans utiliser /compare endpoint -echo "

Récupération des commits entre les deux SHAs...

"; -flush(); ob_flush(); +logMessage("Récupération des commits entre les deux SHAs..."); $commits = getCommitsManually($repoUrl, $fromSHA, $toSHA); -echo "

Nombre de commits récupérés : " . count($commits) . "

"; -flush(); ob_flush(); +logMessage("Nombre de commits récupérés : " . count($commits)); -// Extraction des fichiers modifiés pour limiter les traitements -echo "

Extraction des fichiers modifiés...

"; -flush(); ob_flush(); +logMessage("Extraction des fichiers modifiés..."); $modifiedFiles = getModifiedFiles($commits); -echo "

Nombre de fichiers modifiés à traiter : " . count($modifiedFiles) . "

"; -flush(); ob_flush(); +logMessage("Nombre de fichiers modifiés à traiter : " . count($modifiedFiles)); // Télécharger et mettre à jour les fichiers modifiés foreach ($modifiedFiles as $file) { - // Vérifier le statut du fichier et traiter uniquement les fichiers ajoutés ou modifiés if (!in_array($file['status'], ['modified', 'added'])) { continue; // Ignorer les fichiers non pertinents } $filePath = $file['filename']; $fileUrl = "https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/raw/$latestVersion/$filePath"; - $localPath = $siteRoot . '/' . $filePath; // Enregistrer à la racine du site + $localPath = $siteRoot . '/' . $filePath; - echo "

Mise à jour du fichier : $filePath

"; - flush(); ob_flush(); + logMessage("Mise à jour du fichier : $filePath"); - // Comparer les dates de modification des fichiers pour éviter les copies inutiles - if (file_exists($localPath)) { - $localModifiedTime = filemtime($localPath); - $remoteHeaders = get_headers($fileUrl, 1); - if (isset($remoteHeaders['Last-Modified'])) { - $remoteModifiedTime = strtotime($remoteHeaders['Last-Modified']); - if ($localModifiedTime >= $remoteModifiedTime) { - echo "

Fichier déjà à jour : $filePath, aucune copie nécessaire.

"; - flush(); ob_flush(); - continue; - } + if (!is_dir(dirname($localPath))) { + logMessage("Création du dossier : " . dirname($localPath)); + if (!mkdir(dirname($localPath), 0755, true)) { + logMessage("Erreur lors de la création du dossier : " . dirname($localPath)); + continue; } } - // Créer le dossier si nécessaire - if (!is_dir(dirname($localPath))) { - echo "

Création du dossier : " . dirname($localPath) . "

"; - flush(); ob_flush(); - mkdir(dirname($localPath), 0755, true); - } - - // Télécharger et remplacer le fichier, avec gestion des erreurs - $fileContent = @file_get_contents($fileUrl); + $fileContent = file_get_contents($fileUrl); if ($fileContent === false) { - echo "

Erreur lors du téléchargement de : $filePath

"; - flush(); ob_flush(); - continue; // Passer au fichier suivant en cas d'erreur + logMessage("Erreur lors du téléchargement de : $fileUrl"); + continue; } - // Écrire le contenu du fichier if (file_put_contents($localPath, $fileContent) === false) { - echo "

Erreur lors de l'écriture de : $localPath

"; - flush(); ob_flush(); + logMessage("Erreur lors de l'écriture de : $localPath"); } else { - echo "

Mise à jour effectuée de : $filePath

"; - flush(); ob_flush(); + logMessage("Mise à jour effectuée de : $filePath"); } } -// Gérer la suppression des fichiers marqués comme supprimés dans les commits foreach ($modifiedFiles as $file) { if ($file['status'] === 'removed') { $filePath = $file['filename']; @@ -105,34 +79,42 @@ foreach ($modifiedFiles as $file) { if (file_exists($localPath)) { if (unlink($localPath)) { - echo "

Suppression du fichier : $filePath

"; + logMessage("Suppression du fichier : $filePath"); } else { - echo "

Erreur lors de la suppression de : $filePath

"; + logMessage("Erreur lors de la suppression de : $filePath"); } - flush(); ob_flush(); } } } -echo "

Mise à jour terminée vers la version : $latestVersion

"; -flush(); ob_flush(); +logMessage("Mise à jour terminée vers la version : $latestVersion"); // Fonctions +/** + * Fonction pour journaliser et afficher les messages + */ +function logMessage($message) { + global $logFile; + // Ajouter le message dans le fichier de log + file_put_contents($logFile, $message . PHP_EOL, FILE_APPEND); + // Afficher le message dans le champ HTML + echo ""; + flush(); ob_flush(); // Forcer l'affichage immédiat +} + /** * Récupère le dernier tag du dépôt. */ function getLatestTag($repoUrl) { $tagsUrl = $repoUrl . '/tags'; - echo "

Accès à l'URL des tags : $tagsUrl

"; - flush(); ob_flush(); + logMessage("Accès à l'URL des tags : $tagsUrl"); $tags = json_decode(file_get_contents($tagsUrl), true); if (!$tags || empty($tags)) { - die("

Impossible de récupérer les tags.

"); + die("Impossible de récupérer les tags."); } - // Retourne le nom du dernier tag return $tags[0]['name']; } @@ -141,68 +123,58 @@ function getLatestTag($repoUrl) { */ function getCommitSHAFromTag($repoUrl, $tag) { $tagsUrl = $repoUrl . '/tags'; - echo "

Récupération des SHAs depuis l'URL : $tagsUrl

"; - flush(); ob_flush(); + logMessage("Récupération des SHAs depuis l'URL : $tagsUrl"); $tags = json_decode(file_get_contents($tagsUrl), true); if (!$tags || empty($tags)) { - die("

Impossible de récupérer les tags.

"); + die("Impossible de récupérer les tags."); } foreach ($tags as $tagInfo) { if ($tagInfo['name'] === $tag) { - echo "

SHA trouvé pour le tag $tag : " . $tagInfo['commit']['sha'] . "

"; - flush(); ob_flush(); + logMessage("SHA trouvé pour le tag $tag : " . $tagInfo['commit']['sha']); return $tagInfo['commit']['sha']; } } - die("

Tag non trouvé : $tag

"); + die("Tag non trouvé : $tag"); } /** - * Récupère manuellement les commits entre deux SHAs en utilisant l'API des commits, avec gestion de la pagination. + * Récupère manuellement les commits entre deux SHAs avec pagination. */ function getCommitsManually($repoUrl, $fromSHA, $toSHA) { $commits = []; $page = 1; $perPage = 100; - echo "

Début de la récupération des commits depuis $toSHA jusqu'à $fromSHA...

"; - flush(); ob_flush(); + logMessage("Début de la récupération des commits depuis $toSHA jusqu'à $fromSHA..."); while (true) { $commitsUrl = "$repoUrl/commits?sha=$toSHA&per_page=$perPage&page=$page"; - echo "

Accès à l'URL des commits : $commitsUrl

"; - flush(); ob_flush(); + logMessage("Accès à l'URL des commits : $commitsUrl"); $response = json_decode(file_get_contents($commitsUrl), true); if (!$response || empty($response)) { - echo "

Aucune autre page disponible, fin de récupération.

"; - flush(); ob_flush(); - break; // Arrête si aucune autre page de commits n'est disponible + logMessage("Aucune autre page disponible, fin de récupération."); + break; } - echo "

Commits récupérés sur la page $page : " . count($response) . "

"; - flush(); ob_flush(); + logMessage("Commits récupérés sur la page $page : " . count($response)); foreach ($response as $commit) { - echo "

SHA récupéré : " . $commit['sha'] . "

"; - flush(); ob_flush(); + logMessage("SHA récupéré : " . $commit['sha']); $commits[] = $commit; if ($commit['sha'] === $fromSHA) { - echo "

SHA de départ trouvé : $fromSHA

"; - flush(); ob_flush(); - // Arrêter la récupération une fois qu'on atteint le SHA de départ + logMessage("SHA de départ trouvé : $fromSHA"); return $commits; } } - // Passe à la page suivante $page++; } - die("

Impossible de trouver le SHA de départ dans les commits récupérés.

"); + die("Impossible de trouver le SHA de départ dans les commits récupérés."); } /** @@ -211,15 +183,13 @@ function getCommitsManually($repoUrl, $fromSHA, $toSHA) { function getModifiedFiles($commits) { $modifiedFiles = []; foreach ($commits as $commit) { - echo "

Extraction des fichiers modifiés pour le commit : " . $commit['sha'] . "

"; - flush(); ob_flush(); + logMessage("Extraction des fichiers modifiés pour le commit : " . $commit['sha']); $commitUrl = $commit['url']; $commitDetails = json_decode(file_get_contents($commitUrl), true); if (isset($commitDetails['files'])) { foreach ($commitDetails['files'] as $file) { - echo "

Fichier modifié trouvé : " . $file['filename'] . " (status: " . $file['status'] . ")

"; - flush(); ob_flush(); + logMessage("Fichier modifié trouvé : " . $file['filename'] . " (status: " . $file['status'] . ")"); $modifiedFiles[] = $file; } }