Skip to content

Commit 4da6750

Browse files
committed
Merge branch 'feature/oscript-port-30' into develop
2 parents 1ffe436 + 4476eb2 commit 4da6750

File tree

2 files changed

+301
-0
lines changed

2 files changed

+301
-0
lines changed

tests/v8files-extractor-test.os

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
#Использовать tempfiles
2+
#Использовать asserts
3+
4+
Перем юТест;
5+
6+
Процедура Инициализация()
7+
8+
КонецПроцедуры
9+
10+
Функция ПолучитьСписокТестов(Знач Контекст) Экспорт
11+
12+
юТест = Контекст;
13+
14+
ВсеТесты = Новый Массив;
15+
16+
ВсеТесты.Добавить("Тест_ДолженРазложитьФайлОбработкиИзЗаданнойПапки");
17+
ВсеТесты.Добавить("Тест_ДолженРазложитьКаталог");
18+
19+
Возврат ВсеТесты;
20+
21+
КонецФункции
22+
23+
Процедура ПослеЗапускаТеста() Экспорт
24+
ВременныеФайлы.Удалить();
25+
КонецПроцедуры
26+
27+
Функция ЗагрузитьИсполнителя()
28+
29+
ИмяКаталога = ТекущийСценарий().Каталог;
30+
Исполнитель = ЗагрузитьСценарий(ОбъединитьПути(ИмяКаталога,"../v8files-extractor.os"));
31+
Лог = Логирование.ПолучитьЛог("oscript.app.v8files-extractor");
32+
Лог.УстановитьУровень(УровниЛога.Отладка);
33+
34+
Возврат Исполнитель;
35+
36+
КонецФункции
37+
38+
Функция ПолучитьФайлТестовойОбработки()
39+
40+
ИмяКаталога = ТекущийСценарий().Каталог;
41+
ИмяФайла = "Fixture";
42+
ИмяФайлаСРасширением = ИмяФайла+".epf";
43+
44+
ПутьФайла = ОбъединитьПути(ИмяКаталога, ИмяФайлаСРасширением);
45+
ФайлОбработки = Новый Файл(ПутьФайла);
46+
Ожидаем.Что(ФайлОбработки.Существует(), "Исходный файл должен существовать").ЭтоИстина();
47+
48+
Возврат ФайлОбработки;
49+
50+
КонецФункции
51+
52+
Процедура Тест_ДолженРазложитьФайлОбработкиИзЗаданнойПапки() Экспорт
53+
54+
ФайлОбработки = ПолучитьФайлТестовойОбработки();
55+
56+
КаталогВыгрузки = ВременныеФайлы.СоздатьКаталог();
57+
58+
Исполнитель = ЗагрузитьИсполнителя();
59+
Исполнитель.РазобратьФайл(ФайлОбработки.ПолноеИмя, КаталогВыгрузки);
60+
61+
КаталогИсходников = Новый Файл(ОбъединитьПути(КаталогВыгрузки, ФайлОбработки.ИмяБезРасширения));
62+
Ожидаем.Что(КаталогИсходников.Существует()).ЭтоИстина();
63+
Ожидаем.Что(КаталогИсходников.ЭтоКаталог(), "Должны были найти каталог с именем обработки").ЭтоИстина();
64+
Ожидаем.Что(КаталогСодержитИсходникиОбработки(КаталогИсходников.ПолноеИмя)).ЭтоИстина();
65+
КонецПроцедуры
66+
67+
Процедура Тест_ДолженРазложитьКаталог() Экспорт
68+
69+
ФайлОбработки = ПолучитьФайлТестовойОбработки();
70+
71+
ИмяВложенногоКаталога = "1";
72+
73+
КаталогИсходников = ВременныеФайлы.СоздатьКаталог();
74+
СоздатьКаталог(ОбъединитьПути(КаталогИсходников, ИмяВложенногоКаталога));
75+
76+
КопироватьФайл(ФайлОбработки.ПолноеИмя, ОбъединитьПути(КаталогИсходников, ИмяВложенногоКаталога, ФайлОбработки.Имя));
77+
78+
КаталогВыгрузки = ВременныеФайлы.СоздатьКаталог();
79+
80+
Исполнитель = ЗагрузитьИсполнителя();
81+
Исполнитель.РазобратьКаталог(КаталогИсходников, КаталогВыгрузки);
82+
83+
ВложенныйКаталогВыгрузки = ОбъединитьПути(КаталогВыгрузки, ИмяВложенногоКаталога);
84+
ФайлВложенныйКаталогИсходников = Новый Файл(ВложенныйКаталогВыгрузки);
85+
Ожидаем.Что(ФайлВложенныйКаталогИсходников.Существует(), "Должны были найти имя вложенного каталога").ЭтоИстина();
86+
Ожидаем.Что(ФайлВложенныйКаталогИсходников.ЭтоКаталог(), "Должны были найти вложенный каталог").ЭтоИстина();
87+
88+
ПутьКаталогаВыгрузкиДляОбработки = ОбъединитьПути(ВложенныйКаталогВыгрузки, ФайлОбработки.ИмяБезРасширения);
89+
Ожидаем.Что(КаталогСодержитИсходникиОбработки(ПутьКаталогаВыгрузкиДляОбработки)).ЭтоИстина();
90+
91+
КонецПроцедуры
92+
93+
Функция КаталогСодержитИсходникиОбработки(Знач Каталог)
94+
ВыгруженныеФайлы = НайтиФайлы(Каталог, ПолучитьМаскуВсеФайлы());
95+
ИменаВыгруженныхФайлов = РазвернутьМассивФайловВИменаФайлов(ВыгруженныеФайлы);
96+
Ожидаем.Что(ИменаВыгруженныхФайлов, "Должны были найти выгруженный файл").Содержит("renames.txt");
97+
Ожидаем.Что(ИменаВыгруженныхФайлов, "Должны были найти выгруженный файл").Содержит("Form");
98+
Ожидаем.Что(ИменаВыгруженныхФайлов, "Должны были найти выгруженный файл").Содержит("Макеты");
99+
Ожидаем.Что(ИменаВыгруженныхФайлов, "Должны были найти выгруженный файл").Содержит("und");
100+
КонецФункции
101+
102+
Функция РазвернутьМассивФайловВИменаФайлов(Знач МассивОбъектовФайл)
103+
104+
ИменаФайлов = Новый Массив;
105+
Для Каждого Файл Из МассивОбъектовФайл Цикл
106+
ИменаФайлов.Добавить(Файл.Имя);
107+
КонецЦикла;
108+
109+
Возврат ИменаФайлов;
110+
111+
КонецФункции
112+
113+
Инициализация();

v8files-extractor.os

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
#Использовать cmdline
2+
#Использовать logos
3+
#Использовать tempfiles
4+
#Использовать asserts
5+
#Использовать v8runner
6+
7+
Перем Лог;
8+
Перем КодВозврата;
9+
10+
Функция ЗапускВКоманднойСтроке()
11+
12+
КодВозврата = 0;
13+
14+
Если ТекущийСценарий().Источник <> СтартовыйСценарий().Источник Тогда
15+
Возврат Ложь;
16+
КонецЕсли;
17+
18+
Попытка
19+
20+
Парсер = Новый ПарсерАргументовКоманднойСтроки();
21+
22+
ВозможныеКоманды = Новый Структура;
23+
ВозможныеКоманды.Вставить("Декомпилировать", "--decompile");
24+
ВозможныеКоманды.Вставить("Помощь", "--help");
25+
26+
ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды.Декомпилировать);
27+
Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьВходящихДанных");
28+
Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ВыходнойКаталог");
29+
Парсер.ДобавитьКоманду(ОписаниеКоманды);
30+
31+
ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды.Помощь);
32+
Парсер.ДобавитьКоманду(ОписаниеКоманды);
33+
34+
Аргументы = Парсер.РазобратьКоманду(АргументыКоманднойСтроки);
35+
36+
Команда = Аргументы.Команда;
37+
Лог.Отладка("Передана команда: "+Команда);
38+
Для Каждого Параметр Из Аргументы.ЗначенияПараметров Цикл
39+
Лог.Отладка(Параметр.Ключ + " = " + Параметр.Значение);
40+
КонецЦикла;
41+
42+
Если Команда = ВозможныеКоманды.Декомпилировать Тогда
43+
Декомпилировать(Аргументы.ЗначенияПараметров["ПутьВходящихДанных"], Аргументы.ЗначенияПараметров["ВыходнойКаталог"]);
44+
ИначеЕсли Команда = ВозможныеКоманды.Помощь Тогда
45+
ВывестиСправку();
46+
КонецЕсли;
47+
48+
Исключение
49+
Лог.Ошибка(ОписаниеОшибки());
50+
КодВозврата = 1;
51+
КонецПопытки;
52+
53+
Возврат Истина;
54+
55+
КонецФункции
56+
57+
Процедура Инициализация()
58+
Лог = Логирование.ПолучитьЛог("oscript.app.v8files-extractor");
59+
Лог.УстановитьУровень(УровниЛога.Отладка);
60+
КонецПроцедуры
61+
62+
Процедура Декомпилировать(Знач Путь, Знач КаталогВыгрузки) Экспорт
63+
Файл = Новый Файл(Путь);
64+
Если Файл.ЭтоКаталог() Тогда
65+
РазобратьКаталог(Файл.ПолноеИмя, КаталогВыгрузки);
66+
Иначе
67+
РазобратьФайл(Файл.ПолноеИмя, КаталогВыгрузки);
68+
КонецЕсли;
69+
КонецПроцедуры
70+
71+
Процедура ВывестиСправку()
72+
Сообщить("Утилита сборки/разборки внешних файлов 1С");
73+
Сообщить(" ");
74+
Сообщить("Параметры командной строки:");
75+
Сообщить(" --decompile inputPath outputPath");
76+
Сообщить(" Разбор файлов на исходники");
77+
78+
Сообщить(" --help");
79+
Сообщить(" Показ этого экрана");
80+
КонецПроцедуры
81+
82+
Процедура РазобратьКаталог(Знач ПутьКаталога, Знач КаталогВыгрузки) Экспорт
83+
Лог.Информация("Подготовка выгрузки каталога "+ПутьКаталога+" в каталог " + КаталогВыгрузки);
84+
РазобратьКаталогВнутр(ПутьКаталога, КаталогВыгрузки);
85+
Лог.Информация("Завершена выгрузки каталога "+ПутьКаталога+" в каталог " + КаталогВыгрузки);
86+
КонецПроцедуры
87+
88+
Процедура РазобратьФайл(Знач ПутьФайла, Знач КаталогВыгрузки) Экспорт
89+
Лог.Информация("Подготовка выгрузки файла "+ПутьФайла+" в каталог " + КаталогВыгрузки);
90+
91+
РазобратьФайлВнутр(ПутьФайла, КаталогВыгрузки);
92+
93+
Лог.Информация("Завершена выгрузка файла "+ПутьФайла+" в каталог " + КаталогВыгрузки);
94+
КонецПроцедуры
95+
96+
Процедура РазобратьКаталогВнутр(Знач ПутьКаталога, Знач КаталогВыгрузки)
97+
ОбъектКаталога = Новый Файл(ПутьКаталога);
98+
ИмяКаталогаВыгрузки = Новый Файл(КаталогВыгрузки).Имя;
99+
Лог.Информация("Вошел в каталог "+ОбъектКаталога.Имя);
100+
101+
Файлы = НайтиФайлы(ПутьКаталога, ПолучитьМаскуВсеФайлы());
102+
Для Каждого Файл из Файлы Цикл
103+
Если Файл.ЭтоКаталог() Тогда
104+
РазобратьКаталогВнутр(Файл.ПолноеИмя, ОбъединитьПути(КаталогВыгрузки, Файл.Имя));
105+
ИначеЕсли ТипФайлаПоддерживается(Файл) Тогда
106+
Лог.Информация("Подготовка выгрузки файла "+Файл.Имя+" в каталог " + ИмяКаталогаВыгрузки);
107+
РазобратьФайлВнутр(Файл.ПолноеИмя, КаталогВыгрузки);
108+
Лог.Информация("Завершена выгрузка файла "+Файл.Имя+" в каталог " + ИмяКаталогаВыгрузки);
109+
КонецЕсли;
110+
КонецЦикла;
111+
112+
Лог.Информация("Вышел из каталога "+ОбъектКаталога.Имя);
113+
КонецПроцедуры
114+
115+
Функция ТипФайлаПоддерживается(Файл)
116+
Возврат Найти(".epf,.erf,", Файл.Расширение+",") > 0;
117+
КонецФункции
118+
119+
Процедура РазобратьФайлВнутр(Знач ПутьФайла, Знач КаталогВыгрузки)
120+
121+
Файл = Новый Файл(ПутьФайла);
122+
Если Не ТипФайлаПоддерживается(Файл) Тогда
123+
ВызватьИсключение "Тип файла """+Файл.Расширение+""" не поддерживается";
124+
КонецЕсли;
125+
126+
Ожидаем.Что(Файл.Существует(), "Файл " + ПутьФайла + " должен существовать").ЭтоИстина();
127+
128+
ПапкаИсходников = Новый Файл(ОбъединитьПути(КаталогВыгрузки, Файл.ИмяБезРасширения));
129+
ОбеспечитьПустойКаталог(ПапкаИсходников);
130+
ЗапуститьРаспаковку(Файл, ПапкаИсходников);
131+
132+
КонецПроцедуры
133+
134+
Процедура ЗапуститьРаспаковку(Знач Файл, Знач ПапкаИсходников)
135+
136+
Лог.Отладка("Запускаем распаковку файла");
137+
138+
Конфигуратор = Новый УправлениеКонфигуратором();
139+
КаталогВременнойИБ = ВременныеФайлы.СоздатьКаталог();
140+
Конфигуратор.КаталогСборки(КаталогВременнойИБ);
141+
142+
ЛогКонфигуратора = Логирование.ПолучитьЛог("oscript.lib.v8runner");
143+
ЛогКонфигуратора.УстановитьУровень(Лог.Уровень());
144+
145+
Параметры = Конфигуратор.ПолучитьПараметрыЗапуска();
146+
Параметры[0] = "ENTERPRISE";
147+
148+
ПутьV8Reader = ОбъединитьПути(ТекущийСценарий().Каталог, "v8Reader", "V8Reader.epf");
149+
Лог.Отладка("Путь к V8Reader: " + ПутьV8Reader);
150+
Ожидаем.Что(Новый Файл(ПутьV8Reader).Существует()).ЭтоИстина();
151+
152+
КоманднаяСтрокаV8Reader = СтрЗаменить("/C""decompile;pathtocf;%1;pathout;%2;ЗавершитьРаботуПосле;""","%1", Файл.ПолноеИмя);
153+
КоманднаяСтрокаV8Reader = СтрЗаменить(КоманднаяСтрокаV8Reader,"%2", ПапкаИсходников.ПолноеИмя);
154+
155+
Лог.Отладка("Командная строка V8Reader: " + КоманднаяСтрокаV8Reader);
156+
157+
Параметры.Добавить("/RunModeOrdinaryApplication");
158+
Параметры.Добавить("/Execute """ + ПутьV8Reader + """");
159+
Параметры.Добавить(КоманднаяСтрокаV8Reader);
160+
161+
Конфигуратор.ВыполнитьКоманду(Параметры);
162+
Лог.Отладка("Вывод 1С:Предприятия - " + Конфигуратор.ВыводКоманды());
163+
Лог.Отладка("Очищаем каталог временной ИБ");
164+
ВременныеФайлы.УдалитьФайл(КаталогВременнойИБ);
165+
166+
КонецПроцедуры
167+
168+
Процедура ОбеспечитьПустойКаталог(Знач ФайлОбъектКаталога)
169+
170+
Если Не ФайлОбъектКаталога.Существует() Тогда
171+
Лог.Отладка("Создаем новый каталог " + ФайлОбъектКаталога.ПолноеИмя);
172+
СоздатьКаталог(ФайлОбъектКаталога.ПолноеИмя);
173+
ИначеЕсли ФайлОбъектКаталога.ЭтоКаталог() Тогда
174+
Лог.Отладка("Очищаем каталог " + ФайлОбъектКаталога.ПолноеИмя);
175+
УдалитьФайлы(ФайлОбъектКаталога.ПолноеИмя, ПолучитьМаскуВсеФайлы());
176+
Иначе
177+
ВызватьИсключение "Путь " + ФайлОбъектКаталога.ПолноеИмя + " не является каталогом. Выгрузка невозможна";
178+
КонецЕсли;
179+
180+
КонецПроцедуры
181+
182+
Инициализация();
183+
184+
Если ЗапускВКоманднойСтроке() Тогда
185+
ЗавершитьРаботу(КодВозврата);
186+
КонецЕсли;
187+
188+

0 commit comments

Comments
 (0)