From 8426963b2f26c79ef0432f85f036e7eb724c9f79 Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Tue, 16 Apr 2024 18:07:11 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20ne=20pas=20conserver=20un=20double=20des?= =?UTF-8?q?=20fichiers=20calcules=20inchang=C3=A9s,=20mais=20uniquement=20?= =?UTF-8?q?un=20fichier=20timestamp=20'.last'=20On=20modifie=20le=20retour?= =?UTF-8?q?=20de=20la=20fonction=20ecrire=5Ffichier=5Fcalcule=5Fsi=5Fmodif?= =?UTF-8?q?ie()=20qui=20retourne=20un=20null=20si=20fichier=20non=20modifi?= =?UTF-8?q?=C3=A9=20mais=20pas=20d'erreur=20(ie=20le=20nouveau=20=C3=A9tai?= =?UTF-8?q?t=20identique=20=C3=A0=20l'ancien=20fichier,=20conserv=C3=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs: #4921 --- ecrire/inc/filtres.php | 11 ++++++++--- ecrire/inc/flock.php | 20 ++++++++++---------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php index 6f8188cb00..2b30299bc4 100644 --- a/ecrire/inc/filtres.php +++ b/ecrire/inc/filtres.php @@ -3671,10 +3671,10 @@ function filtre_balise_svg_dist($img, $alt = '', $class = null, $size = null) { /** * Génère une balise HTML `img` ou un `svg` inline suivant le nom du fichier. - * + * * @uses filtre_balise_img_dist() * @uses filtre_balise_svg_dist() - * + * * @param string $img * chemin vers un fichier ou balise `<img src='...' />` (generee par un filtre image par exemple) * @param string $alt @@ -5052,7 +5052,12 @@ function produire_fond_statique($fond, $contexte = [], $options = [], string $co $comment .= "}\n md5:" . md5((string) $contenu) . " */\n"; } // et ecrire le fichier si il change - ecrire_fichier_calcule_si_modifie($filename, $comment . $contenu, false, true); + if (ecrire_fichier_calcule_si_modifie($filename, $comment . $contenu) !== false) { + // on garde une trace de la derniere date de calcul + // un touch pourrait suffire mais il faut nettoyer les vieux fichiers .last qui contiennent une copie du fichier + // cf https://git.spip.net/spip/spip/-/issues/4921 + file_put_contents($filename . '.last', ''); + } } return timestamp($filename); diff --git a/ecrire/inc/flock.php b/ecrire/inc/flock.php index 965bde742b..1ef8d4782c 100644 --- a/ecrire/inc/flock.php +++ b/ecrire/inc/flock.php @@ -333,10 +333,13 @@ function ecrire_fichier_securise($fichier, $contenu, $ecrire_quand_meme = false, * @param string $fichier * @param string $contenu * @param bool $force - * @return bool + * @return ?bool + * false en cas d'erreur + * true en cas d'ecriture suite à modification + * null si fichier inchangé car pas de modif */ -function ecrire_fichier_calcule_si_modifie($fichier, $contenu, $force = false, $use_copy = false) { - $fichier_tmp = $fichier . '.last'; +function ecrire_fichier_calcule_si_modifie($fichier, $contenu, $force = false) { + $fichier_tmp = $fichier . '.tmp.' . uniqid(); if (!ecrire_fichier($fichier_tmp, $contenu, true)) { return false; } @@ -345,16 +348,13 @@ function ecrire_fichier_calcule_si_modifie($fichier, $contenu, $force = false, $ || !file_exists($fichier) || md5_file($fichier) !== md5_file($fichier_tmp) ) { - if ($use_copy) { - @copy($fichier_tmp, $fichier); - } - else { - @rename($fichier_tmp, $fichier); - } + @rename($fichier_tmp, $fichier); // eviter que PHP ne reserve le vieux timestamp clearstatcache(true, $fichier); + return true; } - return true; + @unlink($fichier_tmp); + return null; } -- GitLab