Сегодня мы хотим рассказать о новой функции, которая появилась в Бигго пару дней назад. Идея реализовать хранение версий изменяемых шаблонов сайта возникла уже давно, но со временем стало понятно, что эта функция пригодилась бы многим клиентам, которые периодически меняют исходный код шаблонов. Дело в том, что по случайности, либо по незнанию, иногда случаются недоразумения после вмешательства владельцев сайтов в исходный код. Конечно, чаще всего получается все вернуть тем или иным способом, но если бы имелась история версий, это было бы настолько просто, что никто бы даже не стал обращатся за этим в тех. поддержку. К слову сказать, у нас с самого начала имелась функция восстановления шаблона из выбранного дизайна, но во-первых изначальная версия шаблона это не всегда желаемая, во-вторых для новых созданных шаблонов это невозможно, по причине того, что копия существует только одна. (Бекап есть, но это уже отдельная тема).
Итак мы решили сделать все по уму. Долго выбирать систему контроля версий не пришлось, т.к. были критерии отбора:
— децентрализованная(нам нет никакого желания запускать еще и сервер CVS для каждого сайта)
— быстрая
Сюда подходили как минимум несколько вариантов, но т.к. имелся успешный опыт работы с Mercurial
(а он ведь еще и на python написан, как и все остальное у нас), то выбрали его.
Итак при каждом сохранении файла, в общий для сайта репозиторий коммитится новая версия, то есть changeset включает изменение одного файла. В результате как мы можем использовать эти данные:
1. Таблица изменений(что, кто, когда и где менял). Это важно еще и потому, что у нас дилеры могут выполнять задания доп. услуг получая доступ к сайту, в том числе и к шаблонам. В случае чего, кроме общего журнала CMS теперь есть еще и точные данные по изменениям в каждом шаблоне
2. Сравнение версий. Визуализация различий в удобном для восприятия формате. Тут кстати, роль Mercurial заканчивается тем, что он отдает содержимое файлов заданных ревизий, а сравнение происходит уже сторонней библиотекой. Согласитесь, в таком виде изучать различия проще, чем читать unified diff формат, от которого неискушенные пользователи достаточно далеки.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/e65/e59/4e3/e65e594e30e44d6bb9b3f3fc7cc10c90.png)
Тут видно, что удалено, что добавлено(красным и зеленым выделено)
3. Восстановление нужной ревизии файла
Нужно еще отметить, что история ведется не зависимо от того как был изменен файл: через textarea в браузере, либо загружен измененный в редакторе.
Итак мы решили сделать все по уму. Долго выбирать систему контроля версий не пришлось, т.к. были критерии отбора:
— децентрализованная(нам нет никакого желания запускать еще и сервер CVS для каждого сайта)
— быстрая
Сюда подходили как минимум несколько вариантов, но т.к. имелся успешный опыт работы с Mercurial
(а он ведь еще и на python написан, как и все остальное у нас), то выбрали его.
Итак при каждом сохранении файла, в общий для сайта репозиторий коммитится новая версия, то есть changeset включает изменение одного файла. В результате как мы можем использовать эти данные:
1. Таблица изменений(что, кто, когда и где менял). Это важно еще и потому, что у нас дилеры могут выполнять задания доп. услуг получая доступ к сайту, в том числе и к шаблонам. В случае чего, кроме общего журнала CMS теперь есть еще и точные данные по изменениям в каждом шаблоне
2. Сравнение версий. Визуализация различий в удобном для восприятия формате. Тут кстати, роль Mercurial заканчивается тем, что он отдает содержимое файлов заданных ревизий, а сравнение происходит уже сторонней библиотекой. Согласитесь, в таком виде изучать различия проще, чем читать unified diff формат, от которого неискушенные пользователи достаточно далеки.
![](https://habrastorage.org/getpro/habr/post_images/e65/e59/4e3/e65e594e30e44d6bb9b3f3fc7cc10c90.png)
Тут видно, что удалено, что добавлено(красным и зеленым выделено)
3. Восстановление нужной ревизии файла
Нужно еще отметить, что история ведется не зависимо от того как был изменен файл: через textarea в браузере, либо загружен измененный в редакторе.