Skip to content

Commit 0479491

Browse files
committed
Продолжение работ #32
1 parent 68ac49f commit 0479491

File tree

2 files changed

+196
-45
lines changed

2 files changed

+196
-45
lines changed

tests/v8files-extractor-test.os

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@
101101
// ЗаписьТекста.ЗаписатьСтроку("M " + "pref-" + ФайлОбработки.Имя);
102102
// ЗаписьТекста.Закрыть();
103103
ЖурналИзмененийГит = "A " + ФайлОбработки.Имя+"
104-
|M " + "pref-" + ФайлОбработки.Имя;
104+
| M " + "pref-" + ФайлОбработки.Имя;
105105

106106
Исполнитель = ЗагрузитьИсполнителя();
107107
МассивИмен = Исполнитель.ПолучитьИменаИзЖурналаИзмененийГит(ЖурналИзмененийГит);
@@ -110,6 +110,14 @@
110110
Ожидаем.Что(МассивИмен, "Должны были найти измененный файл").Содержит("pref-" + ФайлОбработки.Имя);
111111
КонецПроцедуры
112112

113+
Процедура Тест_ДолженПроверитьРазборЭкранированнойКириллицы() Экспорт
114+
Строка = "ОТЛАДКА - Получен из журнала git файл ""src/Fixture/Form/\320\244\320\276\321\200\320\274\320\260/form""";
115+
Строка = "ОТЛАДКА - Получен из журнала git файл ""src/Fixture/Form/Форма/form""";
116+
Исполнитель = ЗагрузитьИсполнителя();
117+
Результат = Исполнитель.ДекодироватьЭкранированнуюКириллицу(Строка);
118+
Ожидаем.Что(Результат).Равен(
119+
КонецПроцедуры
120+
113121
Функция КаталогСодержитИсходникиОбработки(Знач Каталог)
114122
ВыгруженныеФайлы = НайтиФайлы(Каталог, ПолучитьМаскуВсеФайлы());
115123
ИменаВыгруженныхФайлов = РазвернутьМассивФайловВИменаФайлов(ВыгруженныеФайлы);

v8files-extractor.os

Lines changed: 187 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,20 @@
77

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

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

@@ -20,17 +34,9 @@
2034

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

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

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

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

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

4957
Исключение
@@ -55,11 +63,35 @@
5563

5664
КонецФункции
5765

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

91+
92+
/////////////////////////////////////////////////////////////////////////////
93+
// РЕАЛИЗАЦИЯ КОМАНД
94+
6395
Процедура Декомпилировать(Знач Путь, Знач КаталогВыгрузки) Экспорт
6496
Файл = Новый Файл(Путь);
6597
Если Файл.ЭтоКаталог() Тогда
@@ -69,45 +101,22 @@
69101
КонецЕсли;
70102
КонецПроцедуры
71103

72-
Процедура ВывестиСправку()
73-
Сообщить("Утилита сборки/разборки внешних файлов 1С");
74-
Сообщить(" ");
75-
Сообщить("Параметры командной строки:");
76-
Сообщить(" --decompile inputPath outputPath");
77-
Сообщить(" Разбор файлов на исходники");
78-
79-
Сообщить(" --help");
80-
Сообщить(" Показ этого экрана");
81-
КонецПроцедуры
82-
83-
Функция ПолучитьИменаИзЖурналаИзмененийГит(Знач ЖурналИзмененийГит) Экспорт
84-
МассивИмен = Новый Массив;
85-
МассивСтрокЖурнала = СтроковыеФункции.РазложитьСтрокуВМассивПодстрок(ЖурналИзмененийГит, Символы.ПС);
86-
Лог.Отладка("ЖурналИзмененийГит:");
87-
Для Каждого СтрокаЖурнала Из МассивСтрокЖурнала Цикл
88-
Лог.Отладка(" "+СтрокаЖурнала);
89-
СимволИзменений = Лев(СтрокаЖурнала, 1);
90-
Если СимволИзменений = "A" или СимволИзменений = "M" Тогда
91-
ИмяФайла = СокрЛП(Сред(СтрокаЖурнала, 2));
92-
МассивИмен.Добавить(ИмяФайла);
93-
КонецЕсли;
94-
КонецЦикла;
95-
Возврат МассивИмен;
96-
КонецФункции
97-
98104
Процедура РазобратьКаталог(Знач ПутьКаталога, Знач КаталогВыгрузки) Экспорт
99105
Лог.Информация("Подготовка выгрузки каталога "+ПутьКаталога+" в каталог " + КаталогВыгрузки);
100106
РазобратьКаталогВнутр(ПутьКаталога, КаталогВыгрузки);
101107
Лог.Информация("Завершена выгрузки каталога "+ПутьКаталога+" в каталог " + КаталогВыгрузки);
102108
КонецПроцедуры
103109

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

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

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

112121
Процедура РазобратьКаталогВнутр(Знач ПутьКаталога, Знач КаталогВыгрузки)
113122
ОбъектКаталога = Новый Файл(ПутьКаталога);
@@ -132,7 +141,7 @@
132141
Возврат Найти(".epf,.erf,", Файл.Расширение+",") > 0;
133142
КонецФункции
134143

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

137146
Файл = Новый Файл(ПутьФайла);
138147
Если Не ТипФайлаПоддерживается(Файл) Тогда
@@ -145,7 +154,9 @@
145154
ОбеспечитьПустойКаталог(ПапкаИсходников);
146155
ЗапуститьРаспаковку(Файл, ПапкаИсходников);
147156

148-
КонецПроцедуры
157+
Возврат ПапкаИсходников.ПолноеИмя;
158+
159+
КонецФункции
149160

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

@@ -195,6 +206,138 @@
195206

196207
КонецПроцедуры
197208

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

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

0 commit comments

Comments
 (0)