tikz-gallery-generator

Custum build of stapix for tikz.pablopie.xyz

Commit
3bb8e16c40b3805213d1bc10e570c53c0528c0d7
Parent
22e6169799680a5c60015ebb142561e54370a99a
Author
Pablo <pablo-pie@riseup.net>
Date

Tucked file metadata inside GalleryEntry

Thucked the call to fs::symlink_metadata inside the parsing routine

Diffstat

2 files changed, 27 insertions, 29 deletions

Status File Name N° Changes Insertions Deletions
Modified src/gallery_entry.rs 6 4 2
Modified src/main.rs 50 23 27
diff --git a/src/gallery_entry.rs b/src/gallery_entry.rs
@@ -2,7 +2,7 @@ use serde::{
     de::{Deserializer, Error, Unexpected},
     Deserialize,
 };
-use std::{fmt::{self, Display}, path::PathBuf};
+use std::{fmt::{self, Display}, path::PathBuf, fs::{self, Metadata}};
 
 const LICENSES: &[&str] = &[
     "proprietary",
@@ -49,7 +49,7 @@ const LICENSES: &[&str] = &[
 const FILE_FORMATS: &[&str] = &["tikz", "eps", "png", "jpeg", "jpg"];
 
 /// Info on a individual entry on the gallery
-#[derive(Debug, Clone, PartialEq, Eq)]
+#[derive(Debug, Clone)]
 pub struct GalleryEntry {
     pub path: PathBuf,
     pub file_name: String,
@@ -60,6 +60,7 @@ pub struct GalleryEntry {
     pub source: Option<String>,
     pub author: String,
     pub author_url: Option<String>,
+    pub metadata: Option<Metadata>,
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -254,6 +255,7 @@ impl<'de> Deserialize<'de> for GalleryEntry {
                 caption,
                 author: author.trim().to_string(),
                 author_url: author_url.map(|s| s.trim().to_string()),
+                metadata: fs::symlink_metadata(&path).ok(),
                 license,
             })
         } else {
diff --git a/src/main.rs b/src/main.rs
@@ -6,7 +6,7 @@ use std::{
     fmt::{self, Display},
     fs::{self, File},
     io::{self, Write},
-    path::{PathBuf, Path},
+    path::PathBuf,
     process::{ExitCode, Command},
     sync::mpsc,
     os::unix,
@@ -255,8 +255,12 @@ fn render_pic_page(pic: &GalleryEntry, full_build: bool) -> RenderResult {
 
     // Only try to re-render HTML page in case the page is older than the
     // image file
-    if !full_build && !needs_update(&path, &pic.path) {
-        return RenderResult::Skipped;
+    if !full_build {
+        if let (Ok(path_m), Some(pic_m)) = (fs::metadata(&path), &pic.metadata) {
+            if path_m.modified().unwrap() > pic_m.modified().unwrap() {
+                return RenderResult::Skipped;
+            }
+        }
     }
 
     let mut f = match File::create(&path) {
@@ -433,14 +437,20 @@ fn write_license(f: &mut File) -> io::Result<()> {
 fn render_thumbnail(pic: GalleryEntry, full_build: bool) -> RenderResult {
     let thumb_path = thumb_path(&pic);
 
-    // Only try to render thumbnail in case the thumbnail file in the machine
-    // is older than the source file
-    if !full_build && !needs_update(&thumb_path, &pic.path) {
-        warnln!(
-            "Skipped rendering the thumbnail for {name:?} (use {FULL_BUILD_OPT} to overwrite)",
-            name = pic.file_name
-        );
-        return RenderResult::Skipped;
+    // Here we do not want to call fs::symlink_metada: we want to know when was
+    // the symlink last updated
+    let thumb_meta = fs::metadata(&thumb_path);
+
+    if !full_build {
+        if let (Ok(thumb_m), Some(pic_m)) = (&thumb_meta, &pic.metadata) {
+            if thumb_m.modified().unwrap() > pic_m.modified().unwrap() {
+                warnln!(
+                    "Skipped rendering the thumbnail for {name:?} (use {FULL_BUILD_OPT} to overwrite)",
+                    name = pic.file_name
+                );
+                return RenderResult::Skipped;
+            }
+        }
     }
 
     match pic.file_format {
@@ -506,10 +516,8 @@ fn render_thumbnail(pic: GalleryEntry, full_build: bool) -> RenderResult {
 
             // Delete the thumbnail file if it exists already: fs::symlink does
             // not override files
-            if let Ok(meta) = fs::symlink_metadata(&thumb_path) {
-                if meta.is_file() || meta.is_symlink() {
-                    let _ = fs::remove_file(&thumb_path);
-                }
+            if let Ok(true) = thumb_meta.map(|m| m.is_file() || m.is_symlink()) {
+                let _ = fs::remove_file(&thumb_path);
             }
 
             if let Err(err) = unix::fs::symlink(&src_path, &thumb_path) {
@@ -598,18 +606,6 @@ fn thumb_path(pic: &GalleryEntry) -> PathBuf {
     result
 }
 
-/// Returns `false` if both `p1` and `p2` exist and and `p1` is newer than
-/// `f2`. Returns `true` otherwise
-fn needs_update<P1: AsRef<Path>, P2: AsRef<Path>>(p1: P1, p2: P2) -> bool {
-    if let (Ok(m1), Ok(m2)) = (fs::metadata(&p1), fs::metadata(&p2)) {
-        if m1.modified().unwrap() > m2.modified().unwrap() {
-            return false;
-        }
-    }
-
-    true
-}
-
 impl<'a> Display for ThumbPath<'a> {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
         write!(f, "/{THUMBS_PATH}/{name}", name = Escaped(&self.0.file_name))?;