|
3 | 3 | #Использовать tempfiles
|
4 | 4 | #Использовать asserts
|
5 | 5 | #Использовать v8runner
|
| 6 | +#Использовать strings |
6 | 7 |
|
7 | 8 | Перем Лог;
|
8 | 9 | Перем КодВозврата;
|
| 10 | +Перем мВозможныеКоманды; |
| 11 | + |
| 12 | +Функция ВозможныеКоманды() |
| 13 | + |
| 14 | + Если мВозможныеКоманды = Неопределено Тогда |
| 15 | + мВозможныеКоманды = Новый Структура; |
| 16 | + мВозможныеКоманды.Вставить("Декомпилировать", "--decompile"); |
| 17 | + мВозможныеКоманды.Вставить("Помощь", "--help"); |
| 18 | + мВозможныеКоманды.Вставить("ОбработатьИзмененияИзГит", "--git-precommit"); |
| 19 | + КонецЕсли; |
| 20 | + |
| 21 | + Возврат мВозможныеКоманды; |
| 22 | + |
| 23 | +КонецФункции |
9 | 24 |
|
10 | 25 | Функция ЗапускВКоманднойСтроке()
|
11 | 26 |
|
|
19 | 34 |
|
20 | 35 | Парсер = Новый ПарсерАргументовКоманднойСтроки();
|
21 | 36 |
|
22 |
| - ВозможныеКоманды = Новый Структура; |
23 |
| - ВозможныеКоманды.Вставить("Декомпилировать", "--decompile"); |
24 |
| - ВозможныеКоманды.Вставить("Помощь", "--help"); |
25 |
| - |
26 |
| - ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды.Декомпилировать); |
27 |
| - Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьВходящихДанных"); |
28 |
| - Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ВыходнойКаталог"); |
29 |
| - Парсер.ДобавитьКоманду(ОписаниеКоманды); |
30 |
| - |
31 |
| - ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды.Помощь); |
32 |
| - Парсер.ДобавитьКоманду(ОписаниеКоманды); |
| 37 | + ДобавитьОписаниеКомандыДекомпилировать(Парсер); |
| 38 | + ДобавитьОписаниеКомандыПомощь(Парсер); |
| 39 | + ДобавитьОписаниеКомандыИзмененияПоЖурналуГит(Парсер); |
33 | 40 |
|
34 | 41 | Аргументы = Парсер.РазобратьКоманду(АргументыКоманднойСтроки);
|
35 | 42 |
|
|
39 | 46 | Лог.Отладка(Параметр.Ключ + " = " + Параметр.Значение);
|
40 | 47 | КонецЦикла;
|
41 | 48 |
|
42 |
| - Если Команда = ВозможныеКоманды.Декомпилировать Тогда |
| 49 | + Если Команда = ВозможныеКоманды().Декомпилировать Тогда |
43 | 50 | Декомпилировать(Аргументы.ЗначенияПараметров["ПутьВходящихДанных"], Аргументы.ЗначенияПараметров["ВыходнойКаталог"]);
|
44 |
| - ИначеЕсли Команда = ВозможныеКоманды.Помощь Тогда |
| 51 | + ИначеЕсли Команда = ВозможныеКоманды().Помощь Тогда |
45 | 52 | ВывестиСправку();
|
| 53 | + ИначеЕсли Команда = ВозможныеКоманды().ОбработатьИзмененияИзГит Тогда |
| 54 | + ОбработатьИзмененияИзГит(Аргументы.ЗначенияПараметров["ВыходнойКаталог"]); |
46 | 55 | КонецЕсли;
|
47 | 56 |
|
48 | 57 | Исключение
|
|
54 | 63 |
|
55 | 64 | КонецФункции
|
56 | 65 |
|
| 66 | +Процедура ДобавитьОписаниеКомандыДекомпилировать(Знач Парсер) |
| 67 | + ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().Декомпилировать); |
| 68 | + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьВходящихДанных"); |
| 69 | + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ВыходнойКаталог"); |
| 70 | + Парсер.ДобавитьКоманду(ОписаниеКоманды); |
| 71 | +КонецПроцедуры |
| 72 | + |
| 73 | +Процедура ДобавитьОписаниеКомандыПомощь(Знач Парсер) |
| 74 | + ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().Помощь); |
| 75 | + Парсер.ДобавитьКоманду(ОписаниеКоманды); |
| 76 | +КонецПроцедуры |
| 77 | + |
| 78 | +Процедура ДобавитьОписаниеКомандыИзмененияПоЖурналуГит(Знач Парсер) |
| 79 | + |
| 80 | + ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().ОбработатьИзмененияИзГит); |
| 81 | + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ВыходнойКаталог"); |
| 82 | + Парсер.ДобавитьКоманду(ОписаниеКоманды); |
| 83 | + |
| 84 | +КонецПроцедуры |
| 85 | + |
57 | 86 | Процедура Инициализация()
|
58 | 87 | Лог = Логирование.ПолучитьЛог("oscript.app.v8files-extractor");
|
59 | 88 | Лог.УстановитьУровень(УровниЛога.Отладка);
|
60 | 89 | КонецПроцедуры
|
61 | 90 |
|
| 91 | + |
| 92 | +///////////////////////////////////////////////////////////////////////////// |
| 93 | +// РЕАЛИЗАЦИЯ КОМАНД |
| 94 | + |
62 | 95 | Процедура Декомпилировать(Знач Путь, Знач КаталогВыгрузки) Экспорт
|
63 | 96 | Файл = Новый Файл(Путь);
|
64 | 97 | Если Файл.ЭтоКаталог() Тогда
|
|
68 | 101 | КонецЕсли;
|
69 | 102 | КонецПроцедуры
|
70 | 103 |
|
71 |
| -Процедура ВывестиСправку() |
72 |
| - Сообщить("Утилита сборки/разборки внешних файлов 1С"); |
73 |
| - Сообщить(" "); |
74 |
| - Сообщить("Параметры командной строки:"); |
75 |
| - Сообщить(" --decompile inputPath outputPath"); |
76 |
| - Сообщить(" Разбор файлов на исходники"); |
77 |
| - |
78 |
| - Сообщить(" --help"); |
79 |
| - Сообщить(" Показ этого экрана"); |
80 |
| -КонецПроцедуры |
81 |
| - |
82 | 104 | Процедура РазобратьКаталог(Знач ПутьКаталога, Знач КаталогВыгрузки) Экспорт
|
83 | 105 | Лог.Информация("Подготовка выгрузки каталога "+ПутьКаталога+" в каталог " + КаталогВыгрузки);
|
84 | 106 | РазобратьКаталогВнутр(ПутьКаталога, КаталогВыгрузки);
|
85 | 107 | Лог.Информация("Завершена выгрузки каталога "+ПутьКаталога+" в каталог " + КаталогВыгрузки);
|
86 | 108 | КонецПроцедуры
|
87 | 109 |
|
88 |
| -Процедура РазобратьФайл(Знач ПутьФайла, Знач КаталогВыгрузки) Экспорт |
| 110 | +Функция РазобратьФайл(Знач ПутьФайла, Знач КаталогВыгрузки) Экспорт |
89 | 111 | Лог.Информация("Подготовка выгрузки файла "+ПутьФайла+" в каталог " + КаталогВыгрузки);
|
90 | 112 |
|
91 |
| - РазобратьФайлВнутр(ПутьФайла, КаталогВыгрузки); |
| 113 | + КаталогИсходников = РазобратьФайлВнутр(ПутьФайла, КаталогВыгрузки); |
92 | 114 |
|
93 | 115 | Лог.Информация("Завершена выгрузка файла "+ПутьФайла+" в каталог " + КаталогВыгрузки);
|
94 |
| -КонецПроцедуры |
| 116 | + |
| 117 | + Возврат КаталогИсходников; |
| 118 | + |
| 119 | +КонецФункции |
95 | 120 |
|
96 | 121 | Процедура РазобратьКаталогВнутр(Знач ПутьКаталога, Знач КаталогВыгрузки)
|
97 | 122 | ОбъектКаталога = Новый Файл(ПутьКаталога);
|
|
113 | 138 | КонецПроцедуры
|
114 | 139 |
|
115 | 140 | Функция ТипФайлаПоддерживается(Файл)
|
116 |
| - Возврат Найти(".epf,.erf,", Файл.Расширение+",") > 0; |
| 141 | + Если ПустаяСтрока(Файл.Расширение) Тогда |
| 142 | + Возврат Ложь; |
| 143 | + КонецЕсли; |
| 144 | + |
| 145 | + Поз = Найти(".epf,.erf,", Файл.Расширение+","); |
| 146 | + Возврат Поз > 0; |
| 147 | + |
117 | 148 | КонецФункции
|
118 | 149 |
|
119 |
| -Процедура РазобратьФайлВнутр(Знач ПутьФайла, Знач КаталогВыгрузки) |
| 150 | +Функция РазобратьФайлВнутр(Знач ПутьФайла, Знач КаталогВыгрузки) |
120 | 151 |
|
121 | 152 | Файл = Новый Файл(ПутьФайла);
|
122 | 153 | Если Не ТипФайлаПоддерживается(Файл) Тогда
|
|
129 | 160 | ОбеспечитьПустойКаталог(ПапкаИсходников);
|
130 | 161 | ЗапуститьРаспаковку(Файл, ПапкаИсходников);
|
131 | 162 |
|
132 |
| -КонецПроцедуры |
| 163 | + Возврат ПапкаИсходников.ПолноеИмя; |
| 164 | + |
| 165 | +КонецФункции |
133 | 166 |
|
134 | 167 | Процедура ЗапуститьРаспаковку(Знач Файл, Знач ПапкаИсходников)
|
135 | 168 |
|
|
179 | 212 |
|
180 | 213 | КонецПроцедуры
|
181 | 214 |
|
| 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 | + |
182 | 338 | Инициализация();
|
183 | 339 |
|
184 | 340 | Если ЗапускВКоманднойСтроке() Тогда
|
|
0 commit comments