'; flush(); ob_flush(); // Appels de fonctions logMessage("Début du script de mise à jour..."); logMessage("Récupération du dernier tag..."); $latestVersion = getLatestTag($repoUrl); logMessage("Dernier tag récupéré : $latestVersion"); // Comparer la version actuelle avec la dernière version if (common::ZWII_VERSION === $latestVersion) { logMessage("Aucune mise à jour nécessaire. Version actuelle : " . common::ZWII_VERSION); exit; } logMessage("Récupération des SHAs des commits associés aux tags..."); $fromSHA = getCommitSHAFromTag($repoUrl, common::ZWII_VERSION); $toSHA = getCommitSHAFromTag($repoUrl, $latestVersion); logMessage("SHA de départ : $fromSHA, SHA de fin : $toSHA"); logMessage("Récupération des commits entre les deux SHAs..."); $commits = getCommitsManually($repoUrl, $fromSHA, $toSHA); logMessage("Nombre de commits récupérés : " . count($commits)); logMessage("Extraction des fichiers modifiés..."); $modifiedFiles = getModifiedFiles($commits); logMessage("Nombre de fichiers modifiés à traiter : " . count($modifiedFiles)); // Télécharger et mettre à jour les fichiers modifiés foreach ($modifiedFiles as $file) { 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; logMessage("Mise à jour du fichier : $filePath"); 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; } } $fileContent = file_get_contents($fileUrl); if ($fileContent === false) { logMessage("Erreur lors du téléchargement de : $fileUrl"); continue; } if (file_put_contents($localPath, $fileContent) === false) { logMessage("Erreur lors de l'écriture de : $localPath"); } else { logMessage("Mise à jour effectuée de : $filePath"); } } foreach ($modifiedFiles as $file) { if ($file['status'] === 'removed') { $filePath = $file['filename']; $localPath = $siteRoot . '/' . $filePath; if (file_exists($localPath)) { if (unlink($localPath)) { logMessage("Suppression du fichier : $filePath"); } else { logMessage("Erreur lors de la suppression de : $filePath"); } } } } logMessage("Mise à jour terminée vers la version : $latestVersion"); // Fonctions /** * Fonction pour journaliser et afficher les messages */ function logMessage($message) { global $logFile; // Vérifier que le fichier de log est bien défini if (!empty($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'; 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."); } return $tags[0]['name']; } /** * Récupère le SHA du commit lié à un tag spécifique. */ function getCommitSHAFromTag($repoUrl, $tag) { $tagsUrl = $repoUrl . '/tags'; 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."); } foreach ($tags as $tagInfo) { if ($tagInfo['name'] === $tag) { logMessage("SHA trouvé pour le tag $tag : " . $tagInfo['commit']['sha']); return $tagInfo['commit']['sha']; } } die("Tag non trouvé : $tag"); } /** * Récupère manuellement les commits entre deux SHAs avec pagination. */ function getCommitsManually($repoUrl, $fromSHA, $toSHA) { $commits = []; $page = 1; $perPage = 100; 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"; logMessage("Accès à l'URL des commits : $commitsUrl"); $response = json_decode(file_get_contents($commitsUrl), true); if (!$response || empty($response)) { logMessage("Aucune autre page disponible, fin de récupération."); break; } logMessage("Commits récupérés sur la page $page : " . count($response)); foreach ($response as $commit) { logMessage("SHA récupéré : " . $commit['sha']); $commits[] = $commit; if ($commit['sha'] === $fromSHA) { logMessage("SHA de départ trouvé : $fromSHA"); return $commits; } } $page++; } die("Impossible de trouver le SHA de départ dans les commits récupérés."); } /** * Extrait les fichiers modifiés depuis une liste de commits. */ function getModifiedFiles($commits) { $modifiedFiles = []; foreach ($commits as $commit) { 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) { logMessage("Fichier modifié trouvé : " . $file['filename'] . " (status: " . $file['status'] . ")"); $modifiedFiles[] = $file; } } } return $modifiedFiles; }