Версионный контроль документов с Fossil

Как организовать версионный контроль для документов, поступающих из множества разных источников?

На сегодняшний момент текстовые редакторы удобной возможности для версионного контроля и последующего объединения не предоставляют, по крайней мере мне так кажется. MS Word неудобен, особенно в тех случаях, когда работа идёт в таблицах.

Предлагаю следующий вариант:

  1. Таблица конвертируется в html
  2. html пропускается через HTML Tidy (tidy -w 64 -i -m [%source%|-o %target%]), тем самым получается более-менее нормальный html. Почему так сделано? Потому что из MS Word получить нормальную grid table через pandoc невозможно, он почему-то делает колонки узкими и разрывает слова, а значит такой grid table при обратной конверсии будет нечитабелен, слова будут разорваны.
  3. Этот html мы помещаем в репозиторий fossil (fossil add %file% && fossil commit -m "Версия документа, отправленная на согласование")
  4. После поступления правок от второй стороны вносим нужные правки и сохраняем документ.
  5. Помещаем измененную версию в новую ветку (fossil commit -m "Версия с правками от Министерства" --branch Ministry_edits), эта команда сразу создаст нужную ветку на основе существующей.
  6. Чтобы посмотреть разницу, пишем 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

…и мы смотрим все правки параллельно.