Версионный контроль документов с Fossil
Как организовать версионный контроль для документов, поступающих из множества разных источников?
На сегодняшний момент текстовые редакторы удобной возможности для версионного контроля и последующего объединения не предоставляют, по крайней мере мне так кажется. MS Word неудобен, особенно в тех случаях, когда работа идёт в таблицах.
Предлагаю следующий вариант:
- Таблица конвертируется в html
- html пропускается через HTML Tidy (tidy -w 64 -i -m [%source%|-o %target%]), тем самым получается более-менее нормальный html. Почему так сделано? Потому что из MS Word получить нормальную grid table через pandoc невозможно, он почему-то делает колонки узкими и разрывает слова, а значит такой grid table при обратной конверсии будет нечитабелен, слова будут разорваны.
- Этот html мы помещаем в репозиторий fossil (fossil add %file% && fossil commit -m "Версия документа, отправленная на согласование")
- После поступления правок от второй стороны вносим нужные правки и сохраняем документ.
- Помещаем измененную версию в новую ветку (fossil commit -m "Версия с правками от Министерства" --branch Ministry_edits), эта команда сразу создаст нужную ветку на основе существующей.
- Чтобы посмотреть разницу, пишем fossil diff --branch Ministry_edit --command "icdiff.py -N --cols 200", то есть делаем diff сразу по всей ветке (по умолчанию --branch сравнивает нужную ветку с trunk), и для дифференциала вызываем скрипт icdiff с указанием номеров строк и общей шириной двухколоночного вывода в 200 символов (что соответствует моему терминалу).
Чтобы сравнить две ветки (по последним коммитам), пишем fossil diff --from branch01 --to branch02 --command "icdiff.py -N --cols 200". Вместо имени ветки может стоять хэш отдельного коммита: fossil diff --from 1c24 --to fe53 --command "icdiff --cols 230".
Чуть позже появился другой вариант, основанный на reStructuredText.
B rst используем формат .. list-table:: и далее по вертикали построчно печатается таблица.
Таблицу из формата grid-table в list-table можно конвертировать при помощи rsrlisttable из питоновского пакета rstdoc.
Такие вертикальные псевдотаблицы отлично читаются pandoc и другими конвертерами; в grid-table их можно конвертировать тем же pandoc.
То есть тулчейн выглядит так: docx -> pandoc --wrap=none -> markdown_grid-table -> rstlisttable -> rst, после чего помещаем rst с такими таблицами в репозиторий.
Вспомнил ещё кое-что: в pandoc есть параметр --columns, его надо указывать, чтобы таблицы выводились на экран из rst в markdown правильно (необходимо поставить ширину хотя бы 200-250 поставить) если нужно посмотреть содержимое репозитория; если мы выводим в репозиторий, то конечно нужно использовать --wrap=none, иначе принудительные разрывы строк придётся чистить. Чтобы посмотреть состояние репозитория (в частности, хэши коммитов в ветках, если мы хотим их сравнить), пишем fossil timeline. А чтобы вывести нужный коммит… fossil cat map.rst -r 03c11 | pandoc -f rst -t markdown --columns 270, и вуаля.
В pandoc есть параметр --track-changes=accept|reject|all, с его помощью можно поиграться с правками. Поиграть можно так:
- pandoc -f docx -t markdown --columns 270 --wrap=none --track-changes=reject %1 > from.txt && rstlisttable -i from.txt
- pandoc -f docx -t markdown --columns 270 --wrap=none --track-changes=accept %1 > to.txt && rstlisttable -i to.txt
- icdiff --strip-trailing-cr --cols 270 from.txt to.txt
…и мы смотрим все правки параллельно.