47 lines
1.2 KiB
Ruby
47 lines
1.2 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class Site
|
||
|
# Se encarga de guardar los cambios en los archivos y mantenerlos
|
||
|
# actualizados en git
|
||
|
class Writer
|
||
|
attr_reader :site, :file, :content, :usuarie, :message
|
||
|
|
||
|
def initialize(site:, file:, content:, usuarie:, message:)
|
||
|
@site = site
|
||
|
@content = content
|
||
|
@file = file
|
||
|
@usuarie = usuarie
|
||
|
@message = message
|
||
|
end
|
||
|
|
||
|
# rubocop:disable Metrics/AbcSize
|
||
|
def save
|
||
|
r = File.open(file, File::RDWR | File::CREAT, 0o640) do |f|
|
||
|
# Bloquear el archivo para que no sea accedido por otro
|
||
|
# proceso u otra editora
|
||
|
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
|
||
|
|
||
|
r.zero? && site.repository.commit(file: relative_file,
|
||
|
usuarie: usuarie,
|
||
|
message: message)
|
||
|
end
|
||
|
# rubocop:enable Metrics/AbcSize
|
||
|
|
||
|
# 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
|
||
|
end
|