mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-19 11:26:21 +00:00
Merge branch 'issue-13780' of https://0xacab.org/sutty/sutty into 17.3.alpine.panel.sutty.nl
This commit is contained in:
commit
dba8dfcfc7
5 changed files with 130 additions and 3 deletions
11
.editorconfig
Normal file
11
.editorconfig
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[Makefile]
|
||||||
|
indent_style = tab
|
|
@ -1,20 +1,122 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
# Indexa todos los artículos de un sitio
|
|
||||||
#
|
|
||||||
# TODO: Hacer opcional
|
|
||||||
class Site
|
class Site
|
||||||
|
# Indexa todos los artículos de un sitio
|
||||||
|
#
|
||||||
|
# TODO: Hacer opcional
|
||||||
module Index
|
module Index
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
included do
|
included do
|
||||||
has_many :indexed_posts, dependent: :destroy
|
has_many :indexed_posts, dependent: :destroy
|
||||||
|
|
||||||
|
MODIFIED_STATUSES = %i[added modified].freeze
|
||||||
|
DELETED_STATUSES = %i[deleted].freeze
|
||||||
|
LOCALE_FROM_PATH = /\A_/.freeze
|
||||||
|
|
||||||
def index_posts!
|
def index_posts!
|
||||||
Site.transaction do
|
Site.transaction do
|
||||||
docs.each(&:index!)
|
docs.each(&:index!)
|
||||||
|
|
||||||
|
update(last_indexed_commit: repository.head_commit.oid)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Encuentra los artículos modificados entre dos commits y los
|
||||||
|
# reindexa.
|
||||||
|
def reindex_changes!
|
||||||
|
return unless reindexable?
|
||||||
|
|
||||||
|
Site.transaction do
|
||||||
|
remove_deleted_posts!
|
||||||
|
reindex_modified_posts!
|
||||||
|
|
||||||
|
update(last_indexed_commit: repository.head_commit.oid)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# No hacer nada si el repositorio no cambió o no hubo cambios
|
||||||
|
# necesarios
|
||||||
|
def reindexable?
|
||||||
|
return false if last_indexed_commit.blank?
|
||||||
|
return false if last_indexed_commit == repository.head_commit.oid
|
||||||
|
|
||||||
|
!indexable_posts.empty?
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Trae el último commit indexado desde el repositorio
|
||||||
|
#
|
||||||
|
# @return [Rugged::Commit]
|
||||||
|
def indexed_commit
|
||||||
|
@indexed_commit ||= repository.rugged.lookup(last_indexed_commit)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Calcula la diferencia entre el último commit indexado y el
|
||||||
|
# actual
|
||||||
|
#
|
||||||
|
# XXX: Esto no tiene en cuenta modificaciones en la historia como
|
||||||
|
# cambio de ramas, reverts y etc, solo asume que se mueve hacia
|
||||||
|
# adelante en la misma rama o las dos ramas están relacionadas.
|
||||||
|
#
|
||||||
|
# @return [Rugged::Diff]
|
||||||
|
def diff_with_head
|
||||||
|
@diff_with_head ||= indexed_commit.diff(repository.head_commit)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Obtiene todos los archivos a reindexar
|
||||||
|
#
|
||||||
|
# @return [Array<Rugged::Delta>]
|
||||||
|
def indexable_posts
|
||||||
|
@indexable_posts ||=
|
||||||
|
diff_with_head.each_delta.select do |delta|
|
||||||
|
locales.any? do |locale|
|
||||||
|
delta.old_file[:path].start_with? "_#{locale}/"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Elimina los artículos eliminados o que cambiaron de ubicación
|
||||||
|
# del índice
|
||||||
|
def remove_deleted_posts!
|
||||||
|
indexable_posts.select do |delta|
|
||||||
|
DELETED_STATUSES.include? delta.status
|
||||||
|
end.each do |delta|
|
||||||
|
locale, path = locale_and_path_from(delta.old_file[:path])
|
||||||
|
|
||||||
|
indexed_posts.destroy_by(locale: locale, path: path).tap do |destroyed_posts|
|
||||||
|
next unless destroyed_posts.empty?
|
||||||
|
|
||||||
|
Rails.logger.info I18n.t('indexed_posts.deleted', site: name, path: path, records: destroyed_posts.count)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Reindexa artículos que cambiaron de ubicación, se agregaron
|
||||||
|
# o fueron modificados
|
||||||
|
def reindex_modified_posts!
|
||||||
|
indexable_posts.select do |delta|
|
||||||
|
MODIFIED_STATUSES.include? delta.status
|
||||||
|
end.each do |delta|
|
||||||
|
locale, path = locale_and_path_from(delta.new_file[:path])
|
||||||
|
|
||||||
|
site.posts(lang: locale).find(path).index!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Obtiene el idioma y la ruta del post a partir de la ubicación en
|
||||||
|
# el disco
|
||||||
|
#
|
||||||
|
# @return [Array<String>]
|
||||||
|
def locale_and_path_from(path)
|
||||||
|
locale, path = path.split(File::SEPARATOR, 2)
|
||||||
|
|
||||||
|
[
|
||||||
|
locale.sub(LOCALE_FROM_PATH, ''),
|
||||||
|
File.basename(path, '.*')
|
||||||
|
]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -168,6 +168,7 @@ en:
|
||||||
usuarie: User
|
usuarie: User
|
||||||
licencia: License
|
licencia: License
|
||||||
design: Design
|
design: Design
|
||||||
|
indexed_post: Indexed post
|
||||||
attributes:
|
attributes:
|
||||||
usuarie:
|
usuarie:
|
||||||
email: 'E-mail address'
|
email: 'E-mail address'
|
||||||
|
@ -730,3 +731,5 @@ en:
|
||||||
filter:
|
filter:
|
||||||
filter: 'Filter'
|
filter: 'Filter'
|
||||||
remove: 'Back'
|
remove: 'Back'
|
||||||
|
indexed_posts:
|
||||||
|
deleted: "Deleted indexed post %{path} from %{site} (records: %{records})"
|
||||||
|
|
|
@ -168,6 +168,7 @@ es:
|
||||||
usuarie: Usuarie
|
usuarie: Usuarie
|
||||||
licencia: Licencia
|
licencia: Licencia
|
||||||
design: Diseño
|
design: Diseño
|
||||||
|
indexed_post: Artículo indexado
|
||||||
attributes:
|
attributes:
|
||||||
usuarie:
|
usuarie:
|
||||||
email: 'Correo electrónico'
|
email: 'Correo electrónico'
|
||||||
|
@ -738,3 +739,5 @@ es:
|
||||||
filter:
|
filter:
|
||||||
filter: 'Filtrar'
|
filter: 'Filtrar'
|
||||||
remove: 'Volver'
|
remove: 'Volver'
|
||||||
|
indexed_posts:
|
||||||
|
deleted: "Eliminado artículo %{path} de %{site} (filas: %{records})"
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# Almacenar el último commit indexado
|
||||||
|
class AddLastIndexedCommitToSites < ActiveRecord::Migration[6.1]
|
||||||
|
def change
|
||||||
|
add_column :sites, :last_indexed_commit, :string, null: true
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue