diff --git a/readme.md b/readme.md index 679c8946..9ed45e1c 100644 --- a/readme.md +++ b/readme.md @@ -157,6 +157,9 @@ -verbose - -branch - <имя ветки git> -format - + -minversion - Число, номер минимальной версии для выгрузки + -maxversion - Число, номер максимальной версии для выгрузки + -limit - Число, выгрузить неболее limit версий от текущей выгруженной Возможные команды: clone - Клонирует существующий репозиторий и создает служебные файлы @@ -176,3 +179,21 @@ gitsync all <путь к xml-файлу конфигурации> Подробнее о параметрах команды `all` можно прочитать, запустив `gitsync help all` + +# Примеры использования min/max version и limit + +Выгрузить все версии начиная с 5 + + gitsync export store -minversion 5 + +Выгрузить версии с 5 по 10 + + gitsync export store -minversion 5 -maxversion 10 + +Выгрузить не более 2 версий от последней выгруженной. Последняя выгруженная 4, выгружаем 2 следующие: 5 и 6. + + gitsync export store -limit 2 + +Выгрузить 2 версии от последней выгруженной, но не более 5-ой версии. Удобно когда выгрузка идет небольшими партиями, при заранее известном максимальном номере версии. + + gitsync export store -maxversion 5 -limit 2 \ No newline at end of file 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 eef03264..800c931a 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" @@ -870,15 +870,31 @@ Знач КонечнаяВерсия = 0, Знач Формат = Неопределено, Знач КоличествоКоммитовДоPush = 0, - Знач URLРепозитория = Неопределено + Знач URLРепозитория = Неопределено, + Знач Лимит = 0 ) Экспорт Лог.Информация("Начало синхронизации с git"); ТаблицаИсторииХранилища = ПрочитатьИзХранилищаИсториюКоммитовСАвторами(ФайлХранилища); ДополнитьТаблицуХранилищаИнформациейОСигнатуреПользователяВГит(ТаблицаИсторииХранилища, КаталогРабочейКопии); ТекущаяВерсия = НомерСинхронизированнойВерсии(КаталогРабочейКопии); + Лог.Информация("Номер синхронизированной версии: " + ТекущаяВерсия); СледующаяВерсия = ТекущаяВерсия + 1; + + Если НачальнаяВерсия > 0 Тогда + СледующаяВерсия = Макс(НачальнаяВерсия, СледующаяВерсия); + КонецЕсли; + + Если Лимит > 0 Тогда + + Если КонечнаяВерсия = 0 Тогда + КонечнаяВерсия = ТекущаяВерсия + Лимит; + Иначе + КонечнаяВерсия = ?(КонечнаяВерсия >= (ТекущаяВерсия + Лимит), КонечнаяВерсия, (ТекущаяВерсия + Лимит)); + КонецЕсли; + + КонецЕсли; Если Формат = Неопределено Тогда Формат = РежимВыгрузкиФайлов.Авто; @@ -941,16 +957,18 @@ Если МаксимальнаяВерсия <> 0 Тогда Попытка - ЧислоВерсийПлюс = Число(МаксимальнаяВерсия); + МаксимальнаяВерсия = Число(МаксимальнаяВерсия); Исключение - ЧислоВерсийПлюс = 0; + МаксимальнаяВерсия = 0; КонецПопытки; КонецЕсли; - Если ЧислоВерсийПлюс>0 Тогда - МаксимальнаяВерсияДляРазбора = ТекущаяВерсия + ЧислоВерсийПлюс; + МаксВерсияВХранилище = ОпределитьМаксимальнуюВерсиюВХранилище(ТаблицаИсторииХранилища); + + Если МаксимальнаяВерсия > 0 Тогда + МаксимальнаяВерсияДляРазбора = Мин(МаксВерсияВХранилище, МаксимальнаяВерсия) ; Иначе - МаксимальнаяВерсияДляРазбора = ОпределитьМаксимальнуюВерсиюВХранилище(ТаблицаИсторииХранилища); + МаксимальнаяВерсияДляРазбора = МаксВерсияВХранилище; КонецЕсли; Возврат МаксимальнаяВерсияДляРазбора; diff --git a/src/gitsync.os b/src/gitsync.os index 52ce46bf..cb286bd3 100644 --- a/src/gitsync.os +++ b/src/gitsync.os @@ -128,6 +128,9 @@ Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-debug", ""); Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-verbose", ""); Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-format", ""); + Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-minversion", "<номер минимальной версии для выгрузки>"); + Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-maxversion", "<номер максимальной версии для выгрузки>"); + Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-limit", "<выгрузить неболее limit версий от текущей выгруженной>"); Парсер.ДобавитьКоманду(Команда); @@ -179,10 +182,13 @@ Параметры["ЛокальныйКаталогГит"], Параметры["-email"], Параметры["-v8version"], - , - , + Параметры["-minversion"], + Параметры["-maxversion"], Параметры["-format"], - Параметры["-branch"]); + Параметры["-branch"], + 0, + Параметры["-limit"] + ); КонецЕсли; @@ -321,7 +327,8 @@ Знач КонечнаяВерсия = 0, Знач Формат = Неопределено, Знач ИмяВетки = Неопределено, - Знач КоличествоКоммитовДоPush = 0) Экспорт + Знач КоличествоКоммитовДоPush = 0, + Знач Лимит = 0) Экспорт Лог.Информация("Начинаю синхронизацию хранилища 1С и репозитария GIT"); @@ -337,6 +344,19 @@ КоличествоКоммитовДоPush = 0; КонецЕсли; + Если НачальнаяВерсия = "" Тогда + НачальнаяВерсия = 0; + КонецЕсли; + + Если КонечнаяВерсия = "" Тогда + КонечнаяВерсия = 0; + КонецЕсли; + + Если Лимит = "" Тогда + Лимит = 0; + КонецЕсли; + + Если ТипЗнч(КоличествоКоммитовДоPush) = Тип("Строка") Тогда КоличествоКоммитовДоPush = Число(КоличествоКоммитовДоPush); КонецЕсли; @@ -372,7 +392,8 @@ КонечнаяВерсия, Формат, КоличествоКоммитовДоPush, - URLРепозитория); + URLРепозитория, + Лимит); Лог.Информация("Отправка изменений на удаленный узел"); КодВозврата = Распаковщик.ВыполнитьGitPush(ЛокальныйКаталогГит, URLРепозитория, ИмяВетки); @@ -384,10 +405,25 @@ КонецПроцедуры -Процедура ВыполнитьЭкспортИсходников(Знач Распаковщик, Знач ПутьКХранилищу, Знач ЛокальныйКаталогГит, Знач НачальнаяВерсия = 0, Знач КонечнаяВерсия = 0, Знач Формат = Неопределено, Знач КоличествоКоммитовДоPush = 0, Знач URLРепозитория= Неопределено) +Процедура ВыполнитьЭкспортИсходников(Знач Распаковщик, + Знач ПутьКХранилищу, + Знач ЛокальныйКаталогГит, + Знач НачальнаяВерсия = 0, + Знач КонечнаяВерсия = 0, + Знач Формат = Неопределено, + Знач КоличествоКоммитовДоPush = 0, + Знач URLРепозитория= Неопределено, + Знач Лимит=0) ФайлБазыДанныхХранилища = ПолучитьПутьКБазеДанныхХранилища(ПутьКХранилищу); - Распаковщик.СинхронизироватьХранилищеКонфигурацийСГит(ЛокальныйКаталогГит, ФайлБазыДанныхХранилища, НачальнаяВерсия, КонечнаяВерсия, Формат, КоличествоКоммитовДоPush, URLРепозитория); + Распаковщик.СинхронизироватьХранилищеКонфигурацийСГит(ЛокальныйКаталогГит, + ФайлБазыДанныхХранилища, + НачальнаяВерсия, + КонечнаяВерсия, + Формат, + КоличествоКоммитовДоPush, + URLРепозитория, + Лимит); КонецПроцедуры @@ -395,6 +431,9 @@ ЛокальныйКаталогГит = Параметры["ЛокальныйКаталогГит"]; Формат = Параметры["-format"]; + МинВерсия = Параметры["-minversion"]; + МаксВерсия = Параметры["-maxversion"]; + Лимит = Параметры["-limit"]; Если ЛокальныйКаталогГит = Неопределено Тогда ЛокальныйКаталогГит = ТекущийКаталог(); @@ -403,12 +442,25 @@ Если Формат = Неопределено Тогда Формат = РежимВыгрузкиФайлов.Авто; КонецЕсли; + + Если МинВерсия = Неопределено Тогда + МинВерсия = 0; + КонецЕсли; + + Если МаксВерсия = Неопределено Тогда + МаксВерсия = 0; + КонецЕсли; + + Если Лимит = Неопределено Тогда + Лимит = 0; + КонецЕсли; + Распаковщик = ПолучитьИНастроитьРаспаковщик(Параметры); Распаковщик.ВерсияПлатформы = Параметры["-v8version"]; Распаковщик.ДоменПочтыДляGitПоУмолчанию = Параметры["-email"]; Лог.Информация("Начинаю выгрузку исходников"); - ВыполнитьЭкспортИсходников(Распаковщик, Параметры["ПутьКХранилищу"], ЛокальныйКаталогГит,,,Формат); + ВыполнитьЭкспортИсходников(Распаковщик, Параметры["ПутьКХранилищу"], ЛокальныйКаталогГит, МинВерсия, МаксВерсия, Формат,,,Лимит); Лог.Информация("Выгрузка завершена"); diff --git "a/tests/fixtures/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\244\320\260\320\271\320\273\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\2601\320\241.1CD" "b/tests/fixtures/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\244\320\260\320\271\320\273\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\2601\320\241.1CD" index b9fca4b5..4af6ae24 100644 Binary files "a/tests/fixtures/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\244\320\260\320\271\320\273\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\2601\320\241.1CD" and "b/tests/fixtures/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\244\320\260\320\271\320\273\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\2601\320\241.1CD" differ diff --git a/tests/git-sync-test.os b/tests/git-sync-test.os index 667d9479..c55b65a8 100644 --- a/tests/git-sync-test.os +++ b/tests/git-sync-test.os @@ -141,7 +141,7 @@ ФайлХранилища = ПутьКВременномуФайлуХранилища1С(); ТаблицаИсторииХранилища = Распаковщик.ПрочитатьТаблицуИсторииХранилища(ФайлХранилища); - Утверждения.ПроверитьРавенство(ТаблицаИсторииХранилища.Количество(), 3, "таблицаИсторииХранилища.Количество()"); + Утверждения.ПроверитьРавенство(ТаблицаИсторииХранилища.Количество(), 8, "таблицаИсторииХранилища.Количество()"); Для Каждого СтрокаВерсии Из ТаблицаИсторииХранилища Цикл Лог.Отладка("" + СтрокаВерсии.Дата + ": " + СтрокаВерсии.НомерВерсии + ": " + СтрокаВерсии.Комментарий); КонецЦикла; @@ -203,7 +203,7 @@ ТаблицаИсторииХранилища = Распаковщик.ПрочитатьИзХранилищаИсториюКоммитовСАвторами(ПутьКФайлуХранилища1С); - Утверждения.ПроверитьРавенство(ТаблицаИсторииХранилища.Количество(), 3, "ТаблицаИсторииХранилища.Количество()"); + Утверждения.ПроверитьРавенство(ТаблицаИсторииХранилища.Количество(), 8, "ТаблицаИсторииХранилища.Количество()"); Для Каждого строка Из ТаблицаИсторииХранилища Цикл Если ПустаяСтрока(строка.Автор) Тогда @@ -368,7 +368,7 @@ КоличествоКоммитов = КоличествоКоммитов + 1; КонецЦикла; ЛогГит.Закрыть(); - Утверждения.ПроверитьРавенство(КоличествоКоммитов, 3, "Количество коммитов в git-хранилище"); + Утверждения.ПроверитьРавенство(КоличествоКоммитов, 8, "Количество коммитов в git-хранилище"); КонецПроцедуры diff --git a/tests/test-export_with_min_max_versions.os b/tests/test-export_with_min_max_versions.os new file mode 100644 index 00000000..7396f66f --- /dev/null +++ b/tests/test-export_with_min_max_versions.os @@ -0,0 +1,157 @@ +#Использовать asserts +#Использовать tempfiles +#Использовать logos +#Использовать strings +#Использовать 1commands + +#Использовать ".." + +Перем юТест; +Перем Распаковщик; +Перем Лог; + +Процедура Инициализация() + + Распаковщик = Новый МенеджерСинхронизации(); + Лог = Логирование.ПолучитьЛог("oscript.app.gitsync"); + Лог.УстановитьУровень(УровниЛога.Информация); + +КонецПроцедуры + +Функция ПолучитьСписокТестов(Знач Контекст) Экспорт + + юТест = Контекст; + + ВсеТесты = Новый Массив; + + ВсеТесты.Добавить("Тест_ДолженЭкспортироватьНачинаяСВерсии3"); + ВсеТесты.Добавить("Тест_ДолженЭкспортироватьМаксимумВерсию5"); + ВсеТесты.Добавить("Тест_ДолженЭкспортироватьВерсииС3По7"); + ВсеТесты.Добавить("Тест_ДолженЭкспортироватьНеБолее2"); + ВсеТесты.Добавить("Тест_ДолженЭкспортироватьПо2НоНеВыше5"); + + Возврат ВсеТесты; + +КонецФункции + +Процедура ПослеЗапускаТеста() Экспорт + ВременныеФайлы.Удалить(); +КонецПроцедуры + +////////////////////////////////////////////////////////////////////////////// +// Реализация тестов + +Процедура Тест_ДолженЭкспортироватьНачинаяСВерсии3() Экспорт + КоличествоКоммитов = ВыполнитьСинхронизацию(3); + Утверждения.ПроверитьРавенство(КоличествоКоммитов, 6, "Количество коммитов в git-хранилище"); +КонецПроцедуры + +Процедура Тест_ДолженЭкспортироватьМаксимумВерсию5() Экспорт + КоличествоКоммитов = ВыполнитьСинхронизацию(0, 5); + Утверждения.ПроверитьРавенство(КоличествоКоммитов, 5, "Количество коммитов в git-хранилище"); +КонецПроцедуры + +Процедура Тест_ДолженЭкспортироватьВерсииС3По7() Экспорт + КоличествоКоммитов = ВыполнитьСинхронизацию(3, 7); + Утверждения.ПроверитьРавенство(КоличествоКоммитов, 5, "Количество коммитов в git-хранилище"); +КонецПроцедуры + +Процедура Тест_ДолженЭкспортироватьНеБолее2() Экспорт + КоличествоКоммитов = ВыполнитьСинхронизацию(0, 0, 2); + Утверждения.ПроверитьРавенство(КоличествоКоммитов, 2, "Количество коммитов в git-хранилище"); +КонецПроцедуры + +Процедура Тест_ДолженЭкспортироватьПо2НоНеВыше5() Экспорт + КоличествоКоммитов = ВыполнитьСинхронизацию(0, 5, 2); + Утверждения.ПроверитьРавенство(КоличествоКоммитов, 5, "Количество коммитов в git-хранилище"); +КонецПроцедуры + +////////////////////////////////////////////////////////////////////////////// + +Функция ВыполнитьСинхронизацию(МинВерсия=0, МаксВерсия=0, Лимит=0) + + ПутьКФайлуХранилища1С = ПутьКВременномуФайлуХранилища1С(); + + КаталогРепо = ВременныеФайлы.СоздатьКаталог(); + КаталогИсходников = ОбъединитьПути(КаталогРепо, "src"); + СоздатьКаталог(КаталогИсходников); + + РезультатИнициализацииГитЧисло = ИнициализироватьТестовоеХранилищеГит(КаталогРепо); + Утверждения.ПроверитьИстину(РезультатИнициализацииГитЧисло=0, "Инициализация git-хранилища в каталоге: "+КаталогРепо); + + СоздатьФайлАвторовГит_ДляТестов(КаталогИсходников); + ПроверитьСуществованиеФайлаКаталога(ОбъединитьПути(КаталогИсходников,"AUTHORS")); + Распаковщик.ЗаписатьФайлВерсийГит(КаталогИсходников,0); + ПроверитьСуществованиеФайлаКаталога(ОбъединитьПути(КаталогИсходников,"VERSION")); + + Распаковщик.СинхронизироватьХранилищеКонфигурацийСГит(КаталогИсходников, ПутьКФайлуХранилища1С, МинВерсия, МаксВерсия,,,, Лимит); + + ИмяФайлаЛогаГит = ВременныеФайлы.НовоеИмяФайла("txt"); + + Батник = Новый КомандныйФайл; + Батник.ДобавитьКоманду("cd /d " + ОбернутьВКавычки(КаталогИсходников)); + Батник.ДобавитьКоманду("git log --pretty=oneline >"+ОбернутьВКавычки(ИмяФайлаЛогаГит)); + + КодВозврата = Батник.Исполнить(); + Утверждения.ПроверитьРавенство(0, КодВозврата, "Получение краткого лога хранилища git"); + + ЛогГит = Новый ЧтениеТекста; + ЛогГит.Открыть(ИмяФайлаЛогаГит); + КоличествоКоммитов = 0; + Пока ЛогГит.ПрочитатьСтроку() <> Неопределено Цикл + КоличествоКоммитов = КоличествоКоммитов + 1; + КонецЦикла; + ЛогГит.Закрыть(); + Возврат КоличествоКоммитов; + +КонецФункции + +Функция ОбернутьВКавычки(Знач Строка); + Возврат """" + Строка + """"; +КонецФункции + +Функция ИнициализироватьТестовоеХранилищеГит(Знач КаталогРепозитория, Знач КакЧистое = Ложь) + + КодВозврата = Неопределено; + ЗапуститьПриложение("git init" + ?(КакЧистое, " --bare", ""), КаталогРепозитория, Истина, КодВозврата); + + Возврат КодВозврата; + +КонецФункции + +Функция ПутьКВременномуФайлуХранилища1С() + + Возврат ОбъединитьПути(КаталогFixtures(), "ТестовыйФайлХранилища1С.1CD"); + +КонецФункции + +Процедура СоздатьФайлАвторовГит_ДляТестов(Знач Каталог) + + ФайлАвторов = Новый ЗаписьТекста; + ФайлАвторов.Открыть(ОбъединитьПути(Каталог, "AUTHORS"), "utf-8"); + ФайлАвторов.ЗаписатьСтроку("Администратор=Администратор "); + ФайлАвторов.ЗаписатьСтроку("Отладка=Отладка "); + ФайлАвторов.Закрыть(); + +КонецПроцедуры + +Процедура ПроверитьСуществованиеФайлаКаталога(парамПуть, допСообщениеОшибки = "") + + Если Не ЗначениеЗаполнено(парамПуть) Тогда + ВызватьИсключение "Не указан путь <"+допСообщениеОшибки+">"; + КонецЕсли; + + лфайл = Новый Файл(парамПуть); + Если Не лфайл.Существует() Тогда + ВызватьИсключение "Не существует файл <"+допСообщениеОшибки+">"; + КонецЕсли; + +КонецПроцедуры + +Функция КаталогFixtures() + Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures"); +КонецФункции + +////////////////////////////////////////////////////////////////////////////// + +Инициализация(); \ No newline at end of file