Version ok

This commit is contained in:
Fred Tempez 2024-09-19 21:33:03 +02:00
parent e72a9c052f
commit ef2c596997

View File

@ -1,65 +1,121 @@
<?php
// Activer l'affichage des erreurs
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 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
echo "<p>Début du script de mise à jour...</p>";
flush(); ob_flush();
// Appels de fonctions
echo "<p>Récupération du dernier tag...</p>";
flush(); ob_flush();
$latestVersion = getLatestTag($repoUrl);
echo "<p>Dernier tag récupéré : $latestVersion</p>";
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 . "\n";
echo "<p>Aucune mise à jour nécessaire. Version actuelle : " . common::ZWII_VERSION . "</p>";
exit;
}
// Récupérer les SHAs des commits associés aux tags
echo "<p>Récupération des SHAs des commits associés aux tags...</p>";
flush(); ob_flush();
$fromSHA = getCommitSHAFromTag($repoUrl, common::ZWII_VERSION);
$toSHA = getCommitSHAFromTag($repoUrl, $latestVersion);
echo "<p>SHA de départ : $fromSHA, SHA de fin : $toSHA</p>";
flush(); ob_flush();
// Récupérer les commits entre les deux SHAs
$commits = getCommitsBetweenSHAs($repoUrl, $fromSHA, $toSHA);
// Récupérer les commits entre les deux SHAs sans utiliser /compare endpoint
echo "<p>Récupération des commits entre les deux SHAs...</p>";
flush(); ob_flush();
$commits = getCommitsManually($repoUrl, $fromSHA, $toSHA);
echo "<p>Nombre de commits récupérés : " . count($commits) . "</p>";
flush(); ob_flush();
// Lister les fichiers modifiés pour chaque commit
// Limiter le traitement des fichiers pour éviter des itérations inutiles
echo "<p>Extraction des fichiers modifiés...</p>";
flush(); ob_flush();
$modifiedFiles = getModifiedFiles($commits);
echo "<p>Nombre de fichiers modifiés à traiter : " . count($modifiedFiles) . "</p>";
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 = __DIR__ . '/' . $filePath;
$localPath = $siteRoot . '/' . $filePath; // Enregistrer à la racine du site
echo "<p>Mise à jour du fichier : $filePath</p>";
flush(); ob_flush();
// Créer le dossier si nécessaire
if (!is_dir(dirname($localPath))) {
echo "<p>Création du dossier : " . dirname($localPath) . "</p>";
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\n";
echo "<p>Erreur lors du téléchargement de : $filePath</p>";
flush(); ob_flush();
continue; // Passer au fichier suivant en cas d'erreur
}
file_put_contents($localPath, $fileContent);
echo "Mise à jour de : $filePath\n";
// Gérer la suppression de fichiers (si marqué comme supprimé dans le commit)
if ($file['status'] === 'removed' && file_exists($localPath)) {
unlink($localPath);
echo "Suppression de : $filePath\n";
// Écrire le contenu du fichier
if (file_put_contents($localPath, $fileContent) === false) {
echo "<p>Erreur lors de l'écriture de : $localPath</p>";
flush(); ob_flush();
} else {
echo "<p>Mise à jour effectuée de : $filePath</p>";
flush(); ob_flush();
}
}
echo "Mise à jour terminée vers la version : $latestVersion\n";
// 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 "<p>Suppression du fichier : $filePath</p>";
} else {
echo "<p>Erreur lors de la suppression de : $filePath</p>";
}
flush(); ob_flush();
}
}
}
echo "<p>Mise à jour terminée vers la version : $latestVersion</p>";
flush(); ob_flush();
// Fonctions
/**
* Récupère le dernier tag du dépôt.
*/
function getLatestTag($repoUrl) {
$tagsUrl = $repoUrl . '/tags';
echo "<p>Accès à l'URL des tags : $tagsUrl</p>";
flush(); ob_flush();
$tags = json_decode(file_get_contents($tagsUrl), true);
if (!$tags || empty($tags)) {
die('Impossible de récupérer les tags.');
die("<p>Impossible de récupérer les tags.</p>");
}
// Retourne le nom du dernier tag
@ -71,33 +127,68 @@ function getLatestTag($repoUrl) {
*/
function getCommitSHAFromTag($repoUrl, $tag) {
$tagsUrl = $repoUrl . '/tags';
echo "<p>Récupération des SHAs depuis l'URL : $tagsUrl</p>";
flush(); ob_flush();
$tags = json_decode(file_get_contents($tagsUrl), true);
if (!$tags || empty($tags)) {
die('Impossible de récupérer les tags.');
die("<p>Impossible de récupérer les tags.</p>");
}
foreach ($tags as $tagInfo) {
if ($tagInfo['name'] === $tag) {
echo "<p>SHA trouvé pour le tag $tag : " . $tagInfo['commit']['sha'] . "</p>";
flush(); ob_flush();
return $tagInfo['commit']['sha'];
}
}
die('Tag non trouvé : ' . $tag);
die("<p>Tag non trouvé : $tag</p>");
}
/**
* Récupère les commits entre deux SHAs spécifiques.
* Récupère manuellement les commits entre deux SHAs en utilisant l'API des commits, avec gestion de la pagination.
*/
function getCommitsBetweenSHAs($repoUrl, $fromSHA, $toSHA) {
$compareUrl = $repoUrl . "/compare/$fromSHA...$toSHA";
$compare = json_decode(file_get_contents($compareUrl), true);
function getCommitsManually($repoUrl, $fromSHA, $toSHA) {
$commits = [];
$page = 1;
$perPage = 100;
if (!$compare || !isset($compare['commits']) || empty($compare['commits'])) {
die('Impossible de récupérer les commits ou fichiers modifiés.');
echo "<p>Début de la récupération des commits depuis $toSHA jusqu'à $fromSHA...</p>";
flush(); ob_flush();
while (true) {
$commitsUrl = "$repoUrl/commits?sha=$toSHA&per_page=$perPage&page=$page";
echo "<p>Accès à l'URL des commits : $commitsUrl</p>";
flush(); ob_flush();
$response = json_decode(file_get_contents($commitsUrl), true);
if (!$response || empty($response)) {
echo "<p>Aucune autre page disponible, fin de récupération.</p>";
flush(); ob_flush();
break; // Arrête si aucune autre page de commits n'est disponible
}
echo "<p>Commits récupérés sur la page $page : " . count($response) . "</p>";
flush(); ob_flush();
foreach ($response as $commit) {
echo "<p>SHA récupéré : " . $commit['sha'] . "</p>";
flush(); ob_flush();
$commits[] = $commit;
if ($commit['sha'] === $fromSHA) {
echo "<p>SHA de départ trouvé : $fromSHA</p>";
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++;
}
return $compare['commits'];
die("<p>Impossible de trouver le SHA de départ dans les commits récupérés.</p>");
}
/**
@ -106,15 +197,19 @@ function getCommitsBetweenSHAs($repoUrl, $fromSHA, $toSHA) {
function getModifiedFiles($commits) {
$modifiedFiles = [];
foreach ($commits as $commit) {
echo "<p>Extraction des fichiers modifiés pour le commit : " . $commit['sha'] . "</p>";
flush(); ob_flush();
$commitUrl = $commit['url'];
$commitDetails = json_decode(file_get_contents($commitUrl), true);
if (isset($commitDetails['files'])) {
foreach ($commitDetails['files'] as $file) {
echo "<p>Fichier modifié trouvé : " . $file['filename'] . " (status: " . $file['status'] . ")</p>";
flush(); ob_flush();
$modifiedFiles[] = $file;
}
}
}
return $modifiedFiles;
}
?>