Zola Git Hook: actualizando las fechas de las publicaciones
Para que el campo «Última actualización» de las entradas sea siempre preciso, he automatizado su modificación con un hook Git pre-commit.
Un hook (gancho) Git pre-commit es un script que se ejecuta automáticamente antes de cada commit. Puede realizar acciones personalizadas, como validar código, ejecutar pruebas o, en este caso, actualizar fechas de publicación.
El hook
Este script de Bash crea o modifica el campo updated
en el front matter de los archivos Markdown del commit con su fecha de última modificación.
Aquí está el código (también disponible en gist):
#!/usr/bin/env bash
# Requiere Bash 4.0 o superior.
# Función para salir del script con un mensaje de error.
# Función para extraer la fecha del front matter.
# Obtiene los archivos .md modificados, ignorando los archivos "_index.md".
# Recorre cada archivo .md modificado.
for; do
# Obtiene la fecha de última modificación del sistema de archivos.
last_modified_date=
# Extrae el campo "date" del front matter.
date_value=
# Omite el archivo si la fecha de última modificación es igual al campo "date".
if ; then
continue
fi
# Actualiza el campo "updated" con la fecha de última modificación.
# Si el campo "updated" no existe, lo crea debajo del campo "date".
&& ||
# Añade los cambios a staging.
done
Configuración
Después de configurar tu proyecto Zola y repositorio Git:
-
Crea o actualiza el archivo
pre-commit
dentro de.git/hooks
(en el directorio raíz de tu proyecto) con el script anterior. -
Haz que el script sea ejecutable con
chmod +x .git/hooks/pre-commit
.
¡Así de simple!
Ahora, cada vez que hagas commit de archivos Markdown con un campo date
, el campo updated
se creará o actualizará con la última fecha de modificación del archivo en formato ISO 8601 (por ejemplo, 2027-08-29).
Extra: Compresión sin pérdida de archivos PNG
En pos de la optimización, me encanta comprimir archivos (sin pérdida). Con ese propósito, he actualizado el script para incluir la compresión de archivos PNG utilizando oxipng o optipng.
Dado que no se pueden tener más de un hook de pre-commit[1], he añadido la funcionalidad de compresión al script anterior agregando estas líneas (gist con el script completo):
# Comprueba si oxipng u optipng están instalados.
if ; then
png_compressor="oxipng -o max"
elif ; then
png_compressor="optipng -o 7"
fi
# Si alguno de los compresores está instalado…
if ; then
# Obtiene los archivos PNG modificados o añadidos.
# Recorre cada archivo PNG.
for; do
# Comprime el archivo PNG.
||
# Añade los cambios a staging.
done
fi
Con estas líneas adicionales, si un compresor de PNG está instalado, el script buscará entre los archivos PNG confirmados y los comprimirá sin pérdida de calidad.
Ahora puedo mantener al día las fechas de «Última actualización» de las entradas de Zola y optimizar las imágenes PNG para reducir los tiempos de carga.
Con el tiempo, he añadido otras funcionalidades, como evitar commits de borradores o de archivos que contengan «TODO», y ejecutar scripts de optimización. Puedes echar un vistazo al hook que estoy utilizando actualmente aquí.
-
Si prefieres mantener las funcionalidades separadas y utilizar múltiples archivos para tus scripts de pre-commit, puedes crear un archivo
pre-commit
que invoque a todos los demás scripts (que podrías almacenar en un directoriopre-commit.d
, por ejemplo). ↩