ZwiiCMS/core/module/config/view/autoupdate/autoupdate.php

121 lines
3.7 KiB
PHP
Raw Normal View History

2024-09-19 13:27:42 +02:00
<?php
// 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 20:34:57 +02:00
// Appels de fonctions
$latestVersion = getLatestTag($repoUrl);
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) {
echo "Aucune mise à jour nécessaire. Version actuelle : " . common::ZWII_VERSION . "\n";
2024-09-19 13:27:42 +02:00
exit;
}
2024-09-19 20:34:57 +02:00
// Récupérer les SHAs des commits associés aux tags
$fromSHA = getCommitSHAFromTag($repoUrl, common::ZWII_VERSION);
$toSHA = getCommitSHAFromTag($repoUrl, $latestVersion);
2024-09-19 13:27:42 +02:00
2024-09-19 20:34:57 +02:00
// Récupérer les commits entre les deux SHAs
$commits = getCommitsBetweenSHAs($repoUrl, $fromSHA, $toSHA);
2024-09-19 13:27:42 +02:00
2024-09-19 20:34:57 +02:00
// Lister les fichiers modifiés pour chaque commit
$modifiedFiles = getModifiedFiles($commits);
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) {
$filePath = $file['filename'];
$fileUrl = "https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS/raw/$latestVersion/$filePath";
$localPath = __DIR__ . '/' . $filePath;
// Créer le dossier si nécessaire
if (!is_dir(dirname($localPath))) {
mkdir(dirname($localPath), 0755, true);
}
2024-09-19 20:34:57 +02:00
// 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\n";
continue; // Passer au fichier suivant en cas d'erreur
}
file_put_contents($localPath, $fileContent);
2024-09-19 13:27:42 +02:00
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";
}
}
echo "Mise à jour terminée vers la version : $latestVersion\n";
2024-09-19 20:34:57 +02:00
// Fonctions
/**
* Récupère le dernier tag du dépôt.
*/
function getLatestTag($repoUrl) {
$tagsUrl = $repoUrl . '/tags';
$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';
$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) {
return $tagInfo['commit']['sha'];
}
}
die('Tag non trouvé : ' . $tag);
}
/**
* Récupère les commits entre deux SHAs spécifiques.
*/
function getCommitsBetweenSHAs($repoUrl, $fromSHA, $toSHA) {
$compareUrl = $repoUrl . "/compare/$fromSHA...$toSHA";
$compare = json_decode(file_get_contents($compareUrl), true);
if (!$compare || !isset($compare['commits']) || empty($compare['commits'])) {
die('Impossible de récupérer les commits ou fichiers modifiés.');
}
return $compare['commits'];
}
/**
* Extrait les fichiers modifiés depuis une liste de commits.
*/
function getModifiedFiles($commits) {
$modifiedFiles = [];
foreach ($commits as $commit) {
$commitUrl = $commit['url'];
$commitDetails = json_decode(file_get_contents($commitUrl), true);
if (isset($commitDetails['files'])) {
foreach ($commitDetails['files'] as $file) {
$modifiedFiles[] = $file;
}
}
}
return $modifiedFiles;
}
2024-09-19 13:27:42 +02:00
?>