guardar los cambios en git!

This commit is contained in:
f 2019-07-30 18:07:08 -03:00
parent 396b7a4881
commit 4e1cfdd726
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
6 changed files with 91 additions and 21 deletions

View file

@ -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
# Escribir el contenido en YAML
f.write(content.to_yaml)
# Eliminar el resto
f.flush
f.truncate(f.pos)
end end
r.zero? # Detecta si la configuración cambió comparando con el valor inicial
def persisted?
@hash == content.hash
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

View file

@ -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
View 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

View file

@ -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'

View file

@ -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'

View file

@ -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