guardar los cambios en git!
This commit is contained in:
parent
396b7a4881
commit
4e1cfdd726
6 changed files with 91 additions and 21 deletions
|
@ -19,33 +19,26 @@ class Site
|
||||||
# Leer el archivo de configuración y setear los atributos en el
|
# Leer el archivo de configuración y setear los atributos en el
|
||||||
# objeto actual, creando los metodos de ostruct
|
# objeto actual, creando los metodos de ostruct
|
||||||
def read
|
def read
|
||||||
YAML.safe_load(File.read(path)).each do |key, value|
|
data = YAML.safe_load(File.read(path))
|
||||||
|
@hash = data.hash
|
||||||
|
|
||||||
|
data.each do |key, value|
|
||||||
send("#{key}=".to_sym, value)
|
send("#{key}=".to_sym, value)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Escribe los cambios en el repositorio
|
# Escribe los cambios en el repositorio
|
||||||
#
|
def write(usuarie)
|
||||||
# TODO: Convertir en una clase intermedia que también se encargue de
|
return if persisted?
|
||||||
# guardar en git
|
|
||||||
def write
|
|
||||||
r = File.open(path, 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
|
Site::Writer.new(site: site, file: path,
|
||||||
f.rewind
|
content: content.to_yaml, usuarie: usuarie,
|
||||||
|
message: I18n.t('sites.repository.config')).save
|
||||||
|
end
|
||||||
|
|
||||||
# Escribir el contenido en YAML
|
# Detecta si la configuración cambió comparando con el valor inicial
|
||||||
f.write(content.to_yaml)
|
def persisted?
|
||||||
|
@hash == content.hash
|
||||||
# Eliminar el resto
|
|
||||||
f.flush
|
|
||||||
f.truncate(f.pos)
|
|
||||||
end
|
|
||||||
|
|
||||||
r.zero?
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Obtener el contenido de la configuración como un hash, sin el
|
# Obtener el contenido de la configuración como un hash, sin el
|
||||||
|
|
|
@ -78,5 +78,29 @@ class Site
|
||||||
|
|
||||||
walker.each.to_a
|
walker.each.to_a
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Guarda los cambios en git, de a un archivo por vez
|
||||||
|
# rubocop:disable Metrics/AbcSize
|
||||||
|
def commit(file:, usuarie:, message:)
|
||||||
|
rugged.index.add(file)
|
||||||
|
rugged.index.write
|
||||||
|
|
||||||
|
Rugged::Commit.create(rugged,
|
||||||
|
update_ref: 'HEAD',
|
||||||
|
parents: [rugged.head.target],
|
||||||
|
tree: rugged.index.write_tree,
|
||||||
|
message: message,
|
||||||
|
author: author(usuarie),
|
||||||
|
committer: committer)
|
||||||
|
end
|
||||||
|
# rubocop:enable Metrics/AbcSize
|
||||||
|
|
||||||
|
def author(author)
|
||||||
|
{ name: author.name, email: author.email, time: Time.now }
|
||||||
|
end
|
||||||
|
|
||||||
|
def committer
|
||||||
|
{ name: 'Sutty', email: "sutty@#{Site.domain}", time: Time.now }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
46
app/models/site/writer.rb
Normal file
46
app/models/site/writer.rb
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
# 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
|
|
@ -185,6 +185,8 @@ en:
|
||||||
|
|
||||||
ejemplo: 'example'
|
ejemplo: 'example'
|
||||||
sites:
|
sites:
|
||||||
|
repository:
|
||||||
|
config: 'Changes in config'
|
||||||
actions: 'Actions'
|
actions: 'Actions'
|
||||||
posts: 'View and edit posts'
|
posts: 'View and edit posts'
|
||||||
title: 'Sites'
|
title: 'Sites'
|
||||||
|
|
|
@ -194,6 +194,8 @@ es:
|
||||||
También sirve para archivo histórico :)
|
También sirve para archivo histórico :)
|
||||||
ejemplo: 'ejemplo'
|
ejemplo: 'ejemplo'
|
||||||
sites:
|
sites:
|
||||||
|
repository:
|
||||||
|
config: 'Cambios en la configuración'
|
||||||
actions: 'Acciones'
|
actions: 'Acciones'
|
||||||
posts: 'Ver y editar artículos'
|
posts: 'Ver y editar artículos'
|
||||||
title: 'Sitios'
|
title: 'Sitios'
|
||||||
|
|
|
@ -23,12 +23,15 @@ class ConfigText < ActiveSupport::TestCase
|
||||||
@site.config.lang = 'es'
|
@site.config.lang = 'es'
|
||||||
end
|
end
|
||||||
|
|
||||||
assert @site.config.write
|
assert @site.config.write(@usuarie)
|
||||||
|
|
||||||
config = Site::Config.new(@site)
|
config = Site::Config.new(@site)
|
||||||
|
|
||||||
assert_equal 'Test', config.name
|
assert_equal 'Test', config.name
|
||||||
assert_equal 'es', config.lang
|
assert_equal 'es', config.lang
|
||||||
|
|
||||||
|
assert_equal I18n.t('sites.repository.config'),
|
||||||
|
@site.repository.rugged.head.target.message
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'se puede obtener información' do
|
test 'se puede obtener información' do
|
||||||
|
|
Loading…
Reference in a new issue