Инструмент для иллюстрации деревьев репозиториев SVN?

Моя команда использует пять отдельных репозиториев SVN для пяти различных модулей или приложений, которые мы поддерживаем. Каждый из них имеет свою собственную последовательность версий.

Нам нравится иметь «настенный плакат» о текущем состоянии наших репозиториев с их ветками. В настоящее время мы используем для этого доску, и она работает достаточно хорошо. Но мне интересно , существует ли инструмент, который может помочь нам в этом? Меня бы устроило обновление документа вручную (Visio или что-то еще), но, конечно, бонусные баллы за инструмент, который может автоматически извлекать данные с нашего сервера SVN.

Наша доска выглядит примерно так: У нас в багажнике основная линия разработки ===. Когда выпуск завершен, мы помечаем его oи создаем ветку обслуживания ---, чтобы мы могли доставлять теги выпуска с исправлениями ошибок o, пока продолжается разработка ствола.

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---

...

Есть ли инструмент, который мог бы помочь поддерживать «плакат», похожий на этот? Обратите внимание, что я хочу сделать это для нескольких репозиториев на сервере, а не только для одного репо, и что меня интересуют только теги , а не отдельные проверки.

Не уверен, что это точно подходит, но у Trac есть несколько дополнений для этого, использующих Graphviz для автоматической визуализации репозиториев. Не уверен, что это можно настроить для создания именно тех деревьев, которые вам нужны, но это, безусловно, стоит посмотреть. См., например, его плагин Revtree (на странице есть скриншоты).
Не ответ, так как вы уже используете SVN и предположительно застряли с ним, но именно поэтому я перевел нашу маленькую компанию с SVN на Plastic SCM. «Обозреватель ветвей был создан на основе типичной диаграммы на доске, которую рисует каждая команда, когда пытается объяснить структуру слияния проекта» — Plasticscm.com/branch-explorer/index.html Возможно, это может помочь другим, кто нашел этот вопрос и интересуется . либо в состоянии переключиться, либо ищет новую VCS ... Plasticscm.com/branch-explorer/assets/img/…

Ответы (2)

ТикЗ

TikZ — это пакет (La)TeX для рисования всевозможных диаграмм. Я использую его для большинства моих нужд рисования. Его особенности включают в себя:

  • Интуитивно понятный синтаксис языка
  • Векторная графика (чтобы вы могли масштабировать свой постер до любого размера),
  • Огромный выбор библиотек,
  • Возможность определять пользовательские команды и стили
  • Подробное руководство пользователя ,
  • Отличная поддержка сообщества на TeX.SE (самый популярный тег вопроса, почти 9000 вопросов).

Вот пример первой части вашей диаграммы, нарисованной с помощью TikZ:


Исходный код для приведенной выше диаграммы:

\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}

Изменить в отношении автоматизации

Чтобы автоматизировать эти диаграммы, вам придется использовать макросы в пакете TikZ. Поскольку выполнение математических операций в TikZ по-прежнему является проблемой, было бы еще лучше, если бы вы могли использовать другой мощный язык для редактирования texфайла, например Perl или Python. Их также можно использовать для извлечения данных из ваших файлов журналов SVN, обеспечивая полностью автоматизированный процесс.

Вот попытка автоматизировать приведенную выше диаграмму, используя только TikZ с 3 входными переменными: первый и последний обороты и количество ветвей. Конечно, это работает только для этой конкретной формы деревьев, но это послужит примером того, как работают макросы.

основной сценарий

\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}

импортированный файл

\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);}

Это создаст дерево, похожее на рисунок выше, но если вы увеличите числа в разделе « Конфигурация » (например, 12345, 12360 и 8), вы можете получить довольно длинное дерево:

Результат

(Нажмите на изображение для увеличения)

Спасибо, воссоздание моей диаграммы, безусловно, демонстрирует, насколько хорошо работает ваше предложение. Это кажется очень структурированным — теперь, если бы был способ генерировать это автоматически, это было бы идеально.
@TorbenGundtofte-Bruun Я бы сказал, что это вполне возможно, но определенно не то, что можно было бы состряпать во время долгого перерыва на кофе. При наличии достаточного количества времени можно определить ряд макросов в TeX, чтобы сформировать образец диаграмм, а затем написать сценарий на мощном языке программирования, таком как Perl или Python. Он будет считывать данные из вашего файла журнала SVN и генерировать соответствующую картинку. Может быть, если бы вы могли опубликовать пример файла журнала, который соответствует опубликованной диаграмме, и я попытаюсь опубликовать пример сценария, чтобы прочитать это
Да, требуется какой-то анализ файлов SVN. Я не даю вам файл журнала - не из соображений секретности, а потому, что я бы не хотел, чтобы вы тратили время на разработку сценария, который я, вероятно, мог бы запустить в реальной работе на работе.
@TorbenGundtofte-Bruun Я отредактировал ответ другим примером, содержащим макросы. Я надеюсь, что это помогает
Извините, было слово из моего последнего комментария! Я имел в виду: потому что я бы не хотел, чтобы вы тратили время на разработку сценария, который я, вероятно, не смогу реализовать на работе.
@TorbenGundtofte-Bruun Ничего страшного :). Это отличный вопрос, и, вероятно, есть лучшие и более простые инструменты.

Поскольку вы, вероятно, захотите/должны делать это несколько раз в неделю, а операции с журналами svn часто занимают много времени, я бы предложил использовать mercurial локальные репозитории репозиториев SVN (используя hgsubversion ), чтобы ускорить процесс.

Mercurial также имеет несколько очень сложных средств вывода журнала (см. hg help logи hg help templatesдля получения дополнительной информации), которые вы, вероятно, могли бы использовать для создания вывода, который можно было бы легко преобразовать во что-то вроде graphviz , чтобы получить свой график.