-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathunpack.os
362 lines (257 loc) · 18.1 KB
/
unpack.os
1
2
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
31
32
33
34
35
36
37
38
39
40
41
42
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
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
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
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
#Использовать gitrunner
#Использовать v8unpack
#Использовать fs
#Использовать v8runner
Функция Версия() Экспорт
Перем Версия;
Версия = "0.0.4";
Возврат "v" + Версия;
КонецФункции
Функция ПолноеИмяФайлаБезРасширения(Знач Файл)
Возврат ОбъединитьПути(Файл.Путь, Файл.ИмяБезРасширения);
КонецФункции
Функция ИмяФайлаБезЗапрещенныхСимволов(Знач Стр)
Перем ЗапрещенныйСимвол, ЗапрещенныеСимволы;
ЗапрещенныеСимволы = Новый Массив;
ЗапрещенныеСимволы.Добавить("<");
ЗапрещенныеСимволы.Добавить(">");
ЗапрещенныеСимволы.Добавить("""");
ЗапрещенныеСимволы.Добавить("|");
ЗапрещенныеСимволы.Добавить("*");
ЗапрещенныеСимволы.Добавить("\");
ЗапрещенныеСимволы.Добавить("/");
ЗапрещенныеСимволы.Добавить(":");
ЗапрещенныеСимволы.Добавить("?");
Для Каждого ЗапрещенныйСимвол Из ЗапрещенныеСимволы Цикл
Стр = СтрЗаменить(Стр, ЗапрещенныйСимвол, "");
КонецЦикла;
Возврат Стр;
КонецФункции
Функция СтрокаВМассив(Знач Строка, Знач Разделитель = " ")
Возврат СтрРазделить(Строка, Разделитель);
КонецФункции
Функция ОбернутьВКавычки(Знач Строка)
Возврат СтрШаблон("""%1""", Строка);
КонецФункции
Функция УбратьИзКоммита(Знач Путь, Знач ГитРепо)
Перем ПараметрыКоманды;
ПараметрыКоманды = СтрокаВМассив("rm --cached");
ПараметрыКоманды.Добавить(ОбернутьВКавычки(Путь));
Возврат ВыводКомандыГит(ГитРепо, ПараметрыКоманды);
КонецФункции
Функция ДобавитьВКоммит(Знач Путь, Знач ГитРепо)
Перем ПараметрыКоманды;
ПараметрыКоманды = СтрокаВМассив("add --all");
ПараметрыКоманды.Добавить(ОбернутьВКавычки(Путь));
Возврат ВыводКомандыГит(ГитРепо, ПараметрыКоманды);
КонецФункции
Функция ВыводКомандыГит(Знач ГитРепо, Знач ПараметрыКоманды)
ГитРепо.ВыполнитьКоманду(ПараметрыКоманды);
Возврат ГитРепо.ПолучитьВыводКоманды();
КонецФункции
Функция ЖурналИзмененийГит(Знач ГитРепо, Знач Фильтр = "")
Перем Журнал, Вывод, СтрокаВывода;
Журнал = Новый Массив;
Вывод = ВыводКомандыГит(ГитРепо, СтрокаВМассив("diff-index --name-only --ignore-submodules --cached HEAD " + Фильтр));
Для Каждого СтрокаВывода Из СтрРазделить(Вывод, Символы.ПС) Цикл
Если ЗначениеЗаполнено(СтрокаВывода) Тогда
Журнал.Добавить(СокрЛП(СтрокаВывода));
КонецЕсли;
КонецЦикла;
Возврат Журнал;
КонецФункции
Функция РазобратьОбычнуюФорму(Знач ИмяФайла, Знач ГитРепо)
Перем Файл, Куда, Распаковщик, СтароеИмяФайла, НовоеИмяФайла;
Файл = Новый Файл(ИмяФайла);
Куда = ОбъединитьПути(Файл.Путь, "Form");
Если Не Файл.Существует() Тогда // удалили ОФ, надо вычистить ее файлы
ПопытатьсяУдалитьФайлы(ОбъединитьПути(Куда, "form")); // удаляем файл с данными формы
Если Не ФС.ФайлСуществует(ОбъединитьПути(Файл.Путь, "Form.xml")) Тогда // нет УФ с тем же именем
ПопытатьсяУдалитьФайлы(ОбъединитьПути(Куда, "Module.bsl")); // удаляем модуль формы
КонецЕсли;
Возврат ?(ФС.Существует(Куда), ДобавитьВКоммит(Куда, ГитРепо), Ложь);
КонецЕсли;
ФС.ОбеспечитьПустойКаталог(Куда);
Сообщить("Разбираем ОФ " + Файл.ПолноеИмя);
Распаковщик = Новый ЧтениеФайла8(Файл.ПолноеИмя);
Распаковщик.ИзвлечьВсе(Куда, Истина);
ОсвободитьОбъект(Распаковщик);
Распаковщик = Неопределено;
ВыполнитьСборкуМусора();
Если Настройки().ПереименовыватьМодулиОФ Тогда
Для Каждого ФайлМодуля Из НайтиФайлы(Куда, "module", Истина) Цикл
СтароеИмяФайла = ФайлМодуля.ПолноеИмя;
НовоеИмяФайла = ОбъединитьПути(ФайлМодуля.Путь, "Module.bsl");
ПереместитьФайл(СтароеИмяФайла, НовоеИмяФайла);
КонецЦикла;
КонецЕсли;
Возврат ДобавитьВКоммит(Куда, ГитРепо);
КонецФункции
Функция ПопытатьсяУдалитьФайлы(Знач Путь, Знач Маска = Неопределено)
Попытка
УдалитьФайлы(Путь, Маска);
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Функция ЭтоВнешняяОбработкаИлиОтчет(Знач Файл)
Перем Расширение;
Расширение = НРег(Файл.Расширение);
Возврат Расширение = ".epf" ИЛИ Расширение = ".erf";
КонецФункции
Функция ЭтоРасширение(Знач Файл)
Возврат НРег(Файл.Расширение) = ".cfe";
КонецФункции
Функция КаталогИсходниковФайла(Знач Файл)
Возврат ОбъединитьПути(ТекущийКаталог(), Настройки().КудаРазбирать, ПолноеИмяФайлаБезРасширения(Файл));
КонецФункции
Функция РазобратьКонфигуратором(Знач ИмяФайла, Знач ГитРепо, Знач Конфигуратор)
Перем Файл, Куда, Тип;
Файл = Новый Файл(ИмяФайла);
Куда = КаталогИсходниковФайла(Файл);
ФС.ОбеспечитьПустойКаталог(Куда);
Если Не Файл.Существует() Тогда
Возврат ДобавитьВКоммит(Куда, ГитРепо);
КонецЕсли;
Если ЭтоРасширение(Файл) Тогда
Сообщить("Разбираем расширение " + Файл.ПолноеИмя);
Тип = "Расширение";
ИначеЕсли ЭтоВнешняяОбработкаИлиОтчет(Файл) Тогда
Сообщить("Разбираем внешнюю обработку/отчет " + Файл.ПолноеИмя);
Тип = "ВнешняяОбработка";
Иначе
ВызватьИсключение СтрШаблон("Не умею разбирать файлы вида %1!", ИмяФайла);
КонецЕсли;
Разобрать(Файл, Тип, Куда, Конфигуратор);
Если НайтиФайлы(Куда, "*").Количество() = 0 Тогда
ВызватьИсключение СтрШаблон("Не удалось разобрать %1", Файл.ПолноеИмя);
КонецЕсли;
Если Не Настройки().КоммититьБинарникиОбработокИРасширений Тогда
УбратьИзКоммита(Файл.ПолноеИмя, ГитРепо);
КонецЕсли;
Возврат ДобавитьВКоммит(Куда, ГитРепо);
КонецФункции
Функция Разобрать(Знач Файл, Знач Тип, Знач Куда, Знач Конфигуратор)
Перем МаксимумПопыток, Разобрали, Попыток, ИмяРасширения;
МаксимумПопыток = Настройки().КоличествоПопыток;
Разобрали = Ложь;
Попыток = 0;
Пока Разобрали = Ложь И Попыток < МаксимумПопыток Цикл
Попытка
Если Тип = "Расширение" Тогда
ИмяРасширения = ИмяФайлаБезЗапрещенныхСимволов(Файл.ИмяБезРасширения);
Конфигуратор.ЗагрузитьРасширениеИзФайла(Файл.ПолноеИмя, ИмяРасширения);
Конфигуратор.ВыгрузитьРасширениеВФайлы(Куда, ИмяРасширения);
ИначеЕсли Тип = "ВнешняяОбработка" Тогда
Конфигуратор.ВыгрузитьВнешниеОтчетыИлиОбработкиВФайлы(Куда, Файл.ПолноеИмя);
Иначе
ВызватьИсключение СтрШаблон("Неизвестный тип файла для разборки: %1!", Тип);
КонецЕсли;
Разобрали = Истина;
Исключение
Попыток = Попыток + 1;
Сообщить(СтрШаблон("Попытка %1: %2", Попыток, ОписаниеОшибки()));
КонецПопытки;
КонецЦикла;
Возврат Разобрали;
КонецФункции
Функция РазобратьВнешние(Знач ГитРепо, Знач Конфигуратор)
Перем Фильтр, ИзмененияКоммита, ИзмененныйФайл;
Сообщить("Разборка измененных обработок/отчетов/расширений...");
Фильтр = "*[Ee][PpRr][Ff] *[Cc][Ff][Ee]";
ИзмененияКоммита = ЖурналИзмененийГит(ГитРепо, Фильтр);
Для Каждого ИзмененныйФайл Из ИзмененияКоммита Цикл
РазобратьКонфигуратором(ИзмененныйФайл, ГитРепо, Конфигуратор);
КонецЦикла;
Возврат 0;
КонецФункции
Функция РазобратьОбычныеФормы(Знач ГитРепо)
Перем Фильтр, ИзмененияКоммита, ИзмененныйФайл;
Сообщить("Разборка обычных форм...");
Фильтр = "*[Ff][Oo][Rr][Mm].[Bb][Ii][Nn]";
ИзмененияКоммита = ЖурналИзмененийГит(ГитРепо, Фильтр);
Для Каждого ИзмененныйФайл Из ИзмененияКоммита Цикл
РазобратьОбычнуюФорму(ИзмененныйФайл, ГитРепо);
КонецЦикла;
Возврат 0;
КонецФункции
Функция РазобратьИзмененияКоммита()
Перем ГитРепо, Конфигуратор;
ГитРепо = Новый ГитРепозиторий();
ГитРепо.УстановитьРабочийКаталог(ТекущийКаталог());
Конфигуратор = КонфигураторБазы();
РазобратьВнешние(ГитРепо, Конфигуратор);
РазобратьОбычныеФормы(ГитРепо);
Сообщить("Успешно завершено.");
Возврат 0;
КонецФункции
Функция КонфигураторБазы()
Перем Конфигуратор, КаталогСборки, ВерсияПлатформы, СтрокаСоединения, Пользователь, Пароль;
Конфигуратор = Новый УправлениеКонфигуратором();
КаталогСборки = ПолучитьИмяВременногоФайла();
ФС.ОбеспечитьПустойКаталог(КаталогСборки);
Конфигуратор.КаталогСборки(КаталогСборки);
Настройки().Свойство("ВерсияПлатформы", ВерсияПлатформы);
Если ЗначениеЗаполнено(ВерсияПлатформы) Тогда
Конфигуратор.ИспользоватьВерсиюПлатформы(ВерсияПлатформы);
КонецЕсли;
Настройки().Свойство("СтрокаСоединения", СтрокаСоединения);
Настройки().Свойство("Пользователь", Пользователь);
Настройки().Свойство("Пароль", Пароль);
Если ЗначениеЗаполнено(СтрокаСоединения) Тогда
Если ЭтоСтрокаСоединенияСФайловойБазой(СтрокаСоединения) Тогда
Конфигуратор.УстановитьКонтекст("/F""" + КаталогФайловойБазы(СтрокаСоединения) + """", Пользователь, Пароль);
ИначеЕсли ЭтоСтрокаСоединенияССервернойБазой(СтрокаСоединения) Тогда
Конфигуратор.УстановитьКонтекст("/IBConnectionString " + СтрокаСоединения, Пользователь, Пароль);
Иначе
ВызватьИсключение "Не смог определить тип строки соединения с базой!";
КонецЕсли;
КонецЕсли;
Возврат Конфигуратор;
КонецФункции
Функция КаталогФайловойБазы(Знач СтрокаСоединения) Экспорт
Перем НачалоСтрокиСоединения, ДлинаНачала;
СтрокаСоединения = СокрЛП(СтрокаСоединения);
НачалоСтрокиСоединения = НачалоСтрокиСоединенияСФайловойБазой();
ДлинаНачала = СтрДлина(НачалоСтрокиСоединения);
// убираем из строки вида File="С:\Путь\к\базе"; начало, обрамляющие кавычки и конечную ;
Возврат Сред(СтрокаСоединения, ДлинаНачала + 2, СтрДлина(СтрокаСоединения) - ДлинаНачала - 3);
КонецФункции
Функция ЭтоСтрокаСоединенияСФайловойБазой(Знач СтрокаСоединения) Экспорт
Возврат ЭтоСтрокаСоединения(СтрокаСоединения, НачалоСтрокиСоединенияСФайловойБазой());
КонецФункции
Функция ЭтоСтрокаСоединенияССервернойБазой(Знач СтрокаСоединения) Экспорт
Возврат ЭтоСтрокаСоединения(СтрокаСоединения, НачалоСтрокиСоединенияССервернойБазой());
КонецФункции
Функция ЭтоСтрокаСоединения(Знач СтрокаСоединения, Знач НачалоСтроки) Экспорт
Перем ДлинаНачала;
ДлинаНачала = СтрДлина(НачалоСтроки);
Возврат Нрег(Лев(СтрокаСоединения, ДлинаНачала)) = НРег(НачалоСтроки);
КонецФункции
Функция НачалоСтрокиСоединенияСФайловойБазой()
Возврат "File=";
КонецФункции
Функция НачалоСтрокиСоединенияССервернойБазой()
Возврат "Srvr=";
КонецФункции
Функция Настройки()
Перем Настройки;
Настройки = Новый Структура();
Настройки.Вставить("ВерсияПлатформы", "8.3.10");
Настройки.Вставить("КудаРазбирать", "src");
Настройки.Вставить("РазбиратьОФ", Истина);
Настройки.Вставить("ПереименовыватьМодулиОФ", Истина);
Настройки.Вставить("КоммититьБинарникиОбработокИРасширений", Истина);
Настройки.Вставить("КоличествоПопыток", 5);
// строка соединения базы, в которой необходимо производить разбор.
// копируем и вставляем прямо из стартера 1с, только кавычки надо задвоить.
// если не указана - разбор производится во временной файловой базе
Настройки.Вставить("СтрокаСоединения", "");
// пользователь и пароль базы для разбора.
// если в базе включена доменная авторизация - оставляем пустыми
Настройки.Вставить("Пользователь", "");
Настройки.Вставить("Пароль", "");
Возврат Настройки;
КонецФункции
РазобратьИзмененияКоммита();