воскресенье, апреля 10, 2011

DocBook 5 + Git log

При создании технической документации на информационные системы принято одной секцией давать таблицу с историей изменения документа. Если при написании документации используются системы контроля версий, то грех не автоматизировать процесс создания этой таблицы.
В качестве стандарта для технической документации возьмем DocBook 5. Поскольку в конечном итоге это xml файл, к нему применимы XInclude, а значит таблицу можно вынести в отдельную секцию и просто вставлять в главу книги или статью. Будем считать, что в таблице нам надо только два поля - Дата изменения и Содержание изменения с именем Автора. Эти данные надо взять из системы контроля версий. Лично мне нравится Git и все необходимые данные можно получить из git log с опцией --format. К примеру git log --format=format:"%ai|%an,%ae:%s" выдаст что-то типа 2011-04-09 23:23:24 +0400|Author,user@mail.com:Commit subject. Будем использовать символ "|" для разделения полей. Скорее всего такой генератор прийдется тюнить под свои нужды для каждого проекта, поэтому сделаем все в виде скрипта на python. Выглядит это так:
#!/usr/bin/python
# -*- coding: utf-8 -*-

import subprocess

gitlog = subprocess.Popen(['git','log', '--format=format:"%ai|%an,%ae: %s"', '-n 20'], stdout=subprocess.PIPE)

f = open('gitlog.xml', 'w')
f.write(
"""<?xml version="1.0" encoding="UTF-8"?>
<sect1 xmlns="http://docbook.org/ns/docbook" version="5.0">
<title>История изменений документа</title><table xml:lang="ru"><caption>История изменений</caption><col width="20%"/><col width="80%"/>
<thead><tr><th>Дата</th><th>Содержание</th></tr></thead>
<tbody>
"""
)

while True:
line = gitlog.stdout.readline()
if line != '':
line= line[1:len(line)-2]
cols=line.split("|")
f.write("<tr><td>"+cols[0]+"</td><td>"+cols[1]+"</td></tr>")
else:
break

f.write("</tbody></table></sect1>")
f.close()

Из скрипта понятно, что в историю выводим последние 20 коммитов. Запуская скрипт из директории с репозиторием Git, создается xml-файл секции DocBook с таблицей коммитов под наименованием gitlog.xml. Осталось собрать книгу и вставить в нужное место нашу табличку.
Собираем книгу book.xml:
<?xml version="1.0" encoding="UTF-8"?>
<?oxygen RNGSchema="http://www.oasis-open.org/docbook/xml/5.0/rng/docbookxi.rng" type="xml"?>
<book xmlns="http://docbook.org/ns/docbook" 
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:lang="ru"
>
<info>
<title>Единая федеральная информационная система ВОРЕНОИЦПУРРОК (подпрограмма 2012-2130 годы)</title>
<author>
<orgname>Федеральная служба ВОРЕНОИЦПУРРОК</orgname>
<address>
<city>Дефолт-сити</city>
<street>Дефолт-стрит</street>
<postcode>000000</postcode>
<country>Снежная Нигерия</country>
</address>
<email>effective.manager@kremlin.ru</email>
</author>
</info>

<xi:include href="preface.xml"/>
<xi:include href="chapter01.xml"/>
<xi:include href="chapter02.xml"/>
<xi:include href="chapter03.xml"/>    

</book>

видно, что в книге есть вставки предисловия и трех глав. Собираем предисловие (preface.xml):
<?xml version="1.0" encoding="UTF-8"?>
<preface xmlns="http://docbook.org/ns/docbook" version="5.0" xmlns:xi="http://www.w3.org/2001/XInclude" xml:lang="ru">
<title>Предисловие</title>
<sect1><title>Кому нужна Единая федеральная информационная система ВОРЕНОИЦПУРРОК?</title>
<para>Размах тотального оболванивания электората в условиях бурного развития современных информационных технологий
ставит вопрос о необходимости новой волны активизации процессов закупки государством воздуха в форме информационных систем.
Безграничные возможности осуществления этих мероприятий за счет государственного бюджета или доходов государственных предприятий,
являющимися естественными или неестественными монополиями, позволят значительно укрепить личные активы государственных
эффективных менеджеров. Разработка и внедрение системы ВОРЕНОИЦПУРРОК, наравне с созданием аналогичных систем
ЕГАИС, ЕФИСН, ГКН, ГИСТЭК, ЕГИС ОТБ, ЕГС-АБЫРВАЛГ и др.,
позволит значительно увеличить отрицательное значение Коэффициента Полезного Действия (КПД)
процессов во всех областях деятельности на ближайшие 119 лет.
</para>
</sect1>
<!-- А вот здесь вот changelog от Git -->    
<xi:include href="gitlog.xml"/>   

</preface>

Обращаем внимание на вставку gitlog.xml. Ну и пример сгенерированной секции:
<?xml version="1.0" encoding="UTF-8"?>
<sect1 xmlns="http://docbook.org/ns/docbook" version="5.0">
<title>История изменений</title>
<table xml:lang="ru"><caption>Таблица истории изменения</caption>
<col width="20%"/><col width="80%"/>
<thead><tr><th>Дата</th><th>Содержание</th></tr></thead>
<tbody>
<tr><td>2011-04-10 03:42:11 +0400</td><td>Эффективный менеджер, effective.manager@kremlin.ru: Коллеги подсказали, 
что сейчас самая модная сумма - триллион, для достижения такой суммы придумал еще две статьи расходов и
описал их в секциях 3.5 и 3.6
</td></tr>
<tr><td>2010-04-09 23:23:24 +0400</td><td>Эффективный менеджер, effective.manager@kremlin.ru: В связи с тем, что друг семьи тоже решил
стать эффективным государственным менеджером, заложил основы для создания
подпрограммы развития системы ВОРЕНОИЦПУРРОК с 2130 по 2200 годы
</td></tr>
<tr><td>2009-04-09 20:24:28 +0400</td><td>Эффективный менеджер, effective.manager@kremlin.ru: Удалил секцию 3.2 по причине того, что 5
процентов отката от ВОРЕНОИЦПУРРОК, причитающегося мне, отдали сыну моего
начальника. Вот пусть эту секцию сотрудники его департамента и пишут.
</td></tr>
<tr><td>2008-04-09 20:23:53 +0400</td><td>Эффективный менеджер, effective.manager@kremlin.ru: Написал главу 5, на вырученные деньги, по
совету друзей, купил виллу на Лазурном берегу и французское гражданство.
</td></tr>
</tbody></table></sect1>



При печати документа в PDF будет получен вполне сносный результат:

Комментариев нет:

Мой список блогов