|
7 | 7 |
|
8 | 8 | Перем Лог; |
9 | 9 | Перем КодВозврата; |
| 10 | +Перем мВозможныеКоманды; |
| 11 | + |
| 12 | +Функция ВозможныеКоманды() |
| 13 | + |
| 14 | + Если мВозможныеКоманды = Неопределено Тогда |
| 15 | + мВозможныеКоманды = Новый Структура; |
| 16 | + мВозможныеКоманды.Вставить("Декомпилировать", "--decompile"); |
| 17 | + мВозможныеКоманды.Вставить("Помощь", "--help"); |
| 18 | + мВозможныеКоманды.Вставить("ОбработатьИзмененияИзГит", "--git-precommit"); |
| 19 | + КонецЕсли; |
| 20 | + |
| 21 | + Возврат мВозможныеКоманды; |
| 22 | + |
| 23 | +КонецФункции |
10 | 24 |
|
11 | 25 | Функция ЗапускВКоманднойСтроке() |
12 | 26 |
|
|
20 | 34 |
|
21 | 35 | Парсер = Новый ПарсерАргументовКоманднойСтроки(); |
22 | 36 |
|
23 | | - ВозможныеКоманды = Новый Структура; |
24 | | - ВозможныеКоманды.Вставить("Декомпилировать", "--decompile"); |
25 | | - ВозможныеКоманды.Вставить("Помощь", "--help"); |
26 | | - |
27 | | - ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды.Декомпилировать); |
28 | | - Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьВходящихДанных"); |
29 | | - Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ВыходнойКаталог"); |
30 | | - Парсер.ДобавитьКоманду(ОписаниеКоманды); |
31 | | - |
32 | | - ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды.Помощь); |
33 | | - Парсер.ДобавитьКоманду(ОписаниеКоманды); |
| 37 | + ДобавитьОписаниеКомандыДекомпилировать(Парсер); |
| 38 | + ДобавитьОписаниеКомандыПомощь(Парсер); |
| 39 | + ДобавитьОписаниеКомандыИзмененияПоЖурналуГит(Парсер); |
34 | 40 |
|
35 | 41 | Аргументы = Парсер.РазобратьКоманду(АргументыКоманднойСтроки); |
36 | 42 |
|
|
40 | 46 | Лог.Отладка(Параметр.Ключ + " = " + Параметр.Значение); |
41 | 47 | КонецЦикла; |
42 | 48 |
|
43 | | - Если Команда = ВозможныеКоманды.Декомпилировать Тогда |
| 49 | + Если Команда = ВозможныеКоманды().Декомпилировать Тогда |
44 | 50 | Декомпилировать(Аргументы.ЗначенияПараметров["ПутьВходящихДанных"], Аргументы.ЗначенияПараметров["ВыходнойКаталог"]); |
45 | | - ИначеЕсли Команда = ВозможныеКоманды.Помощь Тогда |
| 51 | + ИначеЕсли Команда = ВозможныеКоманды().Помощь Тогда |
46 | 52 | ВывестиСправку(); |
| 53 | + ИначеЕсли Команда = ВозможныеКоманды().ОбработатьИзмененияИзГит Тогда |
| 54 | + ОбработатьИзмененияИзГит(Аргументы.ЗначенияПараметров["ВыходнойКаталог"]); |
47 | 55 | КонецЕсли; |
48 | 56 |
|
49 | 57 | Исключение |
|
55 | 63 |
|
56 | 64 | КонецФункции |
57 | 65 |
|
| 66 | +Процедура ДобавитьОписаниеКомандыДекомпилировать(Знач Парсер) |
| 67 | + ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().Декомпилировать); |
| 68 | + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьВходящихДанных"); |
| 69 | + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ВыходнойКаталог"); |
| 70 | + Парсер.ДобавитьКоманду(ОписаниеКоманды); |
| 71 | +КонецПроцедуры |
| 72 | + |
| 73 | +Процедура ДобавитьОписаниеКомандыПомощь(Знач Парсер) |
| 74 | + ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().Помощь); |
| 75 | + Парсер.ДобавитьКоманду(ОписаниеКоманды); |
| 76 | +КонецПроцедуры |
| 77 | + |
| 78 | +Процедура ДобавитьОписаниеКомандыИзмененияПоЖурналуГит(Знач Парсер) |
| 79 | + |
| 80 | + ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().ОбработатьИзмененияИзГит); |
| 81 | + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ВыходнойКаталог"); |
| 82 | + Парсер.ДобавитьКоманду(ОписаниеКоманды); |
| 83 | + |
| 84 | +КонецПроцедуры |
| 85 | + |
58 | 86 | Процедура Инициализация() |
59 | 87 | Лог = Логирование.ПолучитьЛог("oscript.app.v8files-extractor"); |
60 | 88 | Лог.УстановитьУровень(УровниЛога.Отладка); |
61 | 89 | КонецПроцедуры |
62 | 90 |
|
| 91 | + |
| 92 | +///////////////////////////////////////////////////////////////////////////// |
| 93 | +// РЕАЛИЗАЦИЯ КОМАНД |
| 94 | + |
63 | 95 | Процедура Декомпилировать(Знач Путь, Знач КаталогВыгрузки) Экспорт |
64 | 96 | Файл = Новый Файл(Путь); |
65 | 97 | Если Файл.ЭтоКаталог() Тогда |
|
69 | 101 | КонецЕсли; |
70 | 102 | КонецПроцедуры |
71 | 103 |
|
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 | | - |
98 | 104 | Процедура РазобратьКаталог(Знач ПутьКаталога, Знач КаталогВыгрузки) Экспорт |
99 | 105 | Лог.Информация("Подготовка выгрузки каталога "+ПутьКаталога+" в каталог " + КаталогВыгрузки); |
100 | 106 | РазобратьКаталогВнутр(ПутьКаталога, КаталогВыгрузки); |
101 | 107 | Лог.Информация("Завершена выгрузки каталога "+ПутьКаталога+" в каталог " + КаталогВыгрузки); |
102 | 108 | КонецПроцедуры |
103 | 109 |
|
104 | | -Процедура РазобратьФайл(Знач ПутьФайла, Знач КаталогВыгрузки) Экспорт |
| 110 | +Функция РазобратьФайл(Знач ПутьФайла, Знач КаталогВыгрузки) Экспорт |
105 | 111 | Лог.Информация("Подготовка выгрузки файла "+ПутьФайла+" в каталог " + КаталогВыгрузки); |
106 | 112 |
|
107 | | - РазобратьФайлВнутр(ПутьФайла, КаталогВыгрузки); |
| 113 | + КаталогИсходников = РазобратьФайлВнутр(ПутьФайла, КаталогВыгрузки); |
108 | 114 |
|
109 | 115 | Лог.Информация("Завершена выгрузка файла "+ПутьФайла+" в каталог " + КаталогВыгрузки); |
110 | | -КонецПроцедуры |
| 116 | + |
| 117 | + Возврат КаталогИсходников; |
| 118 | + |
| 119 | +КонецФункции |
111 | 120 |
|
112 | 121 | Процедура РазобратьКаталогВнутр(Знач ПутьКаталога, Знач КаталогВыгрузки) |
113 | 122 | ОбъектКаталога = Новый Файл(ПутьКаталога); |
|
132 | 141 | Возврат Найти(".epf,.erf,", Файл.Расширение+",") > 0; |
133 | 142 | КонецФункции |
134 | 143 |
|
135 | | -Процедура РазобратьФайлВнутр(Знач ПутьФайла, Знач КаталогВыгрузки) |
| 144 | +Функция РазобратьФайлВнутр(Знач ПутьФайла, Знач КаталогВыгрузки) |
136 | 145 |
|
137 | 146 | Файл = Новый Файл(ПутьФайла); |
138 | 147 | Если Не ТипФайлаПоддерживается(Файл) Тогда |
|
145 | 154 | ОбеспечитьПустойКаталог(ПапкаИсходников); |
146 | 155 | ЗапуститьРаспаковку(Файл, ПапкаИсходников); |
147 | 156 |
|
148 | | -КонецПроцедуры |
| 157 | + Возврат ПапкаИсходников.ПолноеИмя; |
| 158 | + |
| 159 | +КонецФункции |
149 | 160 |
|
150 | 161 | Процедура ЗапуститьРаспаковку(Знач Файл, Знач ПапкаИсходников) |
151 | 162 |
|
|
195 | 206 |
|
196 | 207 | КонецПроцедуры |
197 | 208 |
|
| 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 | + |
198 | 341 | Инициализация(); |
199 | 342 |
|
200 | 343 | Если ЗапускВКоманднойСтроке() Тогда |
|
0 commit comments