Las dos opciones que se me ocurren son:
- Agregar un enlace
svn:externals
al proyecto a distancia (que ya conoce).
- Amplíe Sphinx con una directiva personalizada para incluir archivos de repositorios de subversión remotos.
No soy un experto en Sphinx internals, pero pude improvisar una extensión rápida que integra archivos de un repositorio de subversión remoto.
La extensión agrega una directiva svninclude
que toma 1 argumento, la url del repositorio donde se encuentran sus documentos. Comprueba este repositorio en un directorio temporal _svncache
ubicado en la raíz del proyecto, y luego procede a leer los contenidos de cada archivo e insertarlos en la máquina de estados del analizador.
Aquí está el código para la extensión svninclude.py
. Está simplificado en exceso y no tiene errores de verificación en este momento. Si va a poner en práctica esta que me haga saber y me puede proporcionar algunos consejos adicionales si se queda atascado:
import os, re, subprocess, sys
from docutils import nodes, statemachine
from docutils.parsers.rst import directives
from sphinx.util.compat import Directive, directive_dwim
class SvnInclude(Directive):
has_content = True
required_arguments = 1
optional_arguments = 0
final_argument_whitespace = False
def _setup_repo(self, repo):
env = self.state.document.settings.env
path = os.path.normpath(env.doc2path(env.docname, base=None))
cache = os.path.join(os.path.dirname(path), '_svncache')
root = os.path.join(cache, re.sub('[\W\-]+', '_', repo))
if not os.path.exists(root):
os.makedirs(root)
subprocess.call(['svn', 'co', repo, root])
return root
def run(self):
root = self._setup_repo(self.arguments[0])
for path in self.content:
data = open(os.path.join(root, path), 'rb').read()
lines = statemachine.string2lines(data)
self.state_machine.insert_input(lines, path)
return []
def setup(app):
app.add_directive('svninclude', directive_dwim(SvnInclude))
Aquí se muestra un ejemplo del margen de beneficio que le incluye en su index.rst
(o este archivo):
.. svninclude:: http://svn.domain.com/svn/project
one.rst
doc/two.rst
donde los caminos one.rst
y doc/two.rst
son en relación con la url subversión, por ejemplo http://svn.domain.com/svn/project/one.rst
.
Por supuesto, desea empaquetar el svninclude.py
y obtenerlo instalado en su ruta de Python. Esto es lo que hice para probarlo:
- Agregado
'svninclude'
a la lista extensions
en source/conf.py
.
- Colocado
svninclude.py
en la raíz del proyecto.
Entonces corrieron:
% PYTHONPATH=. sphinx-build -b html ./source ./build
+1 para la codificación agradable! Pero svn: externals es probablemente el más simple aquí. Pensando en ello, un término medio más portátil sería simplemente obtener los datos a través de http, luego puede servirlos con git/hg/cvs/apache/whatnot. :) – Macke
Gracias - Sí, la extensión podría modificarse fácilmente para descargar/incrustar archivos de servidores HTTP remotos (en lugar de 'svn co' ellos). – samplebias