Skip to content

Commit 4582a86

Browse files
committed
Merge branch 'feature/git-index-32' into develop
2 parents 4da6750 + 15a2f9f commit 4582a86

File tree

2 files changed

+201
-30
lines changed

2 files changed

+201
-30
lines changed

tests/v8files-extractor-test.os

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
ВсеТесты.Добавить("Тест_ДолженРазложитьФайлОбработкиИзЗаданнойПапки");
1717
ВсеТесты.Добавить("Тест_ДолженРазложитьКаталог");
18+
ВсеТесты.Добавить("Тест_ДолженРазобратьФайлыПоЖурналуИзмененийГит");
1819

1920
Возврат ВсеТесты;
2021

@@ -90,6 +91,20 @@
9091

9192
КонецПроцедуры
9293

94+
Процедура Тест_ДолженРазобратьФайлыПоЖурналуИзмененийГит() Экспорт
95+
96+
ФайлОбработки = ПолучитьФайлТестовойОбработки();
97+
98+
ЖурналИзмененийГит = "A " + ФайлОбработки.Имя+"
99+
| M " + "pref-" + ФайлОбработки.Имя;
100+
101+
Исполнитель = ЗагрузитьИсполнителя();
102+
МассивИмен = Исполнитель.ПолучитьИменаИзЖурналаИзмененийГит(ЖурналИзмененийГит);
103+
104+
Ожидаем.Что(МассивИмен, "Должны были найти измененный файл").Содержит(ФайлОбработки.Имя);
105+
Ожидаем.Что(МассивИмен, "Должны были найти измененный файл").Содержит("pref-" + ФайлОбработки.Имя);
106+
КонецПроцедуры
107+
93108
Функция КаталогСодержитИсходникиОбработки(Знач Каталог)
94109
ВыгруженныеФайлы = НайтиФайлы(Каталог, ПолучитьМаскуВсеФайлы());
95110
ИменаВыгруженныхФайлов = РазвернутьМассивФайловВИменаФайлов(ВыгруженныеФайлы);

v8files-extractor.os

Lines changed: 186 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,24 @@
33
#Использовать tempfiles
44
#Использовать asserts
55
#Использовать v8runner
6+
#Использовать strings
67

78
Перем Лог;
89
Перем КодВозврата;
10+
Перем мВозможныеКоманды;
11+
12+
Функция ВозможныеКоманды()
13+
14+
Если мВозможныеКоманды = Неопределено Тогда
15+
мВозможныеКоманды = Новый Структура;
16+
мВозможныеКоманды.Вставить("Декомпилировать", "--decompile");
17+
мВозможныеКоманды.Вставить("Помощь", "--help");
18+
мВозможныеКоманды.Вставить("ОбработатьИзмененияИзГит", "--git-precommit");
19+
КонецЕсли;
20+
21+
Возврат мВозможныеКоманды;
22+
23+
КонецФункции
924

1025
Функция ЗапускВКоманднойСтроке()
1126

@@ -19,17 +34,9 @@
1934

2035
Парсер = Новый ПарсерАргументовКоманднойСтроки();
2136

22-
ВозможныеКоманды = Новый Структура;
23-
ВозможныеКоманды.Вставить("Декомпилировать", "--decompile");
24-
ВозможныеКоманды.Вставить("Помощь", "--help");
25-
26-
ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды.Декомпилировать);
27-
Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьВходящихДанных");
28-
Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ВыходнойКаталог");
29-
Парсер.ДобавитьКоманду(ОписаниеКоманды);
30-
31-
ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды.Помощь);
32-
Парсер.ДобавитьКоманду(ОписаниеКоманды);
37+
ДобавитьОписаниеКомандыДекомпилировать(Парсер);
38+
ДобавитьОписаниеКомандыПомощь(Парсер);
39+
ДобавитьОписаниеКомандыИзмененияПоЖурналуГит(Парсер);
3340

3441
Аргументы = Парсер.РазобратьКоманду(АргументыКоманднойСтроки);
3542

@@ -39,10 +46,12 @@
3946
Лог.Отладка(Параметр.Ключ + " = " + Параметр.Значение);
4047
КонецЦикла;
4148

42-
Если Команда = ВозможныеКоманды.Декомпилировать Тогда
49+
Если Команда = ВозможныеКоманды().Декомпилировать Тогда
4350
Декомпилировать(Аргументы.ЗначенияПараметров["ПутьВходящихДанных"], Аргументы.ЗначенияПараметров["ВыходнойКаталог"]);
44-
ИначеЕсли Команда = ВозможныеКоманды.Помощь Тогда
51+
ИначеЕсли Команда = ВозможныеКоманды().Помощь Тогда
4552
ВывестиСправку();
53+
ИначеЕсли Команда = ВозможныеКоманды().ОбработатьИзмененияИзГит Тогда
54+
ОбработатьИзмененияИзГит(Аргументы.ЗначенияПараметров["ВыходнойКаталог"]);
4655
КонецЕсли;
4756

4857
Исключение
@@ -54,11 +63,35 @@
5463

5564
КонецФункции
5665

66+
Процедура ДобавитьОписаниеКомандыДекомпилировать(Знач Парсер)
67+
ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().Декомпилировать);
68+
Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьВходящихДанных");
69+
Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ВыходнойКаталог");
70+
Парсер.ДобавитьКоманду(ОписаниеКоманды);
71+
КонецПроцедуры
72+
73+
Процедура ДобавитьОписаниеКомандыПомощь(Знач Парсер)
74+
ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().Помощь);
75+
Парсер.ДобавитьКоманду(ОписаниеКоманды);
76+
КонецПроцедуры
77+
78+
Процедура ДобавитьОписаниеКомандыИзмененияПоЖурналуГит(Знач Парсер)
79+
80+
ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().ОбработатьИзмененияИзГит);
81+
Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ВыходнойКаталог");
82+
Парсер.ДобавитьКоманду(ОписаниеКоманды);
83+
84+
КонецПроцедуры
85+
5786
Процедура Инициализация()
5887
Лог = Логирование.ПолучитьЛог("oscript.app.v8files-extractor");
5988
Лог.УстановитьУровень(УровниЛога.Отладка);
6089
КонецПроцедуры
6190

91+
92+
/////////////////////////////////////////////////////////////////////////////
93+
// РЕАЛИЗАЦИЯ КОМАНД
94+
6295
Процедура Декомпилировать(Знач Путь, Знач КаталогВыгрузки) Экспорт
6396
Файл = Новый Файл(Путь);
6497
Если Файл.ЭтоКаталог() Тогда
@@ -68,30 +101,22 @@
68101
КонецЕсли;
69102
КонецПроцедуры
70103

71-
Процедура ВывестиСправку()
72-
Сообщить("Утилита сборки/разборки внешних файлов 1С");
73-
Сообщить(" ");
74-
Сообщить("Параметры командной строки:");
75-
Сообщить(" --decompile inputPath outputPath");
76-
Сообщить(" Разбор файлов на исходники");
77-
78-
Сообщить(" --help");
79-
Сообщить(" Показ этого экрана");
80-
КонецПроцедуры
81-
82104
Процедура РазобратьКаталог(Знач ПутьКаталога, Знач КаталогВыгрузки) Экспорт
83105
Лог.Информация("Подготовка выгрузки каталога "+ПутьКаталога+" в каталог " + КаталогВыгрузки);
84106
РазобратьКаталогВнутр(ПутьКаталога, КаталогВыгрузки);
85107
Лог.Информация("Завершена выгрузки каталога "+ПутьКаталога+" в каталог " + КаталогВыгрузки);
86108
КонецПроцедуры
87109

88-
Процедура РазобратьФайл(Знач ПутьФайла, Знач КаталогВыгрузки) Экспорт
110+
Функция РазобратьФайл(Знач ПутьФайла, Знач КаталогВыгрузки) Экспорт
89111
Лог.Информация("Подготовка выгрузки файла "+ПутьФайла+" в каталог " + КаталогВыгрузки);
90112

91-
РазобратьФайлВнутр(ПутьФайла, КаталогВыгрузки);
113+
КаталогИсходников = РазобратьФайлВнутр(ПутьФайла, КаталогВыгрузки);
92114

93115
Лог.Информация("Завершена выгрузка файла "+ПутьФайла+" в каталог " + КаталогВыгрузки);
94-
КонецПроцедуры
116+
117+
Возврат КаталогИсходников;
118+
119+
КонецФункции
95120

96121
Процедура РазобратьКаталогВнутр(Знач ПутьКаталога, Знач КаталогВыгрузки)
97122
ОбъектКаталога = Новый Файл(ПутьКаталога);
@@ -113,10 +138,16 @@
113138
КонецПроцедуры
114139

115140
Функция ТипФайлаПоддерживается(Файл)
116-
Возврат Найти(".epf,.erf,", Файл.Расширение+",") > 0;
141+
Если ПустаяСтрока(Файл.Расширение) Тогда
142+
Возврат Ложь;
143+
КонецЕсли;
144+
145+
Поз = Найти(".epf,.erf,", Файл.Расширение+",");
146+
Возврат Поз > 0;
147+
117148
КонецФункции
118149

119-
Процедура РазобратьФайлВнутр(Знач ПутьФайла, Знач КаталогВыгрузки)
150+
Функция РазобратьФайлВнутр(Знач ПутьФайла, Знач КаталогВыгрузки)
120151

121152
Файл = Новый Файл(ПутьФайла);
122153
Если Не ТипФайлаПоддерживается(Файл) Тогда
@@ -129,7 +160,9 @@
129160
ОбеспечитьПустойКаталог(ПапкаИсходников);
130161
ЗапуститьРаспаковку(Файл, ПапкаИсходников);
131162

132-
КонецПроцедуры
163+
Возврат ПапкаИсходников.ПолноеИмя;
164+
165+
КонецФункции
133166

134167
Процедура ЗапуститьРаспаковку(Знач Файл, Знач ПапкаИсходников)
135168

@@ -179,6 +212,129 @@
179212

180213
КонецПроцедуры
181214

215+
216+
Процедура ВывестиСправку()
217+
Сообщить("Утилита сборки/разборки внешних файлов 1С");
218+
Сообщить(" ");
219+
Сообщить("Параметры командной строки:");
220+
Сообщить(" --decompile inputPath outputPath");
221+
Сообщить(" Разбор файлов на исходники");
222+
223+
Сообщить(" --help");
224+
Сообщить(" Показ этого экрана");
225+
Сообщить(" --git-precommit");
226+
Сообщить(" Запустить чтение индекса из git и определить список файлов для разбора, разложить их и добавить исходники в индекс");
227+
КонецПроцедуры
228+
229+
230+
Процедура ОбработатьИзмененияИзГит(Знач ВыходнойКаталог)
231+
232+
Если ПустаяСтрока(ВыходнойКаталог) Тогда
233+
ВыходнойКаталог = "src";
234+
КонецЕсли;
235+
236+
ЖурналИзмененийГитСтрокой = ПолучитьЖурналИзмененийГит();
237+
ИменаФайлов = ПолучитьИменаИзЖурналаИзмененийГит(ЖурналИзмененийГитСтрокой);
238+
239+
КореньРепо = ТекущийКаталог();
240+
КаталогИсходников = ОбъединитьПути(КореньРепо, ВыходнойКаталог);
241+
СписокНовыхКаталогов = Новый Массив;
242+
Для Каждого Файл Из ИменаФайлов Цикл
243+
Если ТипФайлаПоддерживается(Новый Файл(Файл)) Тогда
244+
Лог.Отладка("Получен из журнала git файл " + Файл);
245+
ПолныйПуть = ОбъединитьПути(КореньРепо, Файл);
246+
СписокНовыхКаталогов.Добавить(РазобратьФайл(ПолныйПуть, КаталогИсходников));
247+
КонецЕсли;
248+
КонецЦикла;
249+
250+
ДобавитьИсходникиВГит(СписокНовыхКаталогов);
251+
252+
КонецПроцедуры
253+
254+
Функция ПолучитьЖурналИзмененийГит()
255+
256+
Перем КодВозврата;
257+
258+
Лог.Отладка("Запускаю git diff-index");
259+
Вывод = ПолучитьВыводПроцесса("git diff-index --name-status --cached HEAD", КодВозврата);
260+
Лог.Отладка("Вывод git diff-index: " + Вывод);
261+
Если КодВозврата <> 0 Тогда
262+
Лог.Отладка("Запускаю git status");
263+
Вывод = ПолучитьВыводПроцесса("git status --porcelain", КодВозврата);
264+
Лог.Отладка("Вывод git status: " + Вывод);
265+
266+
Если КодВозврата <> 0 Тогда
267+
ВызватьИсключение "Не удалось собрать журнал изменений git";
268+
КонецЕсли;
269+
270+
КонецЕсли;
271+
272+
Возврат Вывод;
273+
274+
КонецФункции
275+
276+
Функция ПолучитьВыводПроцесса(Знач КоманднаяСтрока, КодВозврата)
277+
278+
// Это для dev версии 1.0.11
279+
//Процесс = СоздатьПроцесс(КоманднаяСтрока, , Истина,, КодировкаТекста.UTF8);
280+
// Процесс.Запустить();
281+
// Вывод = "";
282+
283+
// Процесс.ОжидатьЗавершения();
284+
285+
// Вывод = Вывод + Процесс.ПотокВывода.Прочитать();
286+
// Вывод = Вывод + Процесс.ПотокОшибок.Прочитать();
287+
288+
// КодВозврата = Процесс.КодВозврата;
289+
290+
ЛогФайл = ВременныеФайлы.НовоеИмяФайла();
291+
СтрокаЗапуска = "cmd /C """ + КоманднаяСтрока + " > """ + ЛогФайл + """ 2>&1""";
292+
Лог.Отладка(СтрокаЗапуска);
293+
ЗапуститьПриложение(СтрокаЗапуска,, Истина, КодВозврата);
294+
Лог.Отладка("Код возврата: " + КодВозврата);
295+
ЧтениеТекста = Новый ЧтениеТекста(ЛогФайл, "utf-8");
296+
Вывод = ЧтениеТекста.Прочитать();
297+
ЧтениеТекста.Закрыть();
298+
ВременныеФайлы.УдалитьФайл(ЛогФайл);
299+
300+
Возврат Вывод;
301+
302+
КонецФункции
303+
304+
Функция ПолучитьИменаИзЖурналаИзмененийГит(Знач ЖурналИзмененийГит) Экспорт
305+
МассивИмен = Новый Массив;
306+
МассивСтрокЖурнала = СтроковыеФункции.РазложитьСтрокуВМассивПодстрок(ЖурналИзмененийГит, Символы.ПС);
307+
Лог.Отладка("ЖурналИзмененийГит:");
308+
Для Каждого СтрокаЖурнала Из МассивСтрокЖурнала Цикл
309+
Лог.Отладка(" "+СтрокаЖурнала);
310+
СтрокаЖурнала = СокрЛ(СтрокаЖурнала);
311+
СимволИзменений = Лев(СтрокаЖурнала, 1);
312+
Если СимволИзменений = "A" или СимволИзменений = "M" Тогда
313+
ИмяФайла = СокрЛП(Сред(СтрокаЖурнала, 2));
314+
МассивИмен.Добавить(ИмяФайла);
315+
КонецЕсли;
316+
КонецЦикла;
317+
Возврат МассивИмен;
318+
КонецФункции
319+
320+
Процедура ДобавитьИсходникиВГит(Знач СписокНовыхКаталогов)
321+
322+
Перем КодВозврата;
323+
324+
Для Каждого Каталог Из СписокНовыхКаталогов Цикл
325+
326+
Лог.Отладка("Запуск git add для каталога " + Каталог);
327+
Вывод = ПолучитьВыводПроцесса("git add --all " + Каталог, КодВозврата);
328+
Лог.Отладка("Вывод git add: " + Вывод);
329+
Если КодВозврата <> 0 Тогда
330+
Лог.Ошибка(Вывод);
331+
ЗавершитьРаботу(КодВозврата);
332+
КонецЕсли;
333+
334+
КонецЦикла
335+
336+
КонецПроцедуры
337+
182338
Инициализация();
183339

184340
Если ЗапускВКоманднойСтроке() Тогда

0 commit comments

Comments
 (0)