diff --git a/features/gitsync-sync.feature b/features/gitsync-sync.feature new file mode 100644 index 00000000..9cd0ae4a --- /dev/null +++ b/features/gitsync-sync.feature @@ -0,0 +1,95 @@ +# language: ru + +Функционал: Инициализация каталога исходников конфигурации + Как Пользователь + Я хочу выполнять автоматическую синхронизацию конфигурации из хранилища + Чтобы автоматизировать свою работы с хранилищем с git + +Контекст: Тестовый контекст + Когда Я очищаю параметры команды "gitsync" в контексте + И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке + И Я добавляю параметр "sync" для команды "gitsync" + И Я создаю временный каталог и сохраняю его в контекст + И я скопировал каталог тестового хранилища конфигурации во временный каталог + И Я сохраняю значение временного каталога в переменной "КаталогХранилища1С" + И Я создаю временный каталог и сохраняю его в контекст + И Я сохраняю значение временного каталога в переменной "ПутьКаталогаИсходников" + И Я создаю тестовой файл AUTHORS + И Я записываю "0" в файл VERSION + И Я создаю временный каталог и сохраняю его в контекст + И Я инициализирую bare репозиторий во временном каталоге + И Я сохраняю значение временного каталога в переменной "URLРепозитория" + И я инициализирую связь "ПутьКаталогаИсходников" с внешним репозиторием "URLРепозитория" + И я включаю отладку лога с именем "oscript.app.gitsync" + И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" + И Я добавляю позиционный параметр для команды "gitsync" из переменной "URLРепозитория" + И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" + +Сценарий: Простая синхронизация хранилища с git-репозиторием + Допустим Я создаю временный каталог и сохраняю его в контекст + И Я сохраняю значение временного каталога в переменной "ВременнаяДиректория" + И Я добавляю параметр "-tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" + Когда Я выполняю команду "gitsync" + Тогда Вывод команды "gitsync" содержит "ИНФОРМАЦИЯ - Синхронизация завершена" + И Вывод команды "gitsync" не содержит "Внешнее исключение" + И Код возврата команды "gitsync" равен 0 + +Сценарий: Синхронизация хранилища с git-репозиторием без tool1CD + Допустим Я добавляю параметры для команды "gitsync" + |--storage-user Администратор| + |-useVendorUnload| + Когда Я выполняю команду "gitsync" + Тогда Вывод команды "gitsync" содержит "ИНФОРМАЦИЯ - Синхронизация завершена" + И Вывод команды "gitsync" не содержит "Внешнее исключение" + И Код возврата команды "gitsync" равен 0 + +Сценарий: Синхронизация хранилища с git-репозиторием с дополнительными параметрами без tool1CD + Допустим Я добавляю параметр "-useVendorUnload" для команды "gitsync" + И Я создаю временный каталог и сохраняю его в контекст + И Я сохраняю значение временного каталога в переменной "ВременнаяДиректория" + И Я добавляю параметр "-tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" + И Я добавляю параметры для команды "gitsync" + |--storage-user Администратор| + |-useVendorUnload| + |-check-authors| + |-auto-set-tags| + |-process-fatform-modules| + И Я добавляю параметр "-push-every-n-commits 5" для команды "gitsync" + Когда Я выполняю команду "gitsync" + Тогда Вывод команды "gitsync" содержит "ИНФОРМАЦИЯ - Синхронизация завершена" + И Вывод команды "gitsync" не содержит "Внешнее исключение" + И Код возврата команды "gitsync" равен 0 + +Сценарий: Синхронизация хранилища с git-репозиторием с выгрузкой только изменений + Допустим Я создаю временный каталог и сохраняю его в контекст + И Я сохраняю значение временного каталога в переменной "ВременнаяДиректория" + И Я добавляю параметр "-increment" для команды "gitsync" + Когда Я выполняю команду "gitsync" + Тогда Вывод команды "gitsync" содержит "ИНФОРМАЦИЯ - Синхронизация завершена" + И Вывод команды "gitsync" не содержит "Внешнее исключение" + И Код возврата команды "gitsync" равен 0 + +Сценарий: Синхронизация хранилища с git-репозиторием с выгрузкой только изменений без tool1CD + Допустим Я добавляю параметры для команды "gitsync" + |--storage-user Администратор| + |-increment| + |-useVendorUnload| + Когда Я выполняю команду "gitsync" + Тогда Вывод команды "gitsync" содержит "ИНФОРМАЦИЯ - Синхронизация завершена" + И Вывод команды "gitsync" не содержит "Внешнее исключение" + И Код возврата команды "gitsync" равен 0 + + +Сценарий: Синхронизация хранилища с git-репозиторием с проверкой заполненности комментария + Допустим Я добавляю параметр "-stop-if-empty-comment" для команды "gitsync" + Когда Я выполняю команду "gitsync" + Тогда Вывод команды "gitsync" содержит "КРИТИЧНАЯОШИБКА - Нашли следующую версию <4> от автора <Администратор>, а комментарий не задан!" + И Код возврата команды "gitsync" равен 1 + +Сценарий: Синхронизация хранилища с git-репозиторием с проверкой авторов версий в хранилище + Допустим Я добавляю параметр "-check-authors" для команды "gitsync" + И Я создаю неполный тестовой файл AUTHORS + И Я инициализирую связь "ПутьКаталогаИсходников" с внешним репозиторием "URLРепозитория" + Когда Я выполняю команду "gitsync" + Тогда Вывод команды "gitsync" содержит "КРИТИЧНАЯОШИБКА - Пользователю хранилища <Администратор> не сопоставлен пользователь git." + И Код возврата команды "gitsync" равен 1 diff --git a/features/step_definitions/gitsync-init.os b/features/step_definitions/gitsync-init.os index ffccaa2a..66d07ff4 100644 --- a/features/step_definitions/gitsync-init.os +++ b/features/step_definitions/gitsync-init.os @@ -121,7 +121,7 @@ ОжидаемыйКодВозврата = 0; - СтрокаКоманды = СтрШаблон("oscript.exe %1 %2 %3 %4", "-encoding=utf-8", ПутьГитсинк, Команда, БДД.ПолучитьИзКонтекста("ПараметрыГитсинк")); + СтрокаКоманды = СтрШаблон("oscript %1 %2 %3 %4", "-encoding=utf-8", ПутьГитсинк, Команда, БДД.ПолучитьИзКонтекста("ПараметрыГитсинк")); ТекстФайла = ""; КодВозврата = ВыполнитьПроцесс(СтрокаКоманды, ТекстФайла); diff --git a/features/step_definitions/gitsync-sync.os b/features/step_definitions/gitsync-sync.os new file mode 100644 index 00000000..3e68b3d5 --- /dev/null +++ b/features/step_definitions/gitsync-sync.os @@ -0,0 +1,227 @@ +// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd +#Использовать gitrunner +#Использовать asserts +#Использовать tempfiles + +Перем БДД; //контекст фреймворка 1bdd + +// Метод выдает список шагов, реализованных в данном файле-шагов +Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт + БДД = КонтекстФреймворкаBDD; + + ВсеШаги = Новый Массив; + + ВсеШаги.Добавить("ЯУстанавливаюПутьВыполненияКомандыКТекущейБиблиотеке"); + ВсеШаги.Добавить("ЯСкопировалКаталогТестовогоХранилищаКонфигурацииВоВременныйКаталог"); + ВсеШаги.Добавить("ЯСохраняюЗначениеВременногоКаталогаВПеременной"); + ВсеШаги.Добавить("ЯСоздаюТестовойФайлAuthors"); + ВсеШаги.Добавить("ЯЗаписываюВФайлVersion"); + ВсеШаги.Добавить("ЯИнициализируюBareРепозиторийВоВременномКаталоге"); + ВсеШаги.Добавить("ЯИнициализируюСвязьСВнешнимРепозиторием"); + ВсеШаги.Добавить("ЯДобавляюПозиционныйПараметрДляКомандыИзПеременной"); + ВсеШаги.Добавить("ЯДобавляюПараметрДляКомандыИзПеременной"); + ВсеШаги.Добавить("ЯДобавляюПараметрыДляКоманды"); + ВсеШаги.Добавить("ЯСоздаюНеполныйТестовойФайлAuthors"); + + Возврат ВсеШаги; +КонецФункции + +Функция ИмяЛога() Экспорт + Возврат "bdd.gitsync.feature"; +КонецФункции + + +// Реализация шагов + +// Процедура выполняется перед запуском каждого сценария +Процедура ПередЗапускомСценария(Знач Узел) Экспорт + ЯСоздаюНовыйОбъектГитрепозиторий() +КонецПроцедуры + +// Процедура выполняется после завершения каждого сценария +Процедура ПослеЗапускаСценария(Знач Узел) Экспорт + ВременныеФайлы.Удалить(); +КонецПроцедуры + +//Я инициализирую bare репозиторий во временном каталоге +Процедура ЯИнициализируюBareРепозиторийВоВременномКаталоге() Экспорт + ГитРепозиторий = БДД.ПолучитьИзКонтекста("ГитРепозиторий"); + ВременныйКаталог = БДД.ПолучитьИзКонтекста("ВременныйКаталог"); + ГитРепозиторий.УстановитьРабочийКаталог(ВременныйКаталог); + ПараметрыКоманды = Новый Массив; + ПараметрыКоманды.Добавить("init"); + ПараметрыКоманды.Добавить("--bare"); + ГитРепозиторий.ВыполнитьКоманду(ПараметрыКоманды); + +КонецПроцедуры + +//Я создаю новый объект ГитРепозиторий +Процедура ЯСоздаюНовыйОбъектГитрепозиторий() Экспорт + ГитРепозиторий = Новый ГитРепозиторий; + БДД.СохранитьВКонтекст("ГитРепозиторий", ГитРепозиторий); +КонецПроцедуры + +//Я сохраняю значение временного каталога в переменной "URLРепозитория" +Процедура ЯСохраняюЗначениеВременногоКаталогаВПеременной(Знач ИмяПеременной) Экспорт + ВременныйКаталог = БДД.ПолучитьИзКонтекста("ВременныйКаталог"); + БДД.СохранитьВКонтекст(ИмяПеременной, ВременныйКаталог); +КонецПроцедуры + +//я инициализирую каталог исходников +Процедура ЯИнициализируюКаталогИсходников() Экспорт + + ВременныйКаталог = БДД.ПолучитьИзКонтекста("ВременныйКаталог"); + + ПутьКаталогаИсходников = ВременныйКаталог; + + СоздатьКаталог(ПутьКаталогаИсходников); + + БДД.СохранитьВКонтекст("ПутьКаталогаИсходников",Новый Файл(ПутьКаталогаИсходников)); + +КонецПроцедуры + +//Я создаю тестовой файл AUTHORS +Процедура ЯСоздаюТестовойФайлAuthors() Экспорт + + ПутьКаталогаИсходников = БДД.ПолучитьИзКонтекста("ПутьКаталогаИсходников"); + ФайлАвторов = Новый ЗаписьТекста; + ФайлАвторов.Открыть(ОбъединитьПути(ПутьКаталогаИсходников, "AUTHORS"), "utf-8"); + ФайлАвторов.ЗаписатьСтроку("Администратор=Администратор "); + ФайлАвторов.ЗаписатьСтроку("Отладка=Отладка "); + ФайлАвторов.Закрыть(); + +КонецПроцедуры + +//Я записываю "0" в файл VERSION +Процедура ЯЗаписываюВФайлVersion(Знач НомерВерсии) Экспорт + + ПутьКаталогаИсходников = БДД.ПолучитьИзКонтекста("ПутьКаталогаИсходников"); + + ПутьКФайлуВерсий = ОбъединитьПути(ПутьКаталогаИсходников,"VERSION"); + Попытка + Запись = Новый ЗаписьТекста(ПутьКФайлуВерсий, "utf-8"); + Запись.ЗаписатьСтроку(""); + Запись.ЗаписатьСтроку("" + НомерВерсии + ""); + Запись.Закрыть(); + Исключение + Если Запись <> Неопределено Тогда + ОсвободитьОбъект(Запись); + КонецЕсли; + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +//я инициализирую связь "ПутьКаталогаИсходников" с внешним репозиторием "URLРепозитория" +Процедура ЯИнициализируюСвязьСВнешнимРепозиторием(Знач ПеременнаяПутьКаталогаИсходников, Знач ПеременнаяURLРепозитория) Экспорт + + ГитРепозиторий = БДД.ПолучитьИзКонтекста("ГитРепозиторий"); + URLРепозитория = БДД.ПолучитьИзКонтекста(ПеременнаяURLРепозитория); + ПутьКаталогаИсходников = БДД.ПолучитьИзКонтекста(ПеременнаяПутьКаталогаИсходников); + + ГитРепозиторий.УстановитьРабочийКаталог(ПутьКаталогаИсходников); + ГитРепозиторий.Инициализировать(); + ПараметрыКоманды = Новый Массив; + ПараметрыКоманды.Добавить("add"); + ПараметрыКоманды.Добавить("--all"); + ГитРепозиторий.ВыполнитьКоманду(ПараметрыКоманды); + ГитРепозиторий.Закоммитить("тест"); + + НастройкаОтправить = Новый НастройкаКомандыОтправить; + НастройкаОтправить.УстановитьURLРепозиторияОтправки(URLРепозитория); + НастройкаОтправить.ОтображатьПрогресс(); + НастройкаОтправить.ПерезаписатьИсторию(); + НастройкаОтправить.Отслеживать(); + НастройкаОтправить.ПолнаяОтправка(); + + ГитРепозиторий.УстановитьНастройкуКомандыОтправить(НастройкаОтправить); + + ГитРепозиторий.Отправить(); + +КонецПроцедуры + +//Я добавляю позиционный параметр для команды "gitsync" из переменной "URLРепозитория" +Процедура ЯДобавляюПозиционныйПараметрДляКомандыИзПеременной(Знач ИмяКоманды, Знач ИмяПеременной) Экспорт + + Команда = БДД.ПолучитьИзКонтекста(КлючКоманды(ИмяКоманды)); + ЗначениеПеременной = БДД.ПолучитьИзКонтекста(ИмяПеременной); + + Команда.ДобавитьПараметр(ЗначениеПеременной); + +КонецПроцедуры + +//Я добавляю параметр "-tmpdir" для команды "gitsync" из переменной "ВременнаяДиректория" +Процедура ЯДобавляюПараметрДляКомандыИзПеременной(Знач Параметр, Знач ИмяКоманды, Знач ИмяПеременной) Экспорт + Команда = БДД.ПолучитьИзКонтекста(КлючКоманды(ИмяКоманды)); + ЗначениеПеременной = БДД.ПолучитьИзКонтекста(ИмяПеременной); + Команда.ДобавитьПараметр(СтрШаблон("%1 %2", Параметр, ЗначениеПеременной)) +КонецПроцедуры + +//Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке +Процедура ЯУстанавливаюПутьВыполненияКомандыКТекущейБиблиотеке(Знач ИмяКоманды) Экспорт + + ПутьГитсинк = ОбъединитьПути(КаталогГитсинк(), "src", "gitsync.os"); + Команда = БДД.ПолучитьИзКонтекста(КлючКоманды(ИмяКоманды)); + Команда.УстановитьКоманду("oscript"); + Команда.ДобавитьПараметр("-encoding=utf-8"); + Команда.ДобавитьПараметр(ОбернутьВКавычки(ПутьГитсинк)); + +КонецПроцедуры + +//я скопировал каталог тестового хранилища конфигурации во временный каталог +Процедура ЯСкопировалКаталогТестовогоХранилищаКонфигурацииВоВременныйКаталог() Экспорт + + ВременныйКаталог = БДД.ПолучитьИзКонтекста("ВременныйКаталог"); + КопироватьФайл(ПутьКВременномуФайлуХранилища1С(), ОбъединитьПути(ВременныйКаталог, "1cv8ddb.1CD")) + +КонецПроцедуры + +//Я создаю неполный тестовой файл AUTHORS +Процедура ЯСоздаюНеполныйТестовойФайлAuthors() Экспорт + + ПутьКаталогаИсходников = БДД.ПолучитьИзКонтекста("ПутьКаталогаИсходников"); + ФайлАвторов = Новый ЗаписьТекста; + ФайлАвторов.Открыть(ОбъединитьПути(ПутьКаталогаИсходников, "AUTHORS"), "utf-8"); + ФайлАвторов.ЗаписатьСтроку("Отладка=Отладка "); + ФайлАвторов.Закрыть(); + +КонецПроцедуры + +//Я добавляю параметры для команды "gitsync" +//|--storage-user Администратор| +//|-useVendorUnload| +Процедура ЯДобавляюПараметрыДляКоманды(Знач ИмяКоманды, Знач ТаблицаПараметров) Экспорт + + Команда = БДД.ПолучитьИзКонтекста(КлючКоманды(ИмяКоманды)); + Для Каждого Параметр из ТаблицаПараметров Цикл + Команда.ДобавитьПараметр(Параметр[0]) + КонецЦикла + +КонецПроцедуры + + +Функция ПутьКВременномуФайлуХранилища1С() + + Возврат ОбъединитьПути(КаталогFixtures(), "ТестовыйФайлХранилища1С.1CD"); + +КонецФункции + +Функция КаталогFixtures() + Возврат ОбъединитьПути(КаталогГитсинк(), "tests", "fixtures"); +КонецФункции + +Функция КаталогГитсинк() + Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."); +КонецФункции + +Функция ОбернутьВКавычки(Знач Строка); + Возврат """" + Строка + """"; +КонецФункции + +Функция КлючКоманды(Знач ИмяКоманды) + Возврат "Команда-" + ИмяКоманды; +КонецФункции + +Лог = Логирование.ПолучитьЛог(ИмяЛога()); +//Лог.УстановитьУровень(Логирование.ПолучитьЛог("bdd").Уровень()); +Лог.УстановитьУровень(УровниЛога.Отладка); diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Export.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Export.os" index 395a112c..30b53113 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Export.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Export.os" @@ -34,6 +34,9 @@ Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "-auto-set-tags", "Автоматическая установка тэгов по версия конфиграции"); Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "-increment", "Частичная выгрузка конфигурации"); + Парсер.ДобавитьПараметрФлагКоманды (ОписаниеКоманды, "-useVendorUnload", "Получение версии хранилища средствами tool1cd или типовыми средствами платформы>"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "<пользователь хранилища конфигурации>"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "<пароль пользователя хранилища конфигурации>"); Парсер.ДобавитьКоманду(ОписаниеКоманды); @@ -51,7 +54,8 @@ ПрерватьВыполнениеБезКомментарияКВерсии = ПараметрыКоманды["-stop-if-empty-comment"]; АвтоматическаяУстановкаТэговПоВерсиям = ПараметрыКоманды["-auto-set-tags"]; ВыгружатьТолькоИзменения = ПараметрыКоманды["-increment"]; - + НеИспользоватьTool1CD = ПараметрыКоманды["-useVendorUnload"]; + Если ЛокальныйКаталогГит = Неопределено Тогда ЛокальныйКаталогГит = ТекущийКаталог(); @@ -110,11 +114,25 @@ МинВерсия = Число(МинВерсия); Лимит = Число(Лимит); + Если НеИспользоватьTool1CD = Неопределено Тогда + + НеИспользоватьTool1CD = Ложь; // по умолчанию используем tool1cd + + КонецЕсли; + Распаковщик = РаспаковщикКонфигурации.ПолучитьИНастроитьРаспаковщик(ПараметрыКоманды, ДополнительныеПараметры); Распаковщик.ВерсияПлатформы = ПараметрыКоманды["-v8version"]; Распаковщик.ДоменПочтыДляGitПоУмолчанию = ПараметрыКоманды["-email"]; Распаковщик.ПереименовыватьФайлМодуляОбычнойФормы = ПереименовыватьФайлМодуляОбычнойФормы; - Распаковщик.ТолькоИзменения = ВыгружатьТолькоИзменения; + + Если НеИспользоватьTool1CD Тогда + + ПараметрыДоступаКХранилищу = Новый Структура("ПользовательХранилища, ПарольХранилища", ПараметрыКоманды["--storage-user"], ПараметрыКоманды["--storage-pwd"]); + Распаковщик.ПроверитьПараметрыДоступаКХранилищу(ПараметрыДоступаКХранилищу); + Распаковщик.ИспользоватьTool1CD = Не НеИспользоватьTool1CD; + + КонецЕсли; + ДополнительныеПараметры.Лог.Информация("Начинаю выгрузку исходников"); РаспаковщикКонфигурации.ВыполнитьЭкспортИсходников(Распаковщик, ПараметрыКоманды["ПутьКХранилищу"], @@ -128,7 +146,8 @@ ПрерватьВыполнениеБезКомментарияКВерсии, , АвтоматическаяУстановкаТэговПоВерсиям, - ПроверитьАвторовХранилища); + ПроверитьАвторовХранилища, + ПараметрыДоступаКХранилищу); ДополнительныеПараметры.Лог.Информация("Выгрузка завершена"); Возврат МенеджерКомандПриложения.РезультатыКоманд().Успех; diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Sync.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Sync.os" index a03ee13e..1b6c3628 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Sync.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Sync.os" @@ -33,6 +33,10 @@ Парсер.ДобавитьПараметрФлагКоманды (ОписаниеКоманды, "-check-authors", "Проверка файла AUTHORS, на наличие всех авторов коммитов "); Парсер.ДобавитьПараметрФлагКоманды (ОписаниеКоманды, "-stop-if-empty-comment", "Остановить, если Комментарий к версии пустой"); Парсер.ДобавитьПараметрФлагКоманды (ОписаниеКоманды, "-auto-set-tags", "Автоматическая установка тэгов по версия конфиграции"); + Парсер.ДобавитьПараметрФлагКоманды (ОписаниеКоманды, "-increment", "Частичная выгрузка конфигурации"); + Парсер.ДобавитьПараметрФлагКоманды (ОписаниеКоманды, "-useVendorUnload", "Получение версии хранилища средствами tool1cd или типовыми средствами платформы>"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "<пользователь хранилища конфигурации>"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "<пароль пользователя хранилища конфигурации>"); Парсер.ДобавитьКоманду(ОписаниеКоманды); @@ -54,6 +58,11 @@ Парсер.ДобавитьПараметрФлаг("-stop-if-empty-comment", "Остановить, если Комментарий к версии пустой"); Парсер.ДобавитьПараметрФлаг("-auto-set-tags", "Автоматическая установка тэгов по версия конфиграции"); + + Парсер.ДобавитьПараметрФлаг ("-increment", "Частичная выгрузка конфигурации"); + Парсер.ДобавитьПараметрФлаг ("-useVendorUnload", "Получение версии хранилища средствами tool1cd или типовыми средствами платформы>"); + Парсер.ДобавитьИменованныйПараметр("--storage-user", "<пользователь хранилища конфигурации>"); + Парсер.ДобавитьИменованныйПараметр("--storage-pwd", "<пароль пользователя хранилища конфигурации>"); КонецПроцедуры // ЗарегистрироватьКоманду @@ -77,6 +86,8 @@ ПроверитьАвторовХранилища = ПараметрыКоманды["-check-authors"]; ПрерватьВыполнениеБезКомментарияКВерсии = ПараметрыКоманды["-stop-if-empty-comment"]; АвтоматическаяУстановкаТэговПоВерсиям = ПараметрыКоманды["-auto-set-tags"]; + ВыгружатьТолькоИзменения = ПараметрыКоманды["-increment"]; + НеИспользоватьTool1CD = ПараметрыКоманды["-useVendorUnload"]; Если НачальнаяВерсия = Неопределено Тогда @@ -150,6 +161,12 @@ КонецЕсли; + Если НеИспользоватьTool1CD = Неопределено Тогда + + НеИспользоватьTool1CD = Ложь; // по умолчанию используем tool1cd + + КонецЕсли; + Лог.Отладка("ПутьКХранилищу = " + ПутьКХранилищу); Лог.Отладка("URLРепозитория = " + URLРепозитория); Лог.Отладка("ЛокальныйКаталогГит = " + ЛокальныйКаталогГит); @@ -167,6 +184,16 @@ Распаковщик.ВерсияПлатформы = ВерсияПлатформы; Распаковщик.ДоменПочтыДляGitПоУмолчанию = ДоменПочты; Распаковщик.ПереименовыватьФайлМодуляОбычнойФормы = ПереименовыватьФайлМодуляОбычнойФормы; + Распаковщик.ТолькоИзменения = ВыгружатьТолькоИзменения; + + Если НеИспользоватьTool1CD Тогда + + ПараметрыДоступаКХранилищу = Новый Структура("ПользовательХранилища, ПарольХранилища", ПараметрыКоманды["--storage-user"], ПараметрыКоманды["--storage-pwd"]); + Распаковщик.ПроверитьПараметрыДоступаКХранилищу(ПараметрыДоступаКХранилищу); + Распаковщик.ИспользоватьTool1CD = Не НеИспользоватьTool1CD; + + КонецЕсли; + Лог.Информация("Получение изменений с удаленного узла (pull)"); КодВозврата = Распаковщик.ВыполнитьGitPull(ЛокальныйКаталогГит, URLРепозитория, ИмяВетки); @@ -189,7 +216,8 @@ ПрерватьВыполнениеБезКомментарияКВерсии, ИмяВетки, АвтоматическаяУстановкаТэговПоВерсиям, - ПроверитьАвторовХранилища); + ПроверитьАвторовХранилища, + ПараметрыДоступаКХранилищу); Лог.Информация("Отправка изменений на удаленный узел"); КодВозврата = Распаковщик.ВыполнитьGitPush(ЛокальныйКаталогГит, URLРепозитория, ИмяВетки, АвтоматическаяУстановкаТэговПоВерсиям); diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\260\321\206\320\270\320\270.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\260\321\206\320\270\320\270.os" index babb1152..8c42df64 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\260\321\206\320\270\320\270.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\260\321\206\320\270\320\270.os" @@ -38,6 +38,7 @@ Перем ВерсияПлатформы Экспорт; Перем ПереименовыватьФайлМодуляОбычнойФормы Экспорт; Перем ТолькоИзменения Экспорт; +Перем ИспользоватьTool1CD Экспорт; // Выполняет выгрузку конфигурации в файлы // и распределение файлов по каталогам согласно иерархии метаданных. @@ -948,7 +949,7 @@ // Основная функция синхронизации. Перемещает в git набор коммитов хранилища 1С // Процедура СинхронизироватьХранилищеКонфигурацийСГит(Знач КаталогРабочейКопии, - Знач ФайлХранилища, + Знач ПутьКХранилищу, Знач НачальнаяВерсия = 0, Знач КонечнаяВерсия = 0, Знач Формат = Неопределено, @@ -959,9 +960,16 @@ Знач ПрерватьВыполнениеБезКомментарияКВерсии = Ложь, Знач ИмяВетки = Неопределено, Знач АвтоматическаяУстановкаТэговПоВерсиям = Ложь, - Знач ПроверитьАвторовХранилища = Ложь) Экспорт + Знач ПроверитьАвторовХранилища = Ложь, + Знач ПараметрыДоступаКХранилищу = Неопределено) Экспорт + + Лог.Информация("Начало синхронизации с git"); + + ФайлХранилища = РаспаковщикКонфигурации.ПолучитьПутьКБазеДанныхХранилища(ПутьКХранилищу); + Лог.Отладка("Файл хранилища конфигурации: " + ФайлХранилища); + ТаблицаИсторииХранилища = ПрочитатьИзХранилищаИсториюКоммитовСАвторами(ФайлХранилища); ДополнитьТаблицуХранилищаИнформациейОСигнатуреПользователяВГит(ТаблицаИсторииХранилища, КаталогРабочейКопии, ПроверитьАвторовХранилища); ТекущаяВерсия = НомерСинхронизированнойВерсии(КаталогРабочейКопии); @@ -1005,6 +1013,7 @@ СчетчикКоммитов = 0; СтрокаТекущейВерсии = ТаблицаИсторииХранилища.Найти(СледующаяВерсия, "НомерВерсии"); + ОтправитьНовыеМетки = Ложь; Если СтрокаТекущейВерсии <> Неопределено Тогда ПоследнняяВерсияКонфигурации = СтрокаТекущейВерсии.Тэг; КонецЕсли; @@ -1017,32 +1026,38 @@ ВызватьИсключение СтрШаблон("Версия git %1 больше версии хранилища %2 на %3", ТекущаяВерсия, МаксимальнаяВерсияДляРазбора, СледующаяВерсия - МаксимальнаяВерсияДляРазбора); КонецЕсли; - + Пока СледующаяВерсия <= МаксимальнаяВерсияДляРазбора Цикл СтрокаВерсии = ТаблицаИсторииХранилища.Найти(СледующаяВерсия, "НомерВерсии"); Если СтрокаВерсии <> Неопределено Тогда Если ПустаяСтрока(СтрокаВерсии.ПредставлениеАвтора) Тогда - ВызватьИсключение "Нашли следующую версию, а автор не прописан "+СледующаяВерсия + " автор "+СтрокаВерсии.Автор; + СтрокаОшибки = СтрШаблон("Нашли следующую версию <%1>, а автор <%2> не прописан", СледующаяВерсия, СтрокаВерсии.Автор); + Лог.КритичнаяОшибка(СтрокаОшибки); + ВызватьИсключение СтрокаОшибки; КонецЕсли; Если ПустаяСтрока(СтрокаВерсии.Комментарий) И ПрерватьВыполнениеБезКомментарияКВерсии Тогда - ВызватьИсключение СтрШаблон("Нашли следующую версию %1, а комментарий не задан! Автор %2.", СледующаяВерсия, СтрокаВерсии.Автор);; + СтрокаОшибки = СтрШаблон("Нашли следующую версию <%1> от автора <%2>, а комментарий не задан!", СледующаяВерсия, СтрокаВерсии.Автор); + Лог.КритичнаяОшибка(СтрокаОшибки); + ВызватьИсключение СтрокаОшибки; КонецЕсли; НоваяМетка = ""; Если ПоследнняяВерсияКонфигурации <> СтрокаВерсии.Тэг И АвтоматическаяУстановкаТэговПоВерсиям Тогда ОтправитьНовыеМетки = Истина; + Лог.Информация("Определена новая версия конфигурации: %1 будет установлен новый тэг", СтрокаВерсии.Тэг); НоваяМетка = СтрокаВерсии.Тэг; + ПоследнняяВерсияКонфигурации = НоваяМетка; КонецЕсли; Попытка Лог.Информация("Получаем исходники для версии " + СледующаяВерсия + ", " + ТекущаяДата()); - РазложитьМодулиПоНомеруВерсииХранилища1С(КаталогРабочейКопии, ФайлХранилища, СледующаяВерсия, Формат); + РазложитьМодулиПоНомеруВерсииХранилища1С(КаталогРабочейКопии, ПутьКХранилищу, СледующаяВерсия, Формат, ПараметрыДоступаКХранилищу); Лог.Отладка("Фиксируем в файле VERSION версию " + СледующаяВерсия); ЗаписатьФайлВерсийГит(КаталогРабочейКопии, СледующаяВерсия); ВыполнитьКоммитГит(КаталогРабочейКопии, СтрокаВерсии.Комментарий, СтрокаВерсии.ПредставлениеАвтора, СтрокаВерсии.Дата, НоваяМетка); @@ -1135,25 +1150,33 @@ КонецФункции -Процедура РазложитьМодулиПоНомеруВерсииХранилища1С(Знач КаталогРабочейКопии, Знач ФайлХранилища, Знач НомерВерсии, Знач Формат) Экспорт +Процедура РазложитьМодулиПоНомеруВерсииХранилища1С(Знач КаталогРабочейКопии, Знач ПутьКХранилищу, Знач НомерВерсии, Знач Формат, Знач ПараметрыДоступаКХранилищу) Экспорт - ФайлХранилища = Новый Файл(ФайлХранилища); - Если ФайлХранилища.Существует() И ФайлХранилища.ЭтоФайл() И ВРег(ФайлХранилища.Расширение) = ".1CD" Тогда - ВремКаталог = ВременныеФайлы.СоздатьКаталог(); - ФайлВерсии = ИмяФайлаВыгрузкиВерсииХранилища(ВремКаталог, НомерВерсии); - Лог.Отладка("Выгружаем версию хранилища в файл " + ФайлВерсии); - Попытка - ПоНомеруВерсииСохранитьКонфигурациюСредствамиTool1CD(ФайлХранилища.ПолноеИмя, ФайлВерсии, НомерВерсии); - РазобратьФайлКонфигурации(ФайлВерсии, КаталогРабочейКопии, Формат); - Исключение - УдалитьВременныеФайлыПриНеобходимости(ВремКаталог); - ВызватьИсключение; - КонецПопытки; + + Если ИспользоватьTool1CD Тогда + + ФайлХранилища = Новый Файл(РаспаковщикКонфигурации.ПолучитьПутьКБазеДанныхХранилища(ПутьКХранилищу)); + + Если ФайлХранилища.Существует() И ФайлХранилища.ЭтоФайл() И ВРег(ФайлХранилища.Расширение) = ".1CD" Тогда + ВремКаталог = ВременныеФайлы.СоздатьКаталог(); + ФайлВерсии = ИмяФайлаВыгрузкиВерсииХранилища(ВремКаталог, НомерВерсии); + Лог.Отладка("Выгружаем версию хранилища в файл " + ФайлВерсии); + Попытка + ПоНомеруВерсииСохранитьКонфигурациюСредствамиTool1CD(ФайлХранилища.ПолноеИмя, ФайлВерсии, НомерВерсии); + РазобратьФайлКонфигурации(ФайлВерсии, КаталогРабочейКопии, Формат); + Исключение + УдалитьВременныеФайлыПриНеобходимости(ВремКаталог); + ВызватьИсключение; + КонецПопытки; - УдалитьВременныеФайлыПриНеобходимости(ВремКаталог); + УдалитьВременныеФайлыПриНеобходимости(ВремКаталог); + Иначе + ВызватьИсключение "Что-то пошло не так " + КонецЕсли Иначе - // TODO: предусмотреть выгрузку версии штатным запуском команды Конфигуратора - ВызватьИсключение "Некорректное имя файла хранилища: " + ФайлХранилища.ПолноеИмя; + + РазобратьФайлКонфигурацииШтатнымиСредствами(ПутьКХранилищу, НомерВерсии, ПараметрыДоступаКХранилищу, КаталогРабочейКопии, Формат); + КонецЕсли; КонецПроцедуры @@ -1376,6 +1399,123 @@ УдалятьВременныеФайлы = ПарамУдалятьВременныеФайлы; КонецПроцедуры +Процедура ПроверитьПараметрыДоступаКХранилищу(ПараметрыДоступаКХранилищу) Экспорт + + Если ПараметрыДоступаКХранилищу.ПользовательХранилища = Неопределено Тогда + + ВызватьИсключение "Не задан пользователь хранилища конфигурации."; + + КонецЕсли; + + Если ПараметрыДоступаКХранилищу.ПарольХранилища = Неопределено Тогда + + ПарольХранилища = ""; + + КонецЕсли; + +КонецПроцедуры // ПроверитьПараметрыДоступаКХранилищу + +// Выполняет обновление конфигурации из хранилища, выгрузку конфигурации в файлы +// и распределение файлов по каталогам согласно иерархии метаданных. +// +Процедура РазобратьФайлКонфигурацииШтатнымиСредствами(Знач ПутьКХранилищу, Знач НомерВерсии, Знач ПараметрыДоступаКХранилищу, Знач ВыходнойКаталог, Знач Формат) Экспорт + + КаталогПлоскойВыгрузки = ВременныеФайлы.СоздатьКаталог(); + + Если Не (Новый Файл(ВыходнойКаталог).Существует()) Тогда + СоздатьКаталог(ВыходнойКаталог); + КонецЕсли; + + КаталогВыгрузки = ?(ТолькоИзменения, ВыходнойКаталог, КаталогПлоскойВыгрузки); + Попытка + ВыгрузитьМодулиКонфигурацииОбновлениеИзХранилища(ПутьКХранилищу, НомерВерсии, ПараметрыДоступаКХранилищу, КаталогПлоскойВыгрузки, Формат); + Если НЕ ТолькоИзменения Тогда + РазложитьМодули1СПоПапкамСогласноИерархииМетаданных(КаталогПлоскойВыгрузки, ВыходнойКаталог, Формат); + Иначе + МассивФайлов = НайтиФайлы(КаталогВыгрузки, "*.bin", Истина); + Для каждого Файл из МассивФайлов Цикл + Если Нрег(Файл.Имя) = "form.bin" Тогда + КаталогФормы = ОбъединитьПути(Файл.Путь, Файл.ИмяБезРасширения); + СоздатьКаталог(КаталогФормы); + ФС.ОбеспечитьПустойКаталог(КаталогФормы); + РаспаковатьКонтейнерМетаданных(Файл.ПолноеИмя, КаталогФормы); + КонецЕсли; + КонецЦикла; + + Если Новый Файл(ОбъединитьПути(КаталогВыгрузки, "renames.txt")).Существует() Тогда + УдалитьВременныеФайлыПриНеобходимости(ОбъединитьПути(КаталогВыгрузки, "renames.txt")); + КонецЕсли; + + КонецЕсли; + Исключение + УдалитьВременныеФайлыПриНеобходимости(КаталогПлоскойВыгрузки); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + + +// Выполняет штатную выгрузку конфигурации в файлы (средствами платформы 8.3) без загрузки конфигурации, но с обновлением на версию хранилища +// +Процедура ВыгрузитьМодулиКонфигурацииОбновлениеИзХранилища(Знач ПутьКХранилищу, Знач НомерВерсии, Знач ПараметрыДоступаКХранилищу, Знач КаталогПлоскойВыгрузки, Знач Формат) Экспорт + + Конфигуратор = ПолучитьМенеджерКонфигуратора(); + Если ВерсияПлатформы <> Неопределено Тогда + Конфигуратор.ИспользоватьВерсиюПлатформы(ВерсияПлатформы); + Иначе + Конфигуратор.ИспользоватьВерсиюПлатформы("8.3"); + КонецЕсли; + + ЛогКонфигуратора = Логирование.ПолучитьЛог("oscript.lib.v8runner"); + ЛогКонфигуратора.УстановитьУровень(Лог.Уровень()); + + ПользовательХранилища = ПараметрыДоступаКХранилищу.ПользовательХранилища; + ПарольХранилища = ПараметрыДоступаКХранилищу.ПарольХранилища; + + Попытка + + ПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска(); + ПараметрыЗапуска.Добавить("/ConfigurationRepositoryUpdateCfg"); + ПараметрыЗапуска.Добавить("/ConfigurationRepositoryF """+ПутьКХранилищу+""""); + + ПараметрыЗапуска.Добавить("/ConfigurationRepositoryN """+ПользовательХранилища+""""); + + Если Не ПустаяСтрока(ПарольХранилища) Тогда + ПараметрыЗапуска.Добавить("/ConfigurationRepositoryP """+ПарольХранилища+""""); + КонецЕсли; + + ПараметрыЗапуска.Добавить("-v "+НомерВерсии); + + ПараметрыЗапуска.Добавить("-force"); + + ВыполнитьКомандуКонфигуратора(Конфигуратор, ПараметрыЗапуска); + + //Конфигуратор.ОбновитьКонфигурациюБазыДанныхИзХранилищаНаВерсию(ПутьКХранилищу, ПользовательХранилища, ПарольХранилища, НомерВерсии); + + Исключение + + ТекстОшибки = Конфигуратор.ВыводКоманды(); + ВызватьИсключение ТекстОшибки; + + КонецПопытки; + + Если Не (Новый Файл(КаталогПлоскойВыгрузки).Существует()) Тогда + СоздатьКаталог(КаталогПлоскойВыгрузки); + КонецЕсли; + + МассивФайлов = НайтиФайлы(КаталогПлоскойВыгрузки, ПолучитьМаскуВсеФайлы()); + Если МассивФайлов.Количество() <> 0 Тогда + ВызватьИсключение "В каталоге <"+КаталогПлоскойВыгрузки+"> не должно быть файлов"; + КонецЕсли; + + ПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска(); + ПараметрДампаКонфигурации = СтрШаблон("/DumpConfigToFiles ""%1"" -format %2", КаталогПлоскойВыгрузки, ТРег(Формат)); + ПараметрыЗапуска.Добавить(ПараметрДампаКонфигурации); + + ВыполнитьКомандуКонфигуратора(Конфигуратор, ПараметрыЗапуска); + +КонецПроцедуры + /////////////////////////////////////////////////////////////////////////////////////////////// // Вспомогательные функции @@ -1489,3 +1629,4 @@ КоличествоЦикловОжиданияЛицензииПоУмолчанию = 1; ТолькоИзменения = Ложь; МинимальнаяРазницаМеждуКоммитамиНовогоХранилища = 10; +ИспользоватьTool1CD = Истина; diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\321\201\320\277\320\260\320\272\320\276\320\262\321\211\320\270\320\272\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\321\201\320\277\320\260\320\272\320\276\320\262\321\211\320\270\320\272\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" index 39592cb5..790fae6e 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\321\201\320\277\320\260\320\272\320\276\320\262\321\211\320\270\320\272\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\321\201\320\277\320\260\320\272\320\276\320\262\321\211\320\270\320\272\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" @@ -81,12 +81,13 @@ Знач Лимит = 0, Знач ПрерватьВыполнениеБезКомментарияКВерсии, Знач ИмяВетки = Неопределено, - Знач АвтоматическаяУстановкаТэговПоВерсиям, - Знач ПроверитьАвторовХранилища = Ложь) Экспорт + Знач АвтоматическаяУстановкаТэговПоВерсиям = Ложь, + Знач ПроверитьАвторовХранилища = Ложь, + Знач ПараметрыДоступаКХранилищу = Неопределено) Экспорт ФайлБазыДанныхХранилища = ПолучитьПутьКБазеДанныхХранилища(ПутьКХранилищу); Распаковщик.СинхронизироватьХранилищеКонфигурацийСГит(ЛокальныйКаталогГит, - ФайлБазыДанныхХранилища, + ПутьКХранилищу, НачальнаяВерсия, КонечнаяВерсия, Формат, @@ -96,7 +97,8 @@ ПрерватьВыполнениеБезКомментарияКВерсии, ИмяВетки, АвтоматическаяУстановкаТэговПоВерсиям, - ПроверитьАвторовХранилища); + ПроверитьАвторовХранилища, + ПараметрыДоступаКХранилищу); КонецПроцедуры // ВыполнитьЭкспортИсходников @@ -109,7 +111,7 @@ /////////////////////////////////////////////////////////////////// -Функция ПолучитьПутьКБазеДанныхХранилища(Знач ПутьКХранилищу) +Функция ПолучитьПутьКБазеДанныхХранилища(Знач ПутьКХранилищу) Экспорт ФайлПутиКХранилищу = Новый Файл(ПутьКХранилищу); Если ФайлПутиКХранилищу.Существует() и ФайлПутиКХранилищу.ЭтоКаталог() Тогда