47 lines
1.1 KiB
Ruby
47 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Se encarga de guardar los cambios en los archivos y mantenerlos
|
|
# actualizados en git
|
|
Site::Writer = Struct.new(:site, :file, :content, keyword_init: true) do
|
|
# Realiza la escritura del archivo.
|
|
#
|
|
# **IMPORTANTE:** Usar rutas absolutas siempre y nunca confiar en una
|
|
# ruta que venga de la Internet.
|
|
#
|
|
# TODO: Usar rutas relativas al sitio y sanitizar.
|
|
#
|
|
# TODO: si el archivo está bloqueado, esperar al desbloqueo. Realizar
|
|
# asincrónicamente?
|
|
def save
|
|
mkdir_p
|
|
|
|
File.open(file, File::RDWR | File::CREAT, 0o640) do |f|
|
|
# Bloquear el archivo para que no sea accedido por otro
|
|
# proceso u otre editore
|
|
f.flock(File::LOCK_EX)
|
|
|
|
# Empezar por el principio
|
|
f.rewind
|
|
|
|
# Escribir el contenido
|
|
f.write(content)
|
|
|
|
# Eliminar el resto
|
|
f.flush
|
|
f.truncate(f.pos)
|
|
end.zero?
|
|
end
|
|
|
|
# Devuelve la ruta relativa a la raíz del sitio
|
|
def relative_file
|
|
Pathname.new(file).relative_path_from(Pathname.new(site.path)).to_s
|
|
end
|
|
|
|
def dirname
|
|
File.dirname file
|
|
end
|
|
|
|
def mkdir_p
|
|
FileUtils.mkdir_p dirname
|
|
end
|
|
end
|