202 lines
6.8 KiB
PHP
Raw Normal View History

2024-09-19 13:27:42 +02:00
<?php
2024-09-19 21:33:03 +02:00
// Activer l'affichage des erreurs
error_reporting(E_ALL);
ini_set('display_errors', 1);
2024-09-20 11:18:41 +02:00
// Définir le fichier de journalisation (assurez-vous que le chemin est valide)
$logFile = 'update_log'; // Utiliser __DIR__ pour s'assurer que le fichier est dans le même dossier que le script
2024-09-20 10:44:54 +02:00
2024-09-19 13:27:42 +02:00
// Chemins de travail
$repoUrl = 'https://forge.chapril.org/api/v1/repos/ZwiiCMS-Team/ZwiiCMS'; // URL de l'API du dépôt
2024-09-19 21:41:48 +02:00
$siteRoot = "."; // Racine du site (répertoire actuel)
2024-09-19 21:33:03 +02:00
2024-09-20 10:44:54 +02:00
// Afficher le champ HTML pour les logs
echo '<textarea id="logOutput" readonly style="width: 100%; height: 300px;"></textarea>';
2024-09-19 21:33:03 +02:00
flush(); ob_flush();
2024-09-19 13:27:42 +02:00
2024-09-19 20:34:57 +02:00
// Appels de fonctions
2024-09-20 10:44:54 +02:00
logMessage("Début du script de mise à jour...");
logMessage("Récupération du dernier tag...");
2024-09-19 20:34:57 +02:00
$latestVersion = getLatestTag($repoUrl);
2024-09-20 10:44:54 +02:00
logMessage("Dernier tag récupéré : $latestVersion");
2024-09-19 13:27:42 +02:00
2024-09-19 20:34:57 +02:00
// Comparer la version actuelle avec la dernière version
if (common::ZWII_VERSION === $latestVersion) {
2024-09-20 10:44:54 +02:00
logMessage("Aucune mise à jour nécessaire. Version actuelle : " . common::ZWII_VERSION);
2024-09-19 13:27:42 +02:00
exit;
}
2024-09-20 10:44:54 +02:00
logMessage("Récupération des SHAs des commits associés aux tags...");
2024-09-19 20:34:57 +02:00
$fromSHA = getCommitSHAFromTag($repoUrl, common::ZWII_VERSION);
$toSHA = getCommitSHAFromTag($repoUrl, $latestVersion);
2024-09-20 10:44:54 +02:00
logMessage("SHA de départ : $fromSHA, SHA de fin : $toSHA");
2024-09-19 21:33:03 +02:00
2024-09-20 10:44:54 +02:00
logMessage("Récupération des commits entre les deux SHAs...");
2024-09-19 21:33:03 +02:00
$commits = getCommitsManually($repoUrl, $fromSHA, $toSHA);
2024-09-20 10:44:54 +02:00
logMessage("Nombre de commits récupérés : " . count($commits));
2024-09-19 21:33:03 +02:00
2024-09-20 10:44:54 +02:00
logMessage("Extraction des fichiers modifiés...");
2024-09-19 20:34:57 +02:00
$modifiedFiles = getModifiedFiles($commits);
2024-09-20 10:44:54 +02:00
logMessage("Nombre de fichiers modifiés à traiter : " . count($modifiedFiles));
2024-09-19 13:27:42 +02:00
2024-09-19 20:34:57 +02:00
// Télécharger et mettre à jour les fichiers modifiés
2024-09-19 13:27:42 +02:00
foreach ($modifiedFiles as $file) {
2024-09-19 21:33:03 +02:00
if (!in_array($file['status'], ['modified', 'added'])) {
continue; // Ignorer les fichiers non pertinents
}
2024-09-19 13:27:42 +02:00
$filePath = $file['filename'];
$fileUrl = "https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/raw/$latestVersion/$filePath";
2024-09-20 10:44:54 +02:00
$localPath = $siteRoot . '/' . $filePath;
logMessage("Mise à jour du fichier : $filePath");
2024-09-19 21:41:48 +02:00
2024-09-19 13:27:42 +02:00
if (!is_dir(dirname($localPath))) {
2024-09-20 10:44:54 +02:00
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;
}
2024-09-19 13:27:42 +02:00
}
2024-09-20 10:44:54 +02:00
$fileContent = file_get_contents($fileUrl);
2024-09-19 20:34:57 +02:00
if ($fileContent === false) {
2024-09-20 10:44:54 +02:00
logMessage("Erreur lors du téléchargement de : $fileUrl");
continue;
2024-09-19 20:34:57 +02:00
}
2024-09-19 13:27:42 +02:00
2024-09-19 21:33:03 +02:00
if (file_put_contents($localPath, $fileContent) === false) {
2024-09-20 10:44:54 +02:00
logMessage("Erreur lors de l'écriture de : $localPath");
2024-09-19 21:33:03 +02:00
} else {
2024-09-20 10:44:54 +02:00
logMessage("Mise à jour effectuée de : $filePath");
2024-09-19 13:27:42 +02:00
}
}
2024-09-19 21:33:03 +02:00
foreach ($modifiedFiles as $file) {
if ($file['status'] === 'removed') {
$filePath = $file['filename'];
$localPath = $siteRoot . '/' . $filePath;
if (file_exists($localPath)) {
if (unlink($localPath)) {
2024-09-20 10:44:54 +02:00
logMessage("Suppression du fichier : $filePath");
2024-09-19 21:33:03 +02:00
} else {
2024-09-20 10:44:54 +02:00
logMessage("Erreur lors de la suppression de : $filePath");
2024-09-19 21:33:03 +02:00
}
}
}
}
2024-09-20 10:44:54 +02:00
logMessage("Mise à jour terminée vers la version : $latestVersion");
2024-09-19 20:34:57 +02:00
// Fonctions
2024-09-19 21:33:03 +02:00
2024-09-20 10:44:54 +02:00
/**
* Fonction pour journaliser et afficher les messages
*/
function logMessage($message) {
global $logFile;
2024-09-20 11:18:41 +02:00
// 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);
}
2024-09-20 10:44:54 +02:00
// Afficher le message dans le champ HTML
echo "<script>document.getElementById('logOutput').value += `$message\n`;</script>";
flush(); ob_flush(); // Forcer l'affichage immédiat
}
2024-09-19 20:34:57 +02:00
/**
* Récupère le dernier tag du dépôt.
*/
function getLatestTag($repoUrl) {
$tagsUrl = $repoUrl . '/tags';
2024-09-20 10:44:54 +02:00
logMessage("Accès à l'URL des tags : $tagsUrl");
2024-09-19 20:34:57 +02:00
$tags = json_decode(file_get_contents($tagsUrl), true);
if (!$tags || empty($tags)) {
2024-09-20 10:44:54 +02:00
die("Impossible de récupérer les tags.");
2024-09-19 20:34:57 +02:00
}
return $tags[0]['name'];
}
/**
* Récupère le SHA du commit lié à un tag spécifique.
*/
function getCommitSHAFromTag($repoUrl, $tag) {
$tagsUrl = $repoUrl . '/tags';
2024-09-20 10:44:54 +02:00
logMessage("Récupération des SHAs depuis l'URL : $tagsUrl");
2024-09-19 20:34:57 +02:00
$tags = json_decode(file_get_contents($tagsUrl), true);
if (!$tags || empty($tags)) {
2024-09-20 10:44:54 +02:00
die("Impossible de récupérer les tags.");
2024-09-19 20:34:57 +02:00
}
foreach ($tags as $tagInfo) {
if ($tagInfo['name'] === $tag) {
2024-09-20 10:44:54 +02:00
logMessage("SHA trouvé pour le tag $tag : " . $tagInfo['commit']['sha']);
2024-09-19 20:34:57 +02:00
return $tagInfo['commit']['sha'];
}
}
2024-09-20 10:44:54 +02:00
die("Tag non trouvé : $tag");
2024-09-19 20:34:57 +02:00
}
/**
2024-09-20 10:44:54 +02:00
* Récupère manuellement les commits entre deux SHAs avec pagination.
2024-09-19 20:34:57 +02:00
*/
2024-09-19 21:33:03 +02:00
function getCommitsManually($repoUrl, $fromSHA, $toSHA) {
$commits = [];
$page = 1;
$perPage = 100;
2024-09-20 10:44:54 +02:00
logMessage("Début de la récupération des commits depuis $toSHA jusqu'à $fromSHA...");
2024-09-19 21:33:03 +02:00
while (true) {
$commitsUrl = "$repoUrl/commits?sha=$toSHA&per_page=$perPage&page=$page";
2024-09-20 10:44:54 +02:00
logMessage("Accès à l'URL des commits : $commitsUrl");
2024-09-19 21:33:03 +02:00
$response = json_decode(file_get_contents($commitsUrl), true);
if (!$response || empty($response)) {
2024-09-20 10:44:54 +02:00
logMessage("Aucune autre page disponible, fin de récupération.");
break;
2024-09-19 21:33:03 +02:00
}
2024-09-19 20:34:57 +02:00
2024-09-20 10:44:54 +02:00
logMessage("Commits récupérés sur la page $page : " . count($response));
2024-09-19 21:33:03 +02:00
foreach ($response as $commit) {
2024-09-20 10:44:54 +02:00
logMessage("SHA récupéré : " . $commit['sha']);
2024-09-19 21:33:03 +02:00
$commits[] = $commit;
if ($commit['sha'] === $fromSHA) {
2024-09-20 10:44:54 +02:00
logMessage("SHA de départ trouvé : $fromSHA");
2024-09-19 21:33:03 +02:00
return $commits;
}
}
$page++;
2024-09-19 20:34:57 +02:00
}
2024-09-20 10:44:54 +02:00
die("Impossible de trouver le SHA de départ dans les commits récupérés.");
2024-09-19 20:34:57 +02:00
}
/**
* Extrait les fichiers modifiés depuis une liste de commits.
*/
function getModifiedFiles($commits) {
$modifiedFiles = [];
foreach ($commits as $commit) {
2024-09-20 10:44:54 +02:00
logMessage("Extraction des fichiers modifiés pour le commit : " . $commit['sha']);
2024-09-19 20:34:57 +02:00
$commitUrl = $commit['url'];
$commitDetails = json_decode(file_get_contents($commitUrl), true);
if (isset($commitDetails['files'])) {
foreach ($commitDetails['files'] as $file) {
2024-09-20 10:44:54 +02:00
logMessage("Fichier modifié trouvé : " . $file['filename'] . " (status: " . $file['status'] . ")");
2024-09-19 20:34:57 +02:00
$modifiedFiles[] = $file;
}
}
}
return $modifiedFiles;
}