¿Una herramienta para ilustrar árboles de repositorios SVN?

Mi equipo usa cinco repositorios SVN separados, para cinco módulos o aplicaciones diferentes que estamos manteniendo. Cada uno tiene su propia secuencia de versiones.

Nos gusta tener un "cartel de pared" del estado actual de nuestros repositorios con sus sucursales. Actualmente, estamos usando una pizarra para esto, y funciona bastante bien. Pero me pregunto si existe una herramienta que pueda ayudarnos con esto. Estaría bien si tuviera que actualizar manualmente un documento (Visio o lo que sea), pero, por supuesto, puntos de bonificación por una herramienta que puede extraer automáticamente de nuestro servidor SVN.

Nuestra pizarra se ve más o menos así: Tenemos una línea de desarrollo principal en el maletero ===. Cuando se completa un lanzamiento, lo etiquetamos oy creamos una rama de mantenimiento ---para que podamos entregar etiquetas de lanzamiento de corrección de errores omientras continúa el desarrollo del tronco.

Foo trunk:   o===dev1.0===o====dev1.1===========o====dev1.2==========
Foo 1.0.x maintenance:    |---fix1.0.1--o---    |
Foo 1.1.x maintenance:                          |--fix1.1.1--o---

Bar trunk:   o===dev1.0===o====dev1.1===========o====dev1.2==========
Bar 1.0.x maintenance:    |---fix1.0.1--o---    |
Bar 1.1.x maintenance:                          |--fix1.1.1--o---

Xyz trunk:   o===dev1.0===o====dev1.1===========o====dev1.2==========
Xyz 1.0.x maintenance:    |---fix1.0.1--o---    |
Xyz 1.1.x maintenance:                          |--fix1.1.1--o---

...

¿Existe alguna herramienta que pueda ayudar a mantener un "póster" similar a este? Tenga en cuenta que quiero hacer esto para varios repositorios en un servidor, no solo para un solo repositorio, y que solo me importan las etiquetas y no los registros individuales.

No estoy seguro de si encaja exactamente, pero Trac tiene algunos complementos para eso que usan Graphviz para visualizar automáticamente los repositorios. No estoy seguro de si eso podría configurarse para hacer exactamente los árboles que buscas, pero ciertamente vale la pena echarle un vistazo. Ver, por ejemplo, su complemento Revtree (la página tiene capturas de pantalla).
No es una respuesta, ya que ya está usando SVN y probablemente se quedó con él, pero esa es la razón por la que cambié nuestra pequeña empresa de SVN a Plastic SCM. "El explorador de sucursales se creó después del típico diagrama de pizarra que cada equipo dibuja cuando intenta explicar la estructura de fusión del proyecto" - plasticscm.com/branch-explorer/index.html Quizás esto podría ayudar a otros que encuentran esta pregunta y están ya sea en una posición para cambiar o buscando un nuevo VCS ... plasticscm.com/branch-explorer/assets/img/…

Respuestas (2)

TikZ

TikZ es un paquete (La)TeX para dibujar todo tipo de diagramas. Lo uso para la mayoría de mis necesidades de dibujo. Sus características incluyen:

  • Sintaxis del lenguaje intuitivo
  • Gráficos vectoriales (para que pueda escalar su póster a cualquier tamaño),
  • Una gran selección de bibliotecas,
  • Capacidad para definir comandos y estilos personalizados
  • Un manual de usuario detallado ,
  • Excelente soporte de la comunidad en TeX.SE (la etiqueta de pregunta más popular allí con casi 9000 preguntas).

Aquí hay un ejemplo de la primera parte de su diagrama dibujado con TikZ:


Código fuente del diagrama anterior:

\documentclass[tikz,border=2pt]{standalone}
\usetikzlibrary{shapes,positioning,arrows}
\tikzstyle{revision}=[draw,circle,inner sep=2pt]
\tikzstyle{trunkline}=[draw,ultra thick,postaction={draw,thick,color=white}]

\begin{document}
\begin{tikzpicture}[node distance=1cm and 2cm]
  \node[minimum width=4cm] (footrunk) {Foo trunk:};
  \node[revision,right= of footrunk,right=5mm,fill=gray!60] (rev12345) {};
  \node[revision,right= of rev12345] (rev12346) {};
  \node[revision,right= of rev12346,right=3cm] (rev12347) {};
  \node[revision,right= of rev12347] (rev12348) {};

  \node[minimum width=4cm,below= of footrunk,above] (maintenance1) {Foo 1.0.x maintenance};
  \node[revision,below=of rev12346,above] (fix10) {};
  \node[revision,right=of fix10] (fix101) {};
  \node[minimum width=4cm,below= of maintenance1,above] (maintenance2) {Foo 1.1.x maintenance};
  \node[revision,node distance=2cm,below=of rev12347,above] (fix11) {};
  \node[revision,right=of fix11] (fix111) {};

  \draw[trunkline] (rev12345) -- node[font=\scriptsize,fill=white]{dev1.0} (rev12346);
  \draw[trunkline] (rev12346) -- node[font=\scriptsize,fill=white]{dev1.1} (rev12347);
  \draw[trunkline] (rev12347) -- node[font=\scriptsize,fill=white]{dev1.2} (rev12348);
  \draw[very thick,dotted,-stealth'] (rev12348) -- ++(1cm,0);
  \draw (rev12346) -- (fix10);
  \draw (fix10) -- node[font=\scriptsize,fill=white]{fix1.0.1} (fix101);
  \draw[thick,blue,dashed,-stealth'] (fix101) -- (rev12347);
  \draw (rev12347) -- (fix11);
  \draw (fix11) -- node[font=\scriptsize,fill=white]{fix1.1.1} (fix111);
\end{tikzpicture}
\end{document}

Editar sobre la automatización

Para automatizar estos diagramas, deberá utilizar las macros del paquete TikZ. Dado que realizar operaciones matemáticas en TikZ sigue siendo una molestia, es aún mejor si pudiera usar otro lenguaje poderoso para editar el texarchivo, como Perl o Python. Estos también se pueden usar para extraer datos de sus archivos de registro SVN, logrando un proceso completamente automatizado.

Aquí hay un intento de automatizar el diagrama anterior usando TikZ solo con 3 variables de entrada: primeras y últimas revoluciones y número de ramas. Por supuesto, esto funciona solo para esta forma específica de árboles, pero servirá como ejemplo de cómo funcionan las macros.

guion principal

\documentclass[tikz,border=2pt]{standalone}
\usetikzlibrary{shapes,positioning,arrows}

% Macros
\input{svn_macros}
% Configuration
\newcommand\FirstRevNumber{12345}
\newcommand\CurrentRevNumber{12348}
\newcommand\FixCount{2}
% End of configuration

\begin{document}
\begin{tikzpicture}[node distance=1cm and 1.5cm]
  \node[minimum width=4cm] (0) {Foo trunk:};
  \firstrevision{\FirstRevNumber}{0}
  \foreach \rev [count=\counter from 0]  in {\FirstRevNumber,...,\CurrentRevNumber}{
    \pgfmathtruncatemacro{\NextRev}{\rev+1}
    \pgfmathtruncatemacro{\FixNum}{\counter+1}
    \revision{\NextRev}{\rev}\mainline{\rev}{\NextRev}{dev1.\counter}
    \ifnum\counter<\FixCount
      \node[minimum width=4cm,below= of \counter,above] (\FixNum) {Foo 1.\counter.x maintenance};
      \newfix[\FixNum]{1\counter}{\NextRev}
      \fix{1\counter1}{1\counter}
      \branchline{1\counter}{1\counter1}{fix1.\counter.1}
    \fi
  }
  \foreach \rev [count=\counter from 0]  in {\FirstRevNumber,...,\CurrentRevNumber}{
    \pgfmathtruncatemacro{\SecondNextRev}{\rev+2}
    \ifnum\counter<\FixCount
      \draw[thick,blue,dashed,-stealth'] (1\counter1) -- (\SecondNextRev);
    \fi
  }
\end{tikzpicture}
\end{document}

archivo importado

\newcommand\firstrevision[2]{\node[draw,circle,inner sep=2pt,right= of #2,right=5mm,fill=gray!60](#1){};}
\newcommand\revision[2]{\node[draw,circle,inner sep=2pt,right= of #2,right=2cm](#1){};}
\newcommand\newfix[3][1]{\node[draw,circle,node distance=#1cm,inner sep=2pt,below= of #3,above](#2){};\draw (#3) -- (#2);}
\newcommand\fix[2]{\node[draw,circle,inner sep=2pt,right= of #2](#1){};}
\newcommand\mainline[3]{\draw[ultra thick,postaction={draw,thick,color=white}] (#1) -- node[font=\scriptsize,fill=white]{#3} (#2);}
\newcommand\branchline[3]{\draw (#1) -- node[font=\scriptsize,fill=white]{#3} (#2);}

Esto produciría un árbol similar a la figura anterior, pero si aumenta los números en la sección Configuración (12345, 12360 y 8, por ejemplo), podría terminar con un árbol bastante largo:

Resultado

(Haga clic en la imagen para una versión más grande)

Gracias, recrear mi diagrama ciertamente demuestra lo bien que funciona su sugerencia. Parece muy estructurado; ahora, si hubiera una manera de generar esto automáticamente, sería perfecto.
@TorbenGundtofte-Bruun Diría que es bastante posible, pero definitivamente no es algo que uno pueda preparar durante un largo descanso para tomar café. Con suficiente tiempo, uno podría definir una serie de macros en TeX para formar un patrón de los diagramas, luego escribir un script en un lenguaje de programación poderoso como Perl o Python. Leería los datos de su archivo de registro SVN y generaría la imagen correspondiente. Tal vez si pudiera publicar un archivo de registro de muestra que corresponda al diagrama publicado, y trataré de publicar un script de ejemplo para leer eso
Sí, se requiere algún tipo de análisis de archivos SVN. No le estoy dando un archivo de registro, no por el secreto, sino porque prefiero que no pierda tiempo trabajando en un script que probablemente podría poner en funcionamiento en el trabajo.
@TorbenGundtofte-Bruun Edité la respuesta con otro ejemplo que contiene macros. Espero que ayude
Lo siento, había una palabra de mi último comentario! Quise decir: porque prefiero que no pierdas tiempo trabajando en un guión que probablemente no podría poner en funcionamiento en el trabajo.
@TorbenGundtofte-Bruun Ningún daño hecho :). Es una gran pregunta, y probablemente existan herramientas mejores y más sencillas.

Dado que es probable que desee/necesite hacer esto varias veces a la semana y las operaciones de registro de svn a menudo consumen mucho tiempo, sugeriría tener repositorios locales mercurial de los repositorios de SVN (usando hgsubversion ), para acelerar las cosas.

Mercurial también tiene algunas funciones de salida de registro muy sofisticadas (consulte hg help logy hg help templatespara obtener más detalles), que probablemente podría usar para producir una salida que sería fácilmente modificada en algo como graphviz para generar su gráfico.