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