diff --git a/.gitignore b/.gitignore index 74c4390c..27918865 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,5 @@ /_sites/* /_deploy/* +/_usuarias/* +/_invitadxs/* diff --git a/app/models/site.rb b/app/models/site.rb index ae079634..14e0b4a1 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -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 diff --git a/app/models/usuaria.rb b/app/models/usuaria.rb index 15376cdc..68647fb1 100644 --- a/app/models/usuaria.rb +++ b/app/models/usuaria.rb @@ -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 diff --git a/bin/migrate_directories b/bin/migrate_directories new file mode 100755 index 00000000..886c65fa --- /dev/null +++ b/bin/migrate_directories @@ -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 diff --git a/doc/directorios.md b/doc/directorios.md index 65eba87d..44075e61 100644 --- a/doc/directorios.md +++ b/doc/directorios.md @@ -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