Mantis + GraphViz
После предыдущего эксперимента мне понравилось работать с GraphViz, к тому же я давно хотел понять как именно использовать его для отрисовки графов, поэтому я решил сделать небольшой скриптик с использованием dot.
Получение данных
Я решил найти API нашей системы багтрекинга Mantis чтобы взять оттуда список багов и построить граф зависимостей. Я помню что когда то читал об этом API. Оказалось что Mantis предоставляет SOAP API для получения всей необходимой информации о багах (MantisConnect). Так как из Node работать с SOAP оказалось не очень удобно, я переключился на PHP. Я использовал класс NuSOAP чтобы не изобретать велосипед лишний раз. Обращение к Мантису с помощью NuSOAP делается примерно так:
require_once('nusoap-0.9.5/lib/nusoap.php');
$WSDL_POINT = "https://mantis.example.com/api/soap/mantisconnect.php";
$username = 'username';
$password = 'password';
$proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
$proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
$proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
$proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
$useCURL = isset($_POST['usecurl']) ? $_POST['usecurl'] : '0';
$client = new nusoap_client($WSDL_POINT, false,
$proxyhost, $proxyport, $proxyusername, $proxypassword);
Теперь можно вызывать методы. Я решил просто создать в Мантисе фильтр на нужные баги и получать его результаты:
$params = array(
'username' => $username,
'password' => $password,
'project_id' => 42, // Проект, который нас интересует (можно посмотреть в веб-интерейсе Mantis)
'filter_id' => 987, // ID фильтра, можно посмотреть на странице управления фильтрами
'page_number' => 1,
'per_page' => 400 // получить 400 записей
);
$result = $client->call('mc_filter_get_issues', $params, 'https://mantis.example.com:443/api/soap/mantisconnect.php', 'http://soap.amazon.com');
В $result окажется результат обращения к API — массив багов с соответствующими полями. Теперь надо перевести его в формат, подходящий для построения графика.
Graphviz и DOT-файлы
По примеру cg2dot я решил выводить данные в виде DOT-файла. Описание формата можно найти в Wikipedia — он довольно простой. Я просто прошёл по массиву багов и вывел все описания в виде 12345 [label="24430: example issue description"]; и связи parent-child в виде 12345 -> 12346. К сожалению, я не нашёл способа одновременно рисовать направленные и ненаправленные ребра, потому для related to я использовал стрелки в обоих направлениях. Все строки записываются внутри конструкции digraph issues { / }. Я ещё добавил строку rankdir=LR чтобы узлы отрисовывались сверху вниз. По умолчанию dot отрисовывает их в строку, и с длинными описаниями багов получается довольно неудобная картина.
В результате у меня получился граф зависимостей багов. Я ещё немного дописал код чтобы баги разного приоритета выводились разными цветами (12345 [color="green"];). Получившийся код я запускаю прямо из командной строки:
C:\xampp\htdocs\issues>php index.php | "c:\Program Files\Graphviz2.24\bin\dot.exe" -Tpng -o21-mar-11_19-41.png
В имя выходного файла я добавляю текущее время чтобы было удобно различать разные даты. В результате получается неплохое наглядное представление текущего положения дел в релизе. Я хочу запускать этот скрипт периодически чтобы потом можно было посмотреть прогресс по дням.
UPD: испытал код на мантисе для Dwarf Fortress, получился огромный граф.