# 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 # TODO: si el archivo está bloqueado, esperar al desbloqueo def save 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 end