Было разработано расширение Caché Studio, которое называется Caché-SVN. Это расширение позволяет работать с репозиторием (хранилищем) SVN, не покидая Caché Studio. С его помощью можно выполнять checkout, commit и update.
Caché-SVN работает не с отдельными файлами (классами, программами, csp-страницами и т.д.), а с проектом целиком.
Caché-SVN создаёт временную папку на сервере, где установлено Caché, выгружает туда файлы проекта и выполняет svn commit. Аналогично при svn update полученные xml-описания файлов импортируются в Caché.
Caché-SVN основано на классе %Studio.Extension.Base, который поставляется вместе c Caché и позволяет добавлять свои меню в Caché Studio.
Где взять
Caché-SVN можно скачать с по адресу subversion.assembla.com/svn/intersystems/cache-svn/svn-0.26.xml.zip
Как установить
Собственно SVN
На сервере, на котором находится Caché (а не на той машине, на которой запускается Caché Studio) должен быть доступен файл svn.exe.
Комментарии для коммитов отправляются на сервер в кодировке UTF-8, поэтому в файле config настроек svn вам нужно установить параметр log-encoding = UTF-8.
Если вы устанавливаете Tortoise SVN, то при установке нужно отметить галочку «Устанавливать командные файлы».
Caché-SVN
На время установки вы должны включить возможность записи в базу CACHELIB. Это делается через «Портал управления системой». Выберите «Конфигурация > Конфигурация системы > Локальные базы данных». Щёлкните на ссылке «редактировать» в строке с CACHELIB и в выпадающем списке «Только чтение?» выберите «Нет». После установки Caché-SVN флаг можно будет вернуть обратно.
В Caché Studio выберите область %SYS и импортируйте («Инструменты > Импортировать локально») файл c Caché-SVN. Всё, можно опять запрещать запись в CACHELIB.
Теперь нужно установить области, в которых для контроля версий будет использоваться Caché-SVN. Для этого в «Портале управления системой» выберите «Конфигурация > Дополнительные настройки > Система контроля версий». Для нужных вам областей отметьте класс %SourceControl.SVN и нажмите «OK». Пример в этом туториале будет работать с областью SAMPLES, поэтому выберите класс %SourceControl.SVN как класс системы контроля версий для неё. После установки, в Caché Studio при выборе области, в которой выбран Caché-SVN как система контроля версий, появится меню «Система контроля версий».
Как сделать первый чекаут
Давайте выгрузим наш первый проект в SVN. Для этого вам понадобятся: а) проект и б) svn-репозиторий. В качестве проекта возьмём проект cinema из области SAMPLES. Репозиторий вы можете создать локальный, а можете выбрать любой сервер, который предоставляет частные или публичные svn-репозитории. В нашем примере мы будем использовать сайт assembla.com (да, это реклама).
Итак, зарегистрируйтесь на assembla.com и создайте репозиторий SVN. Assembla сама создаст вам папку trunk, давайте и будем туда класть исходники. Дальше я буду считать, что репозиторий располагается по адресу subversion.assembla.com/svn/cache-cinema/trunk.
Откройте в Caché Studio область SAMPLES. Если вы правильно установили и настроили Caché-SVN, то в Studio будет меню «Система контроля версий».
Откройте проект Cinema и в меню «Проект > Настройки» в раздел Описание добавьте строку svn-repo=https://subversion.assembla.com/svn/cache-cinema/trunk. Сохраните проект («Файл > Сохранить проект»). Таким образом параметр с репозиторием привязывается к проекту. Теперь при экспорте проекта (меню «Инструменты > Экспорт») эта строчка будет выгружена вместе с ним.
Теперь нужно выполнить локальные настройки. Откройте пункт меню «Система контроля версий > Настройки проекта» и впишите
- путь к файлу svn.exe. Если файл svn.exe не находится в системном %PATH%, то нужно указать полный путь (например c:\svn\bin\svn.exe). Дополнительно нужно явно указать папку в которой хранятся настройки SVN. Это делается параметром --config-dir. В итоге строка должа выглядеть так: svn.exe --config-dir c:\svn\conf. Этот путь используется для всех проектов.
- Временная папка. В этой папке хранятся xml-описания классов, которые загружаются из и выгружаются в SVN. Структура папки следующая: Имя-области\ Имя-проекта\файлы-проекта. Всякий раз при чекауте проекта содержимое соответствующей папки будет очищаться. Эта папка тоже одна для всех проектов.
- Параметр «Путь к репозиторию SVN» не редактируется в этом окне и берётся из описания проекта. Зато здесь можно проверить, правильно ли вы его указали.
- Параметру «Класть все классы в одну папку» соответствует строка all-classes-in-one-folder, которая как и svn-repo задаётся в описании проекта. По умолчанию, этот флаг не отмечен и все описания классов группируются по подпапкам в соответствии с пакетами. Если в описании проекта добавить строку all-classes-in-one-folder=1, то все описания классов будут находится в одной папке.
- Имя пользователя — имя пользователя SVN
- Пароль — пароль пользователя SVN
- Параметр «Удалить пароль после первого использования» можно установить, если SVN кеширует пароли (обычно он это делает). В этом случае пароль после первого же использования (обычно, это чекаут) будет удалён с сервера и в дальнейшем будет доставаться самим SVN из кеша.
Имя пользователя, пароль и флаг об удалении пароля хранятся в соответствующей области в глобале ^SVN в узле с именем проекта.
Путь к svn.exe и временная папка хранятся в глобале ^SVN в области %SYS.
Итак, все приготовления сделаны, последнее, что осталось — выбрать пункт меню «Система контроля версий > Checkout». Если вы всё сделали правильно, то в окне Вывода у вас появятся такие строки:
Как сделать коммит
Выберите пункт меню «Система контроля версий > Commit». Введите комментарий, например «Первоначальная выгрузка» и нажмите «Да».
В окне «Вывод» побегут строки, и всё успешно закончится такой картинкой:
Как подключиться к репозиторию
Ну что ж. Проект загружен. Представим теперь, что к нему хочет подключиться ещё один разработчик. Чтобы не ставить ещё одну версию Caché, будем считать, что этот разработчик работает в области USER, а не в области SAMPLES. Установите %SourceControl.SVN как класс системы контроля версий в области USER (если вы этого не сделали раньше).
Создайте новый проект с таким же именем, как проект, хранящийся в репозитории и настройте его — укажите адрес репозитория, логин и пароль и выполните Checkout («Система контроля версий > Checkout»).
Обратите внимание на последнюю строчку, если вы создали проект с именем, отличающимся от имени проекта, который хранится в репозитории, то проект из репозитория всё равно будет загружен. Вам нужно будет найти его в области, открыть, настроить и сделать чекаут уже для него.
Обратите также внимание, что в области SAMPLES csp-файлы находились в приложении csp/samples. При импорте в область USER все csp-файлы перемещаются в csp-приложение по умолчанию для области USER — csp/user.
Совместная работа
Отлично, проект загружен в обе области. Давайте посмотрим, как выглядит совместная работа двух пользователей над проектом.
В области USER откройте файл Search.csp и измените его заголовок на «Search page title». Если хотите поменяйте ещё что-нибудь или добавьте новый класс / программу к проекту. Сделайте commit.
Видите? Мы сделали изменения только в одном файле, а отправилось аж девять. Сведения о проекте Cinema (файл Cinema.prj.xml) изменились, потому что в описании проекта хранящемся на сервере csp-файлы находятся в приложении csp/samples, а наши csp-файлы в приложении csp/user.
Поэтому же отправляются и описания всех csp-файлов. В их xml-описании присутствует строка, которая указывает к какому csp-приложению этот файл относится. Приложение изменилось — файл нужно опять отправить на сервер.
Если теперь опять изменить заголовок страницы Search.csp и выполнить коммит, то отправится только Search.csp — изменения csp-приложения с csp/samples на csp/user уже закоммичены.
Как сделать Update
Давайте теперь загрузим изменения в область SAMPLES. Перейдите в неё и выполните Update («Система контроля версий > Update»). Заголовок у страницы Search.csp изменился. Caché-SVN не перекомпилирует проект при загрузке. Вам нужно это сделать самим.
Разрешение конфликтов
При возникновении конфликтов при Update или Commit SVN вставляет свои маркеры с изменениями в файл. Содержимое классов (или программ, или csp-страниц) загружается в Caché вместе с этими маркерами. В некоторых случаях маркеры ломают xml-разметку описаний файлов и импорт этих файлов становится невозможным. Тогда xml-описание целиком загружается во временную программу.
Пример 1
В области SAMPLES откройте класс Cinema.Film и в запросе TopFilms добавьте в WHERE условие «AND (Rating = 'G')». Выполните коммит.
Теперь откройте область USER и в том же классе Cinema.Film и в том же запросе TopFilms добавьте в WHERE другое условие — «AND (Rating in ('G','PG'))». Выполните Update.
После того, как вы оставите в файле только нужные строчки, выберите пункт меню «Система контроля версий > Пометить конфликт как разрешённый». Конфликт в открытом файле закроется и не будет мешать выполнению коммита. Выполните коммит.
Пример 2
В области SAMPLES откройте класс Cinema.Film и в первой строке запросе TopCategory поменяйте «Top 3» на «Top 6» и сделайте коммит. В области USER откройте этот же класс Cinema.Film и в том же запросе TopCategory поменяйте «Top 3» на «Top 7» и сделайте Update.
Разметка xml-описания при таком Update будет сломана и импорт выполнить не удастся. В таком случае будет создана временная программа DIFF.Cinema.Film.cls.xml, в неё будет загружен xml-файл, который не получилось импортировать.
После того как конфликт для файла Cinema.Film.xls будет отмечен как разрешённый, эта временная программа будет удалена.
Другие команды меню
Не упомянутыми остались следующие функции Caché-SVN:
- В любой момент вы можете откатить изменения сделанные после последнего update’а выбрав меню «Отменить изменения».
- Посмотреть комментарии к коммитам можно через меню «История изменений».
- Вернуться к предыдущей ревизии можно с помощью меню «Update to revision». Вам нужно будет указать номер ревизии.
Заключение
Caché-SVN тестировалась на версии svn 1.7.5 и версиях Caché 2012.2 для Windows и Linux. Аналогично будет работать и на Ensemble.
Замечания, пожелания и найденные ошибки оставляйте в комментариях или присылайте на ящик akoblov@gmail.com.