Début du script de mise à jour...
"; flush(); ob_flush(); // Appels de fonctions echo "Récupération du dernier tag...
"; flush(); ob_flush(); $latestVersion = getLatestTag($repoUrl); echo "Dernier tag récupéré : $latestVersion
"; flush(); ob_flush(); // 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 . "
"; exit; } echo "Récupération des SHAs des commits associés aux tags...
"; flush(); ob_flush(); $fromSHA = getCommitSHAFromTag($repoUrl, common::ZWII_VERSION); $toSHA = getCommitSHAFromTag($repoUrl, $latestVersion); echo "SHA de départ : $fromSHA, SHA de fin : $toSHA
"; flush(); ob_flush(); // 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(); $commits = getCommitsManually($repoUrl, $fromSHA, $toSHA); echo "Nombre de commits récupérés : " . count($commits) . "
"; flush(); ob_flush(); // Limiter le traitement des fichiers pour éviter des itérations inutiles echo "Extraction des fichiers modifiés...
"; flush(); ob_flush(); $modifiedFiles = getModifiedFiles($commits); echo "Nombre de fichiers modifiés à traiter : " . count($modifiedFiles) . "
"; flush(); ob_flush(); // 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 echo "Mise à jour du fichier : $filePath
"; flush(); ob_flush(); // 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); if ($fileContent === false) { echo "Erreur lors du téléchargement de : $filePath
"; flush(); ob_flush(); continue; // Passer au fichier suivant en cas d'erreur } // Écrire le contenu du fichier if (file_put_contents($localPath, $fileContent) === false) { echo "Erreur lors de l'écriture de : $localPath
"; flush(); ob_flush(); } else { echo "Mise à jour effectuée de : $filePath
"; flush(); ob_flush(); } } // 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']; $localPath = $siteRoot . '/' . $filePath; if (file_exists($localPath)) { if (unlink($localPath)) { echo "Suppression du fichier : $filePath
"; } else { echo "Erreur lors de la suppression de : $filePath
"; } flush(); ob_flush(); } } } echo "Mise à jour terminée vers la version : $latestVersion
"; flush(); ob_flush(); // Fonctions /** * 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(); $tags = json_decode(file_get_contents($tagsUrl), true); if (!$tags || empty($tags)) { die("Impossible de récupérer les tags.
"); } // Retourne le nom du dernier tag return $tags[0]['name']; } /** * Récupère le SHA du commit lié à un tag spécifique. */ function getCommitSHAFromTag($repoUrl, $tag) { $tagsUrl = $repoUrl . '/tags'; echo "Récupération des SHAs depuis l'URL : $tagsUrl
"; flush(); ob_flush(); $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) { echo "SHA trouvé pour le tag $tag : " . $tagInfo['commit']['sha'] . "
"; flush(); ob_flush(); return $tagInfo['commit']['sha']; } } 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. */ 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(); while (true) { $commitsUrl = "$repoUrl/commits?sha=$toSHA&per_page=$perPage&page=$page"; echo "Accès à l'URL des commits : $commitsUrl
"; flush(); ob_flush(); $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 } echo "Commits récupérés sur la page $page : " . count($response) . "
"; flush(); ob_flush(); foreach ($response as $commit) { echo "SHA récupéré : " . $commit['sha'] . "
"; flush(); ob_flush(); $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 return $commits; } } // Passe à la page suivante $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) { echo "Extraction des fichiers modifiés pour le commit : " . $commit['sha'] . "
"; flush(); ob_flush(); $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(); $modifiedFiles[] = $file; } } } return $modifiedFiles; }