diff --git a/packagedef b/packagedef index f1da367..7f43818 100644 --- a/packagedef +++ b/packagedef @@ -1,5 +1,5 @@ Описание.Имя("yard") - .Версия("0.3.0") + .Версия("0.4.0") .ВерсияСреды("1.4") .ЗависитОт("logos") .ЗависитОт("asserts") diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\321\213\320\263\321\200\321\203\320\267\320\272\320\260\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\222\320\223\320\270\321\202.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\321\213\320\263\321\200\321\203\320\267\320\272\320\260\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\222\320\223\320\270\321\202.os" index d492d84..ef4cac3 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\321\213\320\263\321\200\321\203\320\267\320\272\320\260\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\222\320\223\320\270\321\202.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\321\213\320\263\321\200\321\203\320\267\320\272\320\260\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\222\320\223\320\270\321\202.os" @@ -241,17 +241,11 @@ ФайлыОписанийВерсий = НайтиФайлы(ПутьККаталогуКонфигураций, "description.json", Истина); - ЧтениеОписания = Новый ЧтениеJSON(); - ВерсииДляОбработки = Новый Массив(); Для Каждого ТекФайл Из ФайлыОписанийВерсий Цикл - ЧтениеОписания.ОткрытьФайл(ТекФайл.ПолноеИмя, КодировкаТекста.UTF8); - - ОписаниеВерсии = ПрочитатьJSON(ЧтениеОписания, Ложь, , ФорматДатыJSON.ISO); - - ЧтениеОписания.Закрыть(); + ОписаниеВерсии = Служебный.ОписаниеРелиза(ТекФайл.ПолноеИмя); ФайлКонфигурации = Новый Файл(ОбъединитьПути(ТекФайл.Путь, ИмяФайлаКонфигурации)); @@ -264,28 +258,44 @@ ВерсииДляОбработки.Добавить(ОписаниеВерсии); КонецЦикла; - Служебный.СортироватьОписанияВерсийПоНомеру(ВерсииДляОбработки); + Служебный.СортироватьОписанияВерсийПоДате(ВерсииДляОбработки); ФайлОписанияПоследнейВерсии = Новый Файл(ОбъединитьПути(РепозитарийГит, "description.json")); ДатаПоследнейВерсии = ВерсииДляОбработки[0].Дата - 1; Если ФайлОписанияПоследнейВерсии.Существует() Тогда - ЧтениеОписания.ОткрытьФайл(ФайлОписанияПоследнейВерсии.ПолноеИмя, КодировкаТекста.UTF8); - - ОписаниеВерсииВГит = ПрочитатьJSON(ЧтениеОписания, Ложь, , ФорматДатыJSON.ISO); + + ОписаниеВерсииВГит = Служебный.ОписаниеРелиза(ФайлОписанияПоследнейВерсии.ПолноеИмя); ДатаПоследнейВерсии = ОписаниеВерсииВГит.Дата; + КонецЕсли; - ЧтениеОписания.Закрыть(); + ПредыдущаяВерсия = "0.0.0.0"; Для Каждого ТекОписание Из ВерсииДляОбработки Цикл Если ТекОписание.Дата <= ДатаПоследнейВерсии Тогда + Лог.Отладка("[%1]: Дата версии %2 (%3) конфигурации %4 меньше или равна дате последней версии %5.", + ТипЗнч(ЭтотОбъект), + Формат(ТекОписание.Дата, "ДФ=dd.MM.yyyy; ДП=-"), + ТекОписание.Версия, + ТекОписание.Имя, + ДатаПоследнейВерсии); Продолжить; КонецЕсли; + Если Служебный.СравнитьВерсии(ТекОписание.Версия, ПредыдущаяВерсия) <= 0 Тогда + Лог.Информация("[%1]: Версия %2 меньше или равна предыдущей версии %3 и не будет выгружена.", + ТипЗнч(ЭтотОбъект), + ТекОписание.Версия, + ПредыдущаяВерсия); + Продолжить; + КонецЕсли; + + ПредыдущаяВерсия = ТекОписание.Версия; + ДатаКоммита = Служебный.ДатаPOSIX(ТекОписание.Дата); СообщениеКоммита = СтрШаблон("Обновление версии конфигурации поставщика на %1", ТекОписание.Версия); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\321\213\320\263\321\200\321\203\320\267\320\272\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\222\320\223\320\270\321\202.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\321\213\320\263\321\200\321\203\320\267\320\272\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\222\320\223\320\270\321\202.os" index c960761..7e12ad7 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\321\213\320\263\321\200\321\203\320\267\320\272\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\222\320\223\320\270\321\202.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\321\213\320\263\321\200\321\203\320\267\320\272\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\222\320\223\320\270\321\202.os" @@ -260,37 +260,84 @@ // Процедура ОбработатьДанные() Экспорт + Распаковщик.ОбеспечитьКаталог(РепозитарийГит); + ГитРепозиторий.УстановитьРабочийКаталог(РепозитарийГит); + СлужебныйКаталогГит = Новый Файл(ОбъединитьПути(РепозитарийГит, ".git")); + + Если НЕ СлужебныйКаталогГит.Существует() Тогда + ГитРепозиторий.Инициализировать(); + КонецЕсли; + КаталогВыгрузки = ОбъединитьПути(РепозитарийГит, "src", "cf"); + ВремФайл = Новый Файл(КаталогВыгрузки); + Если ВремФайл.Существует() Тогда + ФайлОписания = Новый Файл(ОбъединитьПути(РепозитарийГит, "description.json")); + ОписаниеВерсии = Новый Структура("Имя, Версия, Дата"); + Если ФайлОписания.Существует() Тогда + ОписаниеВерсии = Служебный.ОписаниеРелиза(ФайлОписания.ПолноеИмя); + КонецЕсли; + + Лог.Информация("[%1]: Начало удаления файлов версии %2 (%3) конфигурации ""%4"" из репозитария ""%5""", + ТипЗнч(ЭтотОбъект), + ОписаниеВерсии.Версия, + Формат(ОписаниеВерсии.Дата, "ДФ=dd.MM.yyyy; ДП=-"), + ОписаниеВерсии.Имя, + КаталогВыгрузки); + УдалитьФайлы(КаталогВыгрузки); + КонецЕсли; + Распаковщик.ОбеспечитьКаталог(КаталогВыгрузки); + ФайлКонфигурации = Новый Файл(ПутьККонфигурации); + ФайлОписания = Новый Файл(ОбъединитьПути(ФайлКонфигурации.Путь, "description.json")); + ОписаниеВерсии = Новый Структура("Имя, Версия, Дата"); + Если ФайлОписания.Существует() Тогда + ОписаниеВерсии = Служебный.ОписаниеРелиза(ФайлОписания.ПолноеИмя); + КонецЕсли; + + Лог.Информация("[%1]: Начало загрузки версии %2 (%3) конфигурации ""%4"" из файла ""%5""", + ТипЗнч(ЭтотОбъект), + ОписаниеВерсии.Версия, + Формат(ОписаниеВерсии.Дата, "ДФ=dd.MM.yyyy; ДП=-"), + ОписаниеВерсии.Имя, + ПутьККонфигурации); + Конфигуратор = Новый УправлениеКонфигуратором(); Конфигуратор.УстановитьКонтекст(База_СтрокаСоединения, "", ""); Конфигуратор.ЗагрузитьКонфигурациюИзФайла(ПутьККонфигурации); + + Лог.Информация("[%1]: Начало выгрузки в файлы версии %2 (%3) конфигурации ""%4"" в репозитарий ""%5""", + ТипЗнч(ЭтотОбъект), + ОписаниеВерсии.Версия, + Формат(ОписаниеВерсии.Дата, "ДФ=dd.MM.yyyy; ДП=-"), + ОписаниеВерсии.Имя, + КаталогВыгрузки); + Конфигуратор.ВыгрузитьКонфигурациюВФайлы(КаталогВыгрузки); - ФайлКонфигурации = Новый Файл(ПутьККонфигурации); - ФайлОписания = Новый Файл(ОбъединитьПути(ФайлКонфигурации.Путь, "description.json")); Если ФайлОписания.Существует() Тогда НовыйФайлОписания = ОбъединитьПути(РепозитарийГит, "description.json"); КопироватьФайл(ФайлОписания.ПолноеИмя, НовыйФайлОписания); КонецЕсли; - + ФайлДампа = Новый Файл(ОбъединитьПути(КаталогВыгрузки, "ConfigDumpInfo.xml")); Если ФайлДампа.Существует() Тогда УдалитьФайлы(ФайлДампа.ПолноеИмя); КонецЕсли; - Лог.Информация("Добавляем изменения в индекс Git"); + Лог.Информация("[%1]: Начало добавления изменений в индекс Git", ТипЗнч(ЭтотОбъект)); ГитРепозиторий.ДобавитьФайлВИндекс("."); ГитРепозиторий.УстановитьНастройку("user.name", ИмяАвтора); ГитРепозиторий.УстановитьНастройку("user.email", ПочтаАвтора); ПредставлениеАвтора = ИмяАвтора + " <" + ПочтаАвтора + ">"; - Лог.Информация("Добавляем изменения в Git"); + + Лог.Информация("[%1]: Начало помещения изменений в Git", ТипЗнч(ЭтотОбъект)); + ГитРепозиторий.Закоммитить(СообщениеКоммита, Истина, , ПредставлениеАвтора, ДатаКоммита, , ДатаКоммита); ПродолжениеОбработкиДанныхВызовМенеджера(КаталогВыгрузки); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\263\321\200\321\203\320\267\321\207\320\270\320\272\320\240\320\265\320\273\320\270\320\267\320\276\320\2621\320\241.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\263\321\200\321\203\320\267\321\207\320\270\320\272\320\240\320\265\320\273\320\270\320\267\320\276\320\2621\320\241.os" index 10e00b6..b84ff07 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\263\321\200\321\203\320\267\321\207\320\270\320\272\320\240\320\265\320\273\320\270\320\267\320\276\320\2621\320\241.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\263\321\200\321\203\320\267\321\207\320\270\320\272\320\240\320\265\320\273\320\270\320\267\320\276\320\2621\320\241.os" @@ -21,6 +21,9 @@ Перем ФильтрВерсий; // Массив(Строка) - фильтр номеров версий Перем ФильтрВерсийНачинаяСДаты; // Дата - фильтр по начальной дате версии (включая) Перем ФильтрВерсийДоДаты; // Дата - фильтр по последней дате версии (включая) +Перем ФильтрДистрибутива; // Строка - фильтр заголовков ссылок на скачивание дистрибутива + // если не указан, то будет выполнена проверка наличия ссылки + // "Полный дистрибутив", затем "Дистрибутив обновления" Перем КаталогДляСохранения; // Строка - каталог для загрузки релизов 1С Перем РаспаковыватьEFD; // Булево - Истина - если загруженный архив содержит упакованный шаблон @@ -114,6 +117,15 @@ "Фильтр по последней дате версии (включая)"); ДобавитьОписаниеПараметра(Параметры, + "ФильтрДистрибутива", + "Строка", + Ложь, + "", + "Фильтр заголовков ссылок на скачивание дистрибутива + |если не указан, то будет выполнена проверка наличия ссылки + |""Полный дистрибутив"", затем ""Дистрибутив обновления"""); + + ДобавитьОписаниеПараметра(Параметры, "КаталогДляСохранения", "Строка", Истина, @@ -222,6 +234,7 @@ УстановитьПараметрОбработкиДанныхИзСтруктуры("ПарольПользователя" , ПараметрыОбработки); УстановитьПараметрОбработкиДанныхИзСтруктуры("ФильтрВерсийНачинаяСДаты" , ПараметрыОбработки); УстановитьПараметрОбработкиДанныхИзСтруктуры("ФильтрВерсийДоДаты" , ПараметрыОбработки); + УстановитьПараметрОбработкиДанныхИзСтруктуры("ФильтрДистрибутива" , ПараметрыОбработки); УстановитьПараметрОбработкиДанныхИзСтруктуры("КаталогДляСохранения" , ПараметрыОбработки); УстановитьПараметрОбработкиДанныхИзСтруктуры("РаспаковыватьEFD" , ПараметрыОбработки, Ложь); УстановитьПараметрОбработкиДанныхИзСтруктуры("КаталогДляРаспаковкиEFD" , ПараметрыОбработки); @@ -431,6 +444,12 @@ .ТСтрока() .ВОкружении("YARD_RELEASES_VERSION_END_DATE"); + Команда.Опция("df distr-filter", "", "Фильтр заголовков ссылок на скачивание дистрибутива + |если не указан, то будет выполнена проверка наличия ссылки + |""Полный дистрибутив"", затем ""Дистрибутив обновления""") + .ТСтрока() + .ВОкружении("YARD_RELEASES_DISTR_FILTER"); + Команда.Опция("p path", "", "каталог для загрузки релизов 1С") .ТСтрока() .ВОкружении("YARD_RELEASES_DOWNLOAD_PATH"); @@ -473,6 +492,7 @@ ВремДата = Служебный.ДатаИзСтроки(Команда.ЗначениеОпции("version-end-date")); УстановитьПараметрОбработкиДанных("ФильтрВерсийДоДаты" , ВремДата); + УстановитьПараметрОбработкиДанных("ФильтрДистрибутива" , Команда.ЗначениеОпции("distr-filter")); УстановитьПараметрОбработкиДанных("КаталогДляСохранения" , Команда.ЗначениеОпции("path")); УстановитьПараметрОбработкиДанных("РаспаковыватьEFD" , Команда.ЗначениеОпции("extract")); @@ -626,16 +646,18 @@ Обозреватель = Новый ОбозревательСайта1С(ИмяПользователя, ПарольПользователя); КонецЕсли; - Если ОписаниеВерсии.ПолныйДистрибутив Тогда - ВидДистрибутива = "Полный"; - СписокСсылок = Обозреватель.ПолучитьСсылкиДляЗагрузки(ОписаниеВерсии.Путь, "Полный дистрибутив$"); + Если ЗначениеЗаполнено(ФильтрДистрибутива) Тогда + ШаблонСсылки = ФильтрДистрибутива; + ИначеЕсли ОписаниеВерсии.ПолныйДистрибутив Тогда + ШаблонСсылки = "Полный дистрибутив$"; ИначеЕсли ОписаниеВерсии.ДистрибутивОбновления Тогда - ВидДистрибутива = "Обновление"; - СписокСсылок = Обозреватель.ПолучитьСсылкиДляЗагрузки(ОписаниеВерсии.Путь, "Дистрибутив обновления$"); + ШаблонСсылки = "Дистрибутив обновления$"; Иначе Возврат; КонецЕсли; + СписокСсылок = Обозреватель.ПолучитьСсылкиДляЗагрузки(ОписаниеВерсии.Путь, ШаблонСсылки); + Для Каждого ТекСсылка Из СписокСсылок Цикл ИмяФайлаАрхива = ОбъединитьПути(КаталогДляСохранения, @@ -646,7 +668,7 @@ Лог.Информация("Начало загрузки ""%1"", версия ""%2"":%3 (%4) в файл %5.", ОписаниеВерсии.Имя, ОписаниеВерсии.Версия, - ВидДистрибутива, + ШаблонСсылки, ТекСсылка.ПутьДляЗагрузки, ИмяФайлаАрхива); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\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\2711\320\241\320\222\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\265.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\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\2711\320\241\320\222\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\265.os" index aecc302..0067435 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\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\2711\320\241\320\222\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\265.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\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\2711\320\241\320\222\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\265.os" @@ -207,17 +207,11 @@ ФайлыОписанийВерсий = НайтиФайлы(ПутьККаталогуКонфигураций, "description.json", Истина); - ЧтениеОписания = Новый ЧтениеJSON(); - ВерсииДляОбработки = Новый Массив(); Для Каждого ТекФайл Из ФайлыОписанийВерсий Цикл - ЧтениеОписания.ОткрытьФайл(ТекФайл.ПолноеИмя, КодировкаТекста.UTF8); - - ОписаниеВерсии = ПрочитатьJSON(ЧтениеОписания, Ложь, , ФорматДатыJSON.ISO); - - ЧтениеОписания.Закрыть(); + ОписаниеВерсии = Служебный.ОписаниеРелиза(ТекФайл.ПолноеИмя); ФайлКонфигурации = Новый Файл(ОбъединитьПути(ТекФайл.Путь, "1cv8.cf")); diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" index e1e355a..8479e47 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -162,7 +162,7 @@ // Функция Версия() Экспорт - Возврат "0.3.0"; + Возврат "0.4.0"; КонецФункции // Версия() diff --git "a/src/\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.os" "b/src/\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.os" index d7e4232..98b6af3 100644 --- "a/src/\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.os" +++ "b/src/\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.os" @@ -148,20 +148,16 @@ ПутьКАрхивуZIP = ОбъединитьПути(КаталогРаспаковки, ИмяФайлаZIP); - Бинарник = Новый ДвоичныеДанные(ПутьКАрхивуEFD); + ПотокЧтенияEFD = Новый ФайловыйПоток(ПутьКАрхивуEFD, РежимОткрытияФайла.Открыть); ДлинаИмениСжатогоФайла = СтрДлина(ИмяФайлаDeflate); - РазмерСжатогоФайла = Бинарник.Размер(); + РазмерСжатогоФайла = ПотокЧтенияEFD.Размер(); CRC = 0; РазмерРаспакованногоФайла = Pow(2, 32) - 1; // максимально возможный размер ДатаВремя = ТекущаяДата(); ВремяФайла = ВремяFAT(ДатаВремя); ДатаФайла = ДатаFAT(ДатаВремя); - РазмерZIP = ПолучитьРазмерZIPФайла(РазмерСжатогоФайла, ДлинаИмениСжатогоФайла); - - БинарныйБуфер = Новый БуферДвоичныхДанных(РазмерZIP); - См0 = 0; См4 = 4; См6 = 6; @@ -191,34 +187,39 @@ БитовыйФлаг = 2050; // Битовый флаг МетодСжатия = 8; // Метод сжатия (0 - без сжатия, 8 - deflate) - БинарныйБуфер.ЗаписатьЦелое32(См0 , Сигнатура1); // Обязательная сигнатура 0x04034B50 - БинарныйБуфер.ЗаписатьЦелое16(См4 , ВерсияДляРаспаковки); // Минимальная версия для распаковки - БинарныйБуфер.ЗаписатьЦелое16(См6 , БитовыйФлаг); // Битовый флаг - БинарныйБуфер.ЗаписатьЦелое16(См8 , МетодСжатия); // Метод сжатия (0 - без сжатия, 8 - deflate) - БинарныйБуфер.ЗаписатьЦелое16(См10, ВремяФайла); // Время модификации файла - БинарныйБуфер.ЗаписатьЦелое16(См12, ДатаФайла); // Дата модификации файла - БинарныйБуфер.ЗаписатьЦелое32(См14, CRC); // Контрольная сумма - БинарныйБуфер.ЗаписатьЦелое32(См18, РазмерСжатогоФайла); // Сжатый размер - БинарныйБуфер.ЗаписатьЦелое32(См22, РазмерРаспакованногоФайла); // Несжатый размер - БинарныйБуфер.ЗаписатьЦелое16(См26, ДлинаИмениСжатогоФайла); // Длина название файла - БинарныйБуфер.ЗаписатьЦелое16(См28, 0); // Длина поля с дополнительными данными + БуферЗаголовка = Новый БуферДвоичныхДанных(ПолучитьРазмерЗаголовкаZIPФайла(ДлинаИмениСжатогоФайла)); + + БуферЗаголовка.ЗаписатьЦелое32(См0 , Сигнатура1); // Обязательная сигнатура 0x04034B50 + БуферЗаголовка.ЗаписатьЦелое16(См4 , ВерсияДляРаспаковки); // Минимальная версия для распаковки + БуферЗаголовка.ЗаписатьЦелое16(См6 , БитовыйФлаг); // Битовый флаг + БуферЗаголовка.ЗаписатьЦелое16(См8 , МетодСжатия); // Метод сжатия (0 - без сжатия, 8 - deflate) + БуферЗаголовка.ЗаписатьЦелое16(См10, ВремяФайла); // Время модификации файла + БуферЗаголовка.ЗаписатьЦелое16(См12, ДатаФайла); // Дата модификации файла + БуферЗаголовка.ЗаписатьЦелое32(См14, CRC); // Контрольная сумма + БуферЗаголовка.ЗаписатьЦелое32(См18, РазмерСжатогоФайла); // Сжатый размер + БуферЗаголовка.ЗаписатьЦелое32(См22, РазмерРаспакованногоФайла); // Несжатый размер + БуферЗаголовка.ЗаписатьЦелое16(См26, ДлинаИмениСжатогоФайла); // Длина название файла + БуферЗаголовка.ЗаписатьЦелое16(См28, 0); // Длина поля с дополнительными данными // Название файла Для й = 0 По ДлинаИмениСжатогоФайла - 1 Цикл - БинарныйБуфер.Установить(ДлинаФиксированнойЧастиLFH + й, КодСимвола(Сред(ИмяФайлаDeflate, й + 1, 1))); + БуферЗаголовка.Установить(ДлинаФиксированнойЧастиLFH + й, КодСимвола(Сред(ИмяФайлаDeflate, й + 1, 1))); КонецЦикла; // [Сжатые данные] - БуферСжатыхДанных = Новый БуферДвоичныхДанных(РазмерСжатогоФайла); - - Поток = Бинарник.ОткрытьПотокДляЧтения(); - Поток.Прочитать(БуферСжатыхДанных, 0, РазмерСжатогоФайла); - Поток.Закрыть(); - - БинарныйБуфер.Записать(ДлинаФиксированнойЧастиLFH + ДлинаИмениСжатогоФайла, БуферСжатыхДанных); - - ТекущееСмещение = ДлинаФиксированнойЧастиLFH + ДлинаИмениСжатогоФайла + РазмерСжатогоФайла; - + ПотокЗаписи = Новый ФайловыйПоток(ПутьКАрхивуZIP, РежимОткрытияФайла.СоздатьНовый); + ПотокЗаписи.Записать(БуферЗаголовка, 0, БуферЗаголовка.Размер); + + ОсталосьЗаписать = РазмерСжатогоФайла; + РазмерБуфера = 10485760; // 10 Mb + Пока ОсталосьЗаписать > 0 Цикл + БуферЗаписи = Новый БуферДвоичныхДанных(Мин(РазмерБуфера, ОсталосьЗаписать)); + ПотокЧтенияEFD.Прочитать(БуферЗаписи, 0, БуферЗаписи.Размер); + ПотокЗаписи.Записать(БуферЗаписи, 0, БуферЗаписи.Размер); + ОсталосьЗаписать = ОсталосьЗаписать - Мин(РазмерБуфера, ОсталосьЗаписать); + КонецЦикла; + ПотокЧтенияEFD.Закрыть(); + // [Central directory file header] ДлинаФиксированнойЧастиCDFH = 46; ДлинаДополнительныхДанных = 0; // Длина поля с дополнительными данными @@ -227,28 +228,32 @@ ВерсияДляСоздания = 814; // Версия для создания ВнешниеАтрибутыФайла = 2176057344; // Внешние аттрибуты файла - БинарныйБуфер.ЗаписатьЦелое32(ТекущееСмещение + См0 , Сигнатура2); // Обязательная сигнатура 0x02014B50 - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См4 , ВерсияДляСоздания); // Версия для создания - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См6 , ВерсияДляРаспаковки); // Минимальная версия для распаковки - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См8 , БитовыйФлаг); // Битовый флаг - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См10, МетодСжатия); - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См12, ВремяФайла); // Время модификации файла - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См14, ДатаФайла); // Дата модификации файла - БинарныйБуфер.ЗаписатьЦелое32(ТекущееСмещение + См16, CRC); // Контрольная сумма - БинарныйБуфер.ЗаписатьЦелое32(ТекущееСмещение + См20, РазмерСжатогоФайла); // Сжатый размер - БинарныйБуфер.ЗаписатьЦелое32(ТекущееСмещение + См24, РазмерРаспакованногоФайла); // Несжатый размер - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См28, ДлинаИмениСжатогоФайла); // Длина название файла - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См30, ДлинаДополнительныхДанных); - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См32, 0); // Длина комментариев к файлу - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См34, 0); // Номер диска - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См36, 0); // Внутренние аттрибуты файла - БинарныйБуфер.ЗаписатьЦелое32(ТекущееСмещение + См38, ВнешниеАтрибутыФайла); // Внешние аттрибуты файла - БинарныйБуфер.ЗаписатьЦелое32(ТекущееСмещение + См42, 0); // Смещение до структуры LocalFileHeader + ТекущееСмещение = 0; + + БуферОкончания = Новый БуферДвоичныхДанных(ПолучитьРазмерОкончанияZIPФайла(ДлинаИмениСжатогоФайла)); + + БуферОкончания.ЗаписатьЦелое32(ТекущееСмещение + См0 , Сигнатура2); // Обязательная сигнатура 0x02014B50 + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См4 , ВерсияДляСоздания); // Версия для создания + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См6 , ВерсияДляРаспаковки); // Минимальная версия для распаковки + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См8 , БитовыйФлаг); // Битовый флаг + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См10, МетодСжатия); + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См12, ВремяФайла); // Время модификации файла + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См14, ДатаФайла); // Дата модификации файла + БуферОкончания.ЗаписатьЦелое32(ТекущееСмещение + См16, CRC); // Контрольная сумма + БуферОкончания.ЗаписатьЦелое32(ТекущееСмещение + См20, РазмерСжатогоФайла); // Сжатый размер + БуферОкончания.ЗаписатьЦелое32(ТекущееСмещение + См24, РазмерРаспакованногоФайла); // Несжатый размер + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См28, ДлинаИмениСжатогоФайла); // Длина название файла + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См30, ДлинаДополнительныхДанных); + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См32, 0); // Длина комментариев к файлу + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См34, 0); // Номер диска + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См36, 0); // Внутренние аттрибуты файла + БуферОкончания.ЗаписатьЦелое32(ТекущееСмещение + См38, ВнешниеАтрибутыФайла); // Внешние аттрибуты файла + БуферОкончания.ЗаписатьЦелое32(ТекущееСмещение + См42, 0); // Смещение до структуры LocalFileHeader // Название файла Для й = 0 По ДлинаИмениСжатогоФайла - 1 Цикл СимволИмениФайла = КодСимвола(Сред(ИмяФайлаDeflate, й + 1, 1)); - БинарныйБуфер.Установить(ТекущееСмещение + ДлинаФиксированнойЧастиCDFH + й, СимволИмениФайла); + БуферОкончания.Установить(ТекущееСмещение + ДлинаФиксированнойЧастиCDFH + й, СимволИмениФайла); КонецЦикла; ТекущееСмещение = ТекущееСмещение + ДлинаФиксированнойЧастиCDFH + ДлинаИмениСжатогоФайла; @@ -261,53 +266,66 @@ Сигнатура3 = 101010256; // Обязательная сигнатура 0x06054B50 - БинарныйБуфер.ЗаписатьЦелое32(ТекущееСмещение + См0, Сигнатура3); // Обязательная сигнатура 0x06054B50 - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См4, 0); // Номер диска - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См6, 0); // Номер диска, где находится начало Central Directory - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См8, 1); // Количество записей в Central Directory в текущем диске - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См10, 1); // Всего записей в Central Directory - БинарныйБуфер.ЗаписатьЦелое32(ТекущееСмещение + См12, РазмерCentralDirectory); // Размер Central Directory - БинарныйБуфер.ЗаписатьЦелое32(ТекущееСмещение + См16, СмещениеCentralDirectory); // Смещение Central Directory - БинарныйБуфер.ЗаписатьЦелое16(ТекущееСмещение + См20, 0); // Длина комментария - - ПотокВПамяти = Новый ПотокВПамяти(БинарныйБуфер); - - НовыйБинарник = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные(); - НовыйБинарник.Записать(ПутьКАрхивуZIP); + БуферОкончания.ЗаписатьЦелое32(ТекущееСмещение + См0, Сигнатура3); // Обязательная сигнатура 0x06054B50 + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См4, 0); // Номер диска + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См6, 0); // Номер диска, где находится начало Central Directory + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См8, 1); // Количество записей в Central Directory в текущем диске + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См10, 1); // Всего записей в Central Directory + БуферОкончания.ЗаписатьЦелое32(ТекущееСмещение + См12, РазмерCentralDirectory); // Размер Central Directory + БуферОкончания.ЗаписатьЦелое32(ТекущееСмещение + См16, СмещениеCentralDirectory); // Смещение Central Directory + БуферОкончания.ЗаписатьЦелое16(ТекущееСмещение + См20, 0); // Длина комментария + ПотокЗаписи.Записать(БуферОкончания, 0, БуферОкончания.Размер); + ПотокЗаписи.Закрыть(); + Возврат ПутьКАрхивуZIP; КонецФункции // ПреобразоватьАрхивEFDвZIP() -// Функция - вычисляет размер ZIP-файла в байтах +// Функция - вычисляет размер заголовка ZIP-файла в байтах // // Параметры: -// РазмерСжатыхДанных - Число - размер данных файла в байтах // РазмерИмениИсходногоФайла - Число - размер имени сжатого файла в байтах // // Возвращаемое значение: -// Число - размер файла в байтах +// Число - размер заголовка файла в байтах // -Функция ПолучитьРазмерZIPФайла(РазмерСжатыхДанных, РазмерИмениИсходногоФайла) +Функция ПолучитьРазмерЗаголовкаZIPФайла(РазмерИмениИсходногоФайла) Р0 = 0; // 0-е смещение Р2 = 2; // смещение 2 байта Р4 = 4; // смещение 4 байта - РазмерLocalFileHeader = Р4 + Р2 + Р2 + Р2 + Р2 + Р2 + Р4 + Р4 + Р4 + Р2 + Р2 - + РазмерИмениИсходногоФайла + Р0; + РазмерLocalFileHeader = Р4 + Р2 + Р2 + Р2 + Р2 + Р2 + Р4 + Р4 + Р4 + Р2 + Р2 + + РазмерИмениИсходногоФайла + Р0; + Возврат РазмерLocalFileHeader; + +КонецФункции // ПолучитьРазмерЗаголовкаZIPФайла() + +// Функция - вычисляет размер окончания ZIP-файла в байтах +// +// Параметры: +// РазмерИмениИсходногоФайла - Число - размер имени сжатого файла в байтах +// +// Возвращаемое значение: +// Число - размер окончания файла в байтах +// +Функция ПолучитьРазмерОкончанияZIPФайла(РазмерИмениИсходногоФайла) + + Р0 = 0; // 0-е смещение + Р2 = 2; // смещение 2 байта + Р4 = 4; // смещение 4 байта + РазмерCentralDirectoryFileHeader = Р4 + Р2 + Р2 + Р2 + Р2 + Р2 + Р2 + Р4 + Р4 + Р4 + Р2 + Р2 + Р2 + Р2 + Р2 - + Р4 + Р4 + РазмерИмениИсходногоФайла + Р0 + Р0; + + Р4 + Р4 + РазмерИмениИсходногоФайла + Р0 + Р0; РазмерEndOfCentralDirectoryRecord = Р4 + Р2 + Р2 + Р2 + Р2 + Р4 + Р4 + Р2 + Р0; - Возврат РазмерLocalFileHeader + - РазмерСжатыхДанных + - РазмерCentralDirectoryFileHeader + + Возврат РазмерCentralDirectoryFileHeader + РазмерEndOfCentralDirectoryRecord; -КонецФункции // ПолучитьРазмерZIPФайла() +КонецФункции // ПолучитьРазмерОкончанияZIPФайла() // Функция - читает структуру файлов в архиве Deflate // diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" index 129122a..8719041 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.os" @@ -41,6 +41,37 @@ КонецФункции // ДатаИзСтроки() +// Процедура - Выполняет сравнение версий по соглашению SEMVER +// +// Параметры: +// СтрокаВерсия1 - Строка - Строковое представление версии типа "1.0.0.0" +// СтрокаВерсия2 - Строка - Строковое представление версии типа "1.0.0.0" +// +// Возвращаемое значение: +// Число - результат сравнения в числе (0 = Равны, -1 = Меньше, 1 = Больше), относительно первой версии (СтрокаВерсия1) +// Пример, +// (-1) - СтрокаВерсия1 меньше (<) СтрокаВерсия2 +// (1) - СтрокаВерсия1 больше (>) СтрокаВерсия2 +// (0) - СтрокаВерсия1 равна (=) СтрокаВерсия2 +// +Функция СравнитьВерсии(Знач СтрокаВерсии1, Знач СтрокаВерсии2) Экспорт + + МажорнаяВерсия1 = СокрЛП(Лев(СтрокаВерсии1, СтрНайти(СтрокаВерсии1, ".") - 1)) + ".0.0"; + МажорнаяВерсия2 = СокрЛП(Лев(СтрокаВерсии2, СтрНайти(СтрокаВерсии2, ".") - 1)) + ".0.0"; + + РезультатСравнения = Версии.СравнитьВерсии(МажорнаяВерсия1, МажорнаяВерсия2); + + Если НЕ РезультатСравнения = 0 Тогда + Возврат РезультатСравнения; + КонецЕсли; + + МинорнаяВерсия1 = Сред(СтрокаВерсии1, СтрНайти(СтрокаВерсии1, ".") + 1); + МинорнаяВерсия2 = Сред(СтрокаВерсии2, СтрНайти(СтрокаВерсии2, ".") + 1); + + Возврат Версии.СравнитьВерсии(МинорнаяВерсия1, МинорнаяВерсия2); + +КонецФункции // СравнитьВерсии() + // Процедура - сортирует 4-х элементный массив номеров версий согласно соглашению SEMVER // // Параметры: @@ -106,6 +137,34 @@ КонецПроцедуры // СортироватьОписанияВерсийПоНомеру() +// Процедура - сортирует массив описаний версий по дате версий +// +// Параметры: +// ОписанияВерсий - Массив(Структура) - массив описаний версий для сортировки +// * Версия - Строка - номер версии +// * Дата - Дата - дата версии +// * Путь - Строка - относительный путь к странице версии +// * ВерсииДляОбновления - Массив - список версий для обновления +// Порядок - Строка - принимает значение "ВОЗР" или "УБЫВ" +// +Процедура СортироватьОписанияВерсийПоДате(ОписанияВерсий, Порядок = "ВОЗР") Экспорт + + ТабВерсий = Новый ТаблицаЗначений(); + ТабВерсий.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата")); + ТабВерсий.Колонки.Добавить("ОписаниеВерсии"); + + Для Каждого ТекОписание Из ОписанияВерсий Цикл + СтрокаВерсии = ТабВерсий.Добавить(); + СтрокаВерсии.Дата = ТекОписание.Дата; + СтрокаВерсии.ОписаниеВерсии = ТекОписание; + КонецЦикла; + + ТабВерсий.Сортировать(СтрШаблон("Дата %1", Порядок)); + + ОписанияВерсий = ТабВерсий.ВыгрузитьКолонку("ОписаниеВерсии"); + +КонецПроцедуры // СортироватьОписанияВерсийПоДате() + // Функция - преобразует число в строку // добавляя в начало "0" для 1-значных чисел // @@ -198,3 +257,38 @@ КонецФункции // ОбщийПутьФайлов() +// Функция - возвращает общую для всех файлов часть пути +// +// Параметры: +// Путь - Строка - путь к каталогу шаблона релиза или к файлу описания (description.json) +// +// Возвращаемое значение: +// Структура - описание релиза +// *Идентификатор - Строка - идентификатор приложения +// *Имя - Строка - имя приложения +// *Версия - Строка - номер версии приложения +// *Дата - Дата - дата версии приложения +// *ВидДистрибутива - Строка - вид дистрибутива "Полный"/"Обновление" +// *ВерсииДляОбновления - Массив(Строка) - массив номеров версий, для которых преднозначено обновление +// +Функция ОписаниеРелиза(Знач Путь) Экспорт + + ВремФайл = Новый Файл(Путь); + + Если ВремФайл.ЭтоКаталог() Тогда + ФайлыОписанийВерсий = ОбъединитьПути(Путь, "description.json"); + Иначе + ФайлОписанияВерсии = Путь; + КонецЕсли; + + ЧтениеОписания = Новый ЧтениеJSON(); + + ЧтениеОписания.ОткрытьФайл(ФайлОписанияВерсии, КодировкаТекста.UTF8); + + ОписаниеРелиза = ПрочитатьJSON(ЧтениеОписания, Ложь, , ФорматДатыJSON.ISO); + + ЧтениеОписания.Закрыть(); + + Возврат ОписаниеРелиза; + +КонецФункции // ОписаниеРелиза()