Skip to content

Commit 654ab1d

Browse files
authored
Инкрементальная загрузка на основании расхождений не только с предыдущим коммитом, но и с текущей конфигурацией (#637)
* Инкриментальная загрузка на основании расхождений не только с предыдущим коммитом, но и с текущей конфигурацией * Фикс замечаний * Первая имплементация * Revert "Первая имплементация" This reverts commit e3a2dfb. * Притащил изменения из develop * Принес изменения из develop * Инкриментальная загрузка на основании расхождений не только с предыдущим коммитом, но и с текущей конфигурацией Фикс замечаний Первая имплементация Revert "Первая имплементация" This reverts commit e3a2dfb. Принес изменения из develop * Переехал на git-runner для более понятного управления выводом. Добавил в тесты проверку загрузки незакоммиченых изменений * Замечания сонара * Убрал кириллицу... ну не любит ее CI * Добавил тесты инкрементальной загрузки с изменениями в конфигураторе * Вывод для CI * Опечатка * Установил Quotepath для работы инкрементальной загруки * Исправил quotepath * fix опечатка * Опечатка в тесте * Еще опечатка * Добавил Нрег * ТЕперь в ibcmd передается полный путь к файлу. * Добавил тест, в котором есть проверка инкрементальной загрузки из файла ibcmd * fix для возможности работы тестов без установленных параметров git * Для систем без настроек * Убрал лишнее * Фиксы замечаний * Фикс замечаний * Добавил расшифровку к асерту
1 parent e34e6b7 commit 654ab1d

12 files changed

+426
-50
lines changed

features/ОбновлениеОкружения.feature

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,14 @@
7474
Когда Я выполняю команду "git" с параметрами 'commit -m "second commit"'
7575
И я показываю вывод команды
7676
И Я очищаю параметры команды "git" в контексте
77+
Когда Я выполняю команду "echo" с параметрами '"A=1;" >> ./cf/Catalogs/Справочник1/Ext/ObjectModule.bsl'
7778

7879
Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os update-dev --src ./cf --nocacheuse --git-increment --language ru"
7980
И я показываю вывод команды
8081
Тогда Вывод команды "oscript" содержит "Будет выполнена инкрементальная загрузка"
8182
И Вывод команды "oscript" содержит "Измененные файлы:"
8283
И Вывод команды "oscript" содержит "ManagedApplicationModule.bsl"
84+
И Вывод команды "oscript" содержит "ObjectModule.bsl"
8385
И Вывод команды "oscript" содержит "Обновление конфигурации базы данных успешно завершено"
8486
И Код возврата команды "oscript" равен 0
8587

packagedef

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@
126126
.ЗависитОт("cmdline", "1.0.0")
127127
.ЗависитОт("fluent", "0.6.1")
128128
.ЗависитОт("fs", "1.2.0")
129-
.ЗависитОт("ibcmdrunner", "0.2.3")
129+
.ЗависитОт("ibcmdrunner", "0.2.5")
130130
.ЗависитОт("json", "1.1.1")
131131
.ЗависитОт("logos", "1.7.0")
132132
.ЗависитОт("ParserFileV8i", "0.0.5")
@@ -138,10 +138,10 @@
138138
.ЗависитОт("v8storage", "0.6.5")
139139
.ЗависитОт("v8unpack", "1.0.6")
140140
.ЗависитОт("packageinfo", "1.0")
141+
.ЗависитОт("gitrunner", "1.7.1")
141142

142143
.РазработкаЗависитОт("1bdd", "1.14.0")
143144
.РазработкаЗависитОт("1testrunner", "1.8.0")
144-
.РазработкаЗависитОт("gitrunner", "1.7.1")
145145
.РазработкаЗависитОт("add", "6.8.0")
146146

147147
.ВключитьФайл("tools")

src/Классы/КомандаОбновлениеОкружения.os

Lines changed: 87 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// oscript-app-template (C) EvilBeaver
77
//
88
///////////////////////////////////////////////////////////////////
9-
9+
#Использовать gitrunner
1010
#Область ОписаниеПеременных
1111

1212
Перем Лог; // Экземпляр логгера
@@ -156,71 +156,111 @@
156156

157157
КонецПроцедуры
158158

159-
Функция ПолучитьСтрокуИзмененныхФайлов(Знач ПутьИсходников)
159+
Функция ПолучитьСтрокуИзмененныхФайлов(Знач ПутьИсходников, МенеджерСборки)
160+
СтрокаИзмененныхФайлов = "";
160161

161-
Хэш = ПолучитьХэшПоследнегоЗагруженногоКоммита(ПутьИсходников);
162+
ИзмененныеФайлыGitDiff = ПолучитьФайлыИзGitDiff(ПутьИсходников);
163+
ИзмененныеФайлыИзКонфигурации = ПолучитьИзмененныеВКонфигурацииФайлыСМоментаПоследнейЗагрузки(ПутьИсходников,
164+
МенеджерСборки);
162165

163-
Если ПустаяСтрока(Хэш) Тогда
164-
Лог.Отладка("Не найден хэш последнего загруженного коммита для инкрементальной загрузки");
166+
СтрокаИзмененныхФайлов = ИзмененныеФайлыGitDiff + ИзмененныеФайлыИзКонфигурации;
167+
Если ИзмененныеФайлыИзКонфигурации = "FullDump" Тогда
168+
Лог.Отладка("Требуется полная загрузка конфигурации.");
165169
Возврат "";
166170
КонецЕсли;
171+
172+
Если ЗначениеЗаполнено(СтрокаИзмененныхФайлов) Тогда
173+
СтрокаИзмененныхФайлов = Лев(СтрокаИзмененныхФайлов, СтрДлина(СтрокаИзмененныхФайлов) - 1);
167174

168-
ТекущийКаталог = КорневойПутьПроекта;
169-
Лог.Отладка("ТекущийКаталог %1", ТекущийКаталог);
175+
ИзмененныеФайлыЛог = СтрСоединить(СтрРазделить(СтрокаИзмененныхФайлов, ";"), Символы.ПС);
176+
Лог.Информация( "Будет выполнена инкрементальная загрузка
177+
|Измененные файлы:
178+
|%1",
179+
ИзмененныеФайлыЛог
180+
); // BSLLS:IncorrectLineBreak-off
181+
Иначе
182+
Лог.Отладка("Не получена строка измененных файлов для инкрементальной загрузки");
183+
КонецЕсли;
170184

171-
ОтносительныйПутьИсходников = ФС.ОтносительныйПуть(КорневойПутьПроекта, ПутьИсходников, "/");
185+
Возврат СтрокаИзмененныхФайлов;
172186

173-
КоманднаяСтрока = СтрШаблон("git diff --name-only %1 HEAD", Хэш);
174-
Лог.Отладка("Запускаю команду git получить измененные файлы %1", КоманднаяСтрока);
187+
КонецФункции
175188

176-
Процесс = СоздатьПроцесс(КоманднаяСтрока, ТекущийКаталог, Истина, , КодировкаТекста.UTF8);
177-
Процесс.Запустить();
189+
Функция ПолучитьФайлыИзGitDiff(Знач ПутьИсходников)
190+
Лог.Отладка("Получим измененные файлы в воркспейсе со времени последней загрузки."); // BSLLS:Typo-off
191+
СтрокаИзмененныхФайлов = "";
178192

179-
Процесс.ОжидатьЗавершения();
193+
Хэш = ПолучитьХэшПоследнегоЗагруженногоКоммита(ПутьИсходников);
180194

181-
СтрокаИзмененныхФайлов = "";
182-
Пока Процесс.ПотокВывода.ЕстьДанные Цикл
195+
Если ПустаяСтрока(Хэш) Тогда
196+
Лог.Отладка("Не найден хэш последнего загруженного коммита для инкрементальной загрузки"); // BSLLS:Typo-off
197+
Возврат "";
198+
КонецЕсли;
183199

184-
СтрокаВывода = Процесс.ПотокВывода.ПрочитатьСтроку();
185-
Лог.Отладка(" Строка вывода команды: %1", СтрокаВывода);
186-
Если СтрНачинаетсяС(СтрокаВывода, ОтносительныйПутьИсходников)
187-
И Не ФайлВСпискеИсключений(СтрокаВывода) Тогда
200+
ТекущийКаталог = КорневойПутьПроекта;
201+
Лог.Отладка("ТекущийКаталог %1", ТекущийКаталог);
188202

189-
СтрокаВывода = СкорректироватьПутьКИзменениюФормы(СтрокаВывода);
203+
ОтносительныйПутьИсходников = ФС.ОтносительныйПуть(КорневойПутьПроекта, ПутьИсходников, "/");
190204

191-
ТекущаяСтрока = ОбъединитьПути(ТекущийКаталог, СтрокаВывода);
205+
Репозиторий = Новый ГитРепозиторий();
206+
Репозиторий.УстановитьРабочийКаталог(КорневойПутьПроекта);
207+
208+
УстановитьQuotepath(Репозиторий);
209+
210+
Лог.Отладка("Получим все изменения в репозитории от коммита <%1>", Хэш); // BSLLS:Typo-off
211+
// Получим изменения из репозитория
212+
ПараметрыКоманды = Новый Массив;
213+
ПараметрыКоманды.Добавить("diff");
214+
ПараметрыКоманды.Добавить("--name-only");
215+
ПараметрыКоманды.Добавить(Хэш);
216+
Репозиторий.ВыполнитьКоманду(ПараметрыКоманды);
217+
218+
МассивФайлов = СтрРазделить(Репозиторий.ПолучитьВыводКоманды(), Символы.ПС, Ложь);
219+
220+
Для каждого ИзмененныйФайл Из МассивФайлов Цикл
221+
Лог.Отладка(" Изменился файл: %1", ИзмененныйФайл);
222+
ИзмененныйФайл = СокрЛП(ИзмененныйФайл);
223+
Если СтрНачинаетсяС(ИзмененныйФайл, ОтносительныйПутьИсходников)
224+
И Не ФайлВСпискеИсключений(ИзмененныйФайл) Тогда
225+
ИзмененныйФайл = СкорректироватьПутьКИзменениюФормы(ИзмененныйФайл);
226+
ИзмененныйФайл = СтрЗаменить(ИзмененныйФайл, "/", ПолучитьРазделительПути());
227+
ТекущаяСтрока = ОбъединитьПути(ТекущийКаталог, ИзмененныйФайл);
192228
ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "/", ПолучитьРазделительПути());
193-
229+
194230
Если СтрНайти(СтрокаИзмененныхФайлов, ТекущаяСтрока) = 0
195231
И Новый Файл(ТекущаяСтрока).Существует() Тогда
196232

197233
СтрокаИзмененныхФайлов = СтрокаИзмененныхФайлов + ТекущаяСтрока + ";";
198234

199235
КонецЕсли;
200-
201236
КонецЕсли;
202237

203238
КонецЦикла;
204-
Лог.Отладка("Ошибки от процесса
205-
|%1", Процесс.ПотокОшибок.Прочитать());
206239

207-
Если ЗначениеЗаполнено(СтрокаИзмененныхФайлов) Тогда
208-
СтрокаИзмененныхФайлов = Лев(СтрокаИзмененныхФайлов, СтрДлина(СтрокаИзмененныхФайлов) - 1);
240+
Возврат СтрокаИзмененныхФайлов;
241+
КонецФункции
209242

210-
ИзменныеФайлыЛог = СтрСоединить(СтрРазделить(СтрокаИзмененныхФайлов, ";"), Символы.ПС);
211-
Лог.Информация( "Будет выполнена инкрементальная загрузка
212-
|Измененные файлы:
213-
|%1",
214-
ИзменныеФайлыЛог
215-
);
216-
Иначе
217-
Лог.Отладка("Не получена строка измененных файлов для инкрементальной загрузки");
243+
Функция ПолучитьИзмененныеВКонфигурацииФайлыСМоментаПоследнейЗагрузки(Знач ПутьИсходников, МенеджерСборки)
244+
Лог.Отладка("Получим измененные файлы в конфигурации со времени последней загрузки.");
245+
СтрокаИзмененныхФайлов = "";
246+
ПутьКФайлуЭталона = ОбъединитьПути(КорневойПутьПроекта, ПутьИсходников, ИмяФайлаLastUploadedConfigDumpInfo());
247+
Если ФС.ФайлСуществует(ПутьКФайлуЭталона) Тогда
248+
СтрокаИзмененныхФайлов = МенеджерСборки.ПолучитьИзмененияКонфигурации(ПутьИсходников, ПутьКФайлуЭталона);
218249
КонецЕсли;
219250

220251
Возврат СтрокаИзмененныхФайлов;
221-
222252
КонецФункции
223253

254+
Процедура УстановитьQuotepath(Репозиторий)
255+
Лог.Отладка("Проверим git config core.quotePath");
256+
257+
Если Не Нрег(СокрЛП(Репозиторий.ПолучитьНастройку("core.quotePath"))) = "false" Тогда
258+
Лог.Отладка("Для корректной работы <--git-increment> необходима настройка git config core.quotePath false");
259+
Репозиторий.УстановитьНастройку("core.quotePath", "false", РежимУстановкиНастроекGit.Локально);
260+
КонецЕсли;
261+
262+
КонецПроцедуры
263+
224264
Функция ПолучитьХэшПоследнегоЗагруженногоКоммита(Знач ПутьИсходников)
225265

226266
ИмяФайла = ФайлПредыдущегоГитКоммита(ПутьИсходников).ПолноеИмя;
@@ -264,6 +304,11 @@
264304

265305
КонецПроцедуры
266306

307+
Процедура ЗаписатьlastUploadedConfigDumpInfo(Знач ПутьИсходников) // BSLLS:LatinAndCyrillicSymbolInWord-off
308+
ИсходныйФайл = ОбъединитьПути(ПутьИсходников, "ConfigDumpInfo.xml");
309+
ФайлПреемник = ОбъединитьПути(ПутьИсходников, ИмяФайлаLastUploadedConfigDumpInfo());
310+
КопироватьФайл(ИсходныйФайл, ФайлПреемник);
311+
КонецПроцедуры
267312
Функция СкорректироватьПутьКИзменениюФормы(СтрокаИзмененныхФайлов)
268313

269314
Паттерн = "(.*Forms\/.*)\/Ext.*";
@@ -300,6 +345,10 @@
300345
Возврат "lastUploadedCommit.txt";
301346
КонецФункции
302347

348+
Функция ИмяФайлаLastUploadedConfigDumpInfo()
349+
Возврат "lastUploadedConfigDumpInfo.xml";
350+
КонецФункции
351+
303352
Функция НовыйМенеджерСборки(ПараметрыКоманды)
304353

305354
Если ПараметрыХранилища.РежимОбновления Тогда
@@ -327,7 +376,7 @@
327376

328377
Лог.Информация("Запускаем обновление конфигурации из исходников...");
329378
Если ИнкрементальнаяЗагрузкаGit Тогда
330-
СписокФайлов = ПолучитьСтрокуИзмененныхФайлов(ПутьКИсходникам);
379+
СписокФайлов = ПолучитьСтрокуИзмененныхФайлов(ПутьКИсходникам, МенеджерСборки);
331380
Иначе
332381
СписокФайлов = "";
333382
КонецЕсли;
@@ -341,6 +390,7 @@
341390

342391
Если ИнкрементальнаяЗагрузкаGit Тогда
343392
ЗаписатьХэшПоследнегоЗагруженногоКоммита(ПутьКИсходникам);
393+
ЗаписатьlastUploadedConfigDumpInfo(ПутьКИсходникам);
344394
КонецЕсли;
345395

346396
Лог.Информация("Информационная база обновлена из исходников.");

src/Классы/МенеджерIbcmd.os

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,48 @@
244244
Возврат КаталогВременнойИБ;
245245
КонецФункции
246246

247+
// Возвращает строку, содержащую все изменения конфигурации с момента последней загрузки.
248+
// Параметры:
249+
// КаталогВыгрузки - Строка - каталог с исходными файлами конфигурации
250+
// ПутьКФайлуВерсийДляСравнения - Строка - путь к файлу configDumpInfo на основании которого считаются изменения
251+
//
252+
// Возвращаемое значение:
253+
// Строка - Список файлов которые изменились с последней загрузки конфигурации, разделенные ";".
254+
// Если необходима полная загрузка будет возвращена строка "FullDump"
255+
Функция ПолучитьИзмененияКонфигурации(Знач КаталогВыгрузки,
256+
Знач ПутьКФайлуВерсийДляСравнения = "") Экспорт
257+
258+
ИзмененияКонфигурации = "";
259+
260+
ПутьКФайлуИзменений = ОбъединитьПути(КаталогВыгрузки, "diff.txt");
261+
УправлениеИБ.ВыгрузитьВФайлИзмененияКонфигурации(ПутьКФайлуИзменений, ПутьКФайлуВерсийДляСравнения);
262+
263+
Если ФС.ФайлСуществует(ПутьКФайлуИзменений) Тогда
264+
ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлуИзменений, КодировкаТекста.UTF8NoBOM);
265+
266+
СтрокаИзменения = ЧтениеТекста.ПрочитатьСтроку();
267+
Пока СтрокаИзменения <> Неопределено Цикл // строки читаются до символа перевода строки
268+
Лог.Отладка("Обрабатываем строку изменения конфигурации <%1>", СтрокаИзменения);
269+
Если СтрокаИзменения = "modified: all" Тогда
270+
Лог.Отладка("Требуется выполнить полную загрузку конфигурации, вычислить diff невозможно!", СтрокаИзменения);
271+
ИзмененияКонфигурации = "FullDump";
272+
Прервать;
273+
КонецЕсли;
274+
Если СтрНачинаетсяС(СтрокаИзменения, "modified:") Тогда
275+
// Все остальные нам не нужны, нужны только измененные объекты которые нужно перезагрузить в конфигурацию.
276+
ИмяФайла = ОбщиеМетоды.НайтиИмяФайлаПоСтрокеИзменений1С(СтрокаИзменения);
277+
ИмяФайла = ОбъединитьПути(КаталогВыгрузки, ИмяФайла);
278+
ИзмененияКонфигурации = ИзмененияКонфигурации + ИмяФайла + ";";
279+
КонецЕсли;
280+
СтрокаИзменения = ЧтениеТекста.ПрочитатьСтроку();
281+
КонецЦикла;
282+
ЧтениеТекста.Закрыть();
283+
284+
УдалитьФайлы(ПутьКФайлуИзменений);
285+
КонецЕсли;
286+
287+
Возврат ИзмененияКонфигурации;
288+
КонецФункции
247289
#КонецОбласти
248290

249291
#Область ОбработчикиСобытий
@@ -311,7 +353,6 @@
311353
#КонецОбласти
312354

313355
#Область СлужебныеПроцедурыИФункции
314-
315356
Функция ПутьКIbcmd(ВерсияПлатформы, Разрядность)
316357

317358
Если Не СтрНачинаетсяС(ВерсияПлатформы, "8.3") Тогда

0 commit comments

Comments
 (0)