tener los sitios en un solo directorio y vincular a los directorios de las usuarias

en realidad no sería estrictamente necesario vincularlos porque no
estamos haciendo uso directo de esos directorios.  tiene utilidad cuando
estamos administrando desde el sistema de archivos quizás.
This commit is contained in:
f 2018-09-27 14:43:13 -03:00
parent 79b24b72da
commit b3a7e3c2ea
No known key found for this signature in database
GPG key ID: F3FDAB97B5F9F7E7
5 changed files with 96 additions and 18 deletions

2
.gitignore vendored
View file

@ -24,3 +24,5 @@
/_sites/*
/_deploy/*
/_usuarias/*
/_invitadxs/*

View file

@ -297,8 +297,8 @@ class Site
#
# Si comparten gestión con otras usuarias, se hacen links simbólicos
# entre sí.
def self.site_path_for(usuaria)
File.join(Site.site_path, usuaria.username)
def self.site_path_for(site)
File.join(Site.site_path, site)
end
# Comprueba que el directorio parezca ser de jekyll
@ -333,17 +333,39 @@ class Site
Jekyll::Site.new(config)
end
# Obtener todos los directorios de sitios asociados a esta usuaria
def self.all_for(usuaria)
Pathname.new(Site.site_path_for(usuaria))
.children.map(&:expand_path).map(&:to_s).map do |j|
def self.cached?(site)
@sites_cache[site.to_sym].present?
end
# Carga un sitio y lo cachea
def self.find_by_dir(dir)
@sites_cache ||= {}
site = File.basename(dir).to_sym
@sites_cache[site] ||= Dir.chdir(dir) do
jekyll = Site.load_jekyll(Dir.pwd)
Site.new(jekyll: jekyll, path: dir)
end
end
# Encuentra un sitio
def self.find(site)
dir = Site.site_path_for(site)
return nil unless Site.jekyll? dir
Site.find_by_dir(dir)
end
# Devuelve todos los directorios de los sitios
def self.all_dirs
Pathname.new(Site.site_path).children.map(&:expand_path).map(&:to_s)
end
# Obtiene todos los sitios
def self.all
Site.all_dirs.map do |j|
next unless Site.jekyll? j
Dir.chdir(j) do
jekyll = Site.load_jekyll(Dir.pwd)
Site.new(jekyll: jekyll, path: j)
end
Site.find_by_dir(j)
end.compact
end
end

View file

@ -11,8 +11,18 @@ class Usuaria < OpenStruct
Usuaria.new(username: username)
end
def path
File.join(Rails.root, '_usuarias', username)
end
def site_dirs
Pathname.new(path).children.map(&:expand_path).map(&:to_s)
end
# Obtener todos los sitios de esta usuaria
def sites
@sites ||= Site.all_for(self)
@sites ||= site_dirs.map do |site|
Site.find(File.basename(site))
end.compact
end
end

41
bin/migrate_directories Executable file
View file

@ -0,0 +1,41 @@
#!/bin/bash
test -f _sites/.migrated && exit 0
# Crear los directorios donde van las usuarias e invitadxs
mkdir -p _usuarias _invitadxs
# Recorrer todos los sitios
for site in _sites/*/*; do
# Obtener la ubicación real de los sitios
real_site="$(readlink -f "${site}")"
# Obtener el nombre dentro de Sutty
site_name="$(basename "${site}")"
# Mover los directorios a donde van
if ! test -e "_sites/${site_name}" ; then
# Si son symlinks, mantener el symlink, sino mover el directorio
if test -L "${site}" ; then
ln -s "${real_site}" "_sites/${site_name}"
else
mv "${site}" "_sites/${site_name}"
fi
fi
for tipo in usuarias invitadxs; do
test -f "${real_site}/.${tipo}" || continue
cat "${real_site}/.${tipo}" | while read usuaria; do
# Crear los directorios de las usuarias y lxs invitadxs
mkdir -p "_${tipo}/${usuaria}"
# Linkear el sitio
ln -s "../../_sites/${site_name}" "_${tipo}/${usuaria}/${site_name}"
done
done
done
# Elimina los directorios de las usuarias e invitadxs
cat _sites/*/.usuarias _sites/*/.invitadxs | while read u; do
rm -rf "_sites/${u}"
done
touch _sites/.migrated

View file

@ -7,28 +7,31 @@ En un deploy con capistrano, se vería así:
ls /srv/http/sutty.kefir.red/shared/_sites
cyber-women.com
ls /srv/http/sutty.kefir.red/shared/_usuarias
hola@kefir.red
persona@kefir.red
Donde `hola@kefir.red` es el directorio de trabajo de la habitante.
Dentro de ese, están los sitios:
ls /srv/http/sutty.kefir.red/shared/_sites/hola@kefir.red
ls /srv/http/sutty.kefir.red/shared/_usuarias/hola@kefir.red
cyber-women.com
Cada sitio está identificado por su nombre de dominio, para que sea más
simple saber de qué se trata.
Cada sitio se almacena (o se vincula) en `_sites` y está identificado
por su nombre de dominio, para que sea más simple saber de qué se trata.
Si quisiéramos dar acceso a `persona@kefir.red` solo hay que hacer un
link simbólico.
cd /srv/http/sutty.kefir.red/shared/_sites/persona@kefir.red
ln -sv ../hola@kefir.red/cyber-women.com .
cd /srv/http/sutty.kefir.red/shared/_usuarias/persona@kefir.red
ln -sv ../../_sites/cyber-women.com .
De esta forma vinculamos el sitio `cyber-women.com` a la cuenta
`persona@kefir.red`, compartiendo los mismos archivos con
`hola@kefir.red`.
`persona@kefir.red`.
## Deploy