-
Notifications
You must be signed in to change notification settings - Fork 1
/
post_checkout_pre_commit.os
345 lines (305 loc) · 19.6 KB
/
post_checkout_pre_commit.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
#Использовать JSON
#Использовать 1commands
#Использовать gui
#Использовать gitrunner
Функция ПутьКРепозиторию()
Возврат СтрЗаменить(СтартовыйСценарий().Каталог, ".git", "");
КонецФункции
Функция ПолучитьПараметрыОкружения(ИмяФайлаОкружения)
ФайлОкружения = Новый Файл(ИмяФайлаОкружения);
Если
не ФайлОкружения.Существует()
Тогда
Сообщить("Файл окружения не найден!");
ЗавершитьРаботу(1);
КонецЕсли;
Чтение = Новый ЧтениеТекста();
Чтение.Открыть(ИмяФайлаОкружения, "utf-8");
Парсер = Новый ПарсерJSON();
Окружение = Парсер.ПрочитатьJSON(Чтение.Прочитать());
Чтение.Закрыть();
Возврат Окружение;
КонецФункции
Процедура СоздатьХук(Хук, ПутьДоФайла, ИмяФайлаВызова, Метод)
ХукФайл = Новый ТекстовыйДокумент();
ХукФайл.УстановитьТекст("#!/bin/sh" + Символы.ПС + "chcp.com 65001" + Символы.ПС + "oscript -encoding=utf-8 """ + ПутьДоФайла + "/.git/" + ИмяФайлаВызова + """ " + Метод);
ХукФайл.Записать(ПутьДоФайла + "/.git/hooks/" + Хук, КодировкаТекста.UTF8NoBOM);
КонецПроцедуры
Процедура УдалитьХук(Хук, ПутьДоФайла)
УдалитьФайлы(ПутьКРепозиторию() + "/.git/hooks/" + Хук);
КонецПроцедуры
ПонялПараметры = АргументыКоманднойСтроки.найти("fromfile") <> Неопределено
ИЛИ АргументыКоманднойСтроки.найти("tofile") <> Неопределено
ИЛИ АргументыКоманднойСтроки.найти("install") <> Неопределено
ИЛИ АргументыКоманднойСтроки.найти("uninstall") <> Неопределено
ИЛИ АргументыКоманднойСтроки.найти("addfile") <> Неопределено;
Если
Не ПонялПараметры
Тогда
Сообщить("Не заданы параметры команды. Допустимы fromfile, tofile, install, uninstall, addfile");
ЗавершитьРаботу(1);
КонецЕсли;
Действие = АргументыКоманднойСтроки[0];
СиcтемныйФайл = ПутьКРепозиторию() + "Syst.txt";
ИмяФайлаВызова = "post_checkout_pre_commit.os";
Если
Действие = "addfile"
Тогда
СистФайл = Новый ТекстовыйДокумент();
СистФайл.УстановитьТекст("Последний коммит был " + Строка(ТекущаяДата()));
СистФайл.Записать(СиcтемныйФайл, КодировкаТекста.UTF8NoBOM);
Репозиторий = Новый ГитРепозиторий();
Репозиторий.УстановитьРабочийКаталог(ПутьКРепозиторию());
Репозиторий.ДобавитьФайлВИндекс(СиcтемныйФайл);
Сообщить(Репозиторий.ПолучитьВыводКоманды());
ЗавершитьРаботу(0);
ИначеЕсли
Действие = "install"
Тогда
Если
АргументыКоманднойСтроки.Количество() = 1
Тогда
Путь = ТекущийКаталог();
Иначе
Путь = АргументыКоманднойСтроки[1];
КопироватьФайл(ТекущийКаталог() + "/" + ИмяФайлаВызова, Путь + "/.git/" + ИмяФайлаВызова);
КонецЕсли;
СоздатьХук("post-checkout" , Путь, ИмяФайлаВызова, "fromfile");
СоздатьХук("post-commit" , Путь, ИмяФайлаВызова, "addfile");
СоздатьХук("pre-commit" , Путь, ИмяФайлаВызова, "tofile");
Json = "{
| ""$schema"": ""https://raw.githubusercontent.com/vanessa-opensource/vanessa-runner/develop/vanessa-runner-schema.json"",
| ""default"": {
| ""--ibconnection"" : ""/SИмя_Сервера\\Имя_Базы"",
| ""--ras"" : ""Адрес RAS сервера"",
| ""--db-user"" : ""User"",
| ""--db-pwd"" : ""Password"",
| ""_comment"" : ""Для доменной авторизации пользователь и пароль должны быть пустыми"",
| ""--root"" : ""."",
| ""--workspace"" : ""."",
| ""_comment2"" : ""В поле v8version можно указать нужную версию, например 8.3.18"",
| ""--v8version"" : """",
| ""--locale"" : ""ru"",
| ""--language"" : ""ru"",
| ""--additional"" : ""/WA+ /DisplayAllFunctions /Lru /iTaxi"",
| ""--ordinaryapp"" : ""-1"",
| ""--uccode"" : ""pas""
| },
| ""Настройки"": {
| ""ЭтоРасширение"" : true,
| ""ИмяРасширения"" : ""ИмяРасширения"",
| ""КаталогИсходников"" : ""src""
| }
|}";
ЦелевойJSON = Путь + "/.git/env.json";
Env = Новый Файл(ЦелевойJSON);
Если
не Env.Существует()
Тогда
ДжсонФайл = Новый ТекстовыйДокумент();
ДжсонФайл.УстановитьТекст(Json);
ДжсонФайл.Записать(ЦелевойJSON, КодировкаТекста.UTF8NoBOM);
КонецЕсли;
Сообщить("Хуки успешно установлены в каталог " + Путь);
ЗавершитьРаботу(0);
ИначеЕсли
Действие = "uninstall"
Тогда
Если
АргументыКоманднойСтроки.Количество() = 1
Тогда
Путь = ТекущийКаталог();
Иначе
Путь = АргументыКоманднойСтроки[1];
Сообщить(Путь + "/" + ИмяФайлаВызова);
УдалитьФайлы(Путь + "/" + ИмяФайлаВызова);
КонецЕсли;
УдалитьХук("post-checkout" , Путь);
УдалитьХук("post-commit" , Путь);
УдалитьХук("pre-commit" , Путь);
УдалитьФайлы(ПутьКРепозиторию() + "/.git/env.json");
ФайлН = Новый Файл(СиcтемныйФайл);
Если
ФайлН.Существует()
Тогда
УстановитьТекущийКаталог(Путь);
Команда = Новый Команда;
Команда.УстановитьКоманду("git");
Команда.ДобавитьПараметр("rm");
Команда.ДобавитьПараметр("-f");
Команда.ДобавитьПараметр(СиcтемныйФайл);
Результат = Команда.Исполнить();
Сообщить(Команда.ПолучитьВывод());
КонецЕсли;
ЗавершитьРаботу(0);
КонецЕсли;
ИмяФайлаОкружения = СтартовыйСценарий().Каталог + "/env.json";
Попытка
Окружение = ПолучитьПараметрыОкружения(ИмяФайлаОкружения);
НастройкиПоУмолчанию = Окружение.Получить("default");
Пользователь = НастройкиПоУмолчанию.Получить("--db-user");
ibconnection = НастройкиПоУмолчанию.Получить("--ibconnection");
Части = СтрРазделить(СтрЗаменить(ibconnection, "/S", ""), "\\");
СерверRAS = НастройкиПоУмолчанию.Получить("--ras");
ВопросБаза = "(Srvr=""" + Части[0] + """;Ref=""" + Части[1] + """)";
ВопросПользователь = ?(Пользователь = "", "", " под пользователем " + Пользователь);
Настройки = Окружение.Получить("Настройки");
ЭтоРасширение = Настройки.Получить("ЭтоРасширение");
Если
не ЗначениеЗаполнено(ЭтоРасширение)
Тогда
ВызватьИсключение "Не определен ЭтоРасширение";
КонецЕсли;
Если
ЭтоРасширение = Истина
Тогда
ИмяРасширения = Настройки.Получить("ИмяРасширения");
Если
не ЗначениеЗаполнено(ИмяРасширения)
Тогда
ВызватьИсключение "Не определен ИмяРасширения";
КонецЕсли;
КонецЕсли;
Если
Действие = "fromfile"
Тогда
ВопросРасширениеКонфигурация = ?(ЭтоРасширение, "расширения " + ИмяРасширения, "конфигурации");
ИначеЕсли
Действие = "tofile"
Тогда
ВопросРасширениеКонфигурация = ?(ЭтоРасширение, "расширение " + ИмяРасширения, "конфигурацию");
КонецЕсли;
КаталогИсходников = Настройки.Получить("КаталогИсходников");
Если
не СтрНайти(КаталогИсходников, ":") > 0
Тогда
КаталогИсходников = ПутьКРепозиторию() + КаталогИсходников;
Если
Действие = "fromfile"
Тогда
ConfigurationXML = Новый Файл(КаталогИсходников + "\configuration.xml");
Если
Не ConfigurationXML.Существует()
Тогда
КаталогИсходников = КаталогИсходников + "\" + ИмяРасширения;
ConfigurationXML = Новый Файл(КаталогИсходников + "\configuration.xml");
Если
Не ConfigurationXML.Существует()
Тогда
ВызватьИсключение("В каталоге репозитория отсутствует файл Configuration.xml");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если
не ЗначениеЗаполнено(КаталогИсходников)
Тогда
ВызватьИсключение "Не определен КаталогИсходников";
КонецЕсли;
Исключение
Сообщить("Не удалось определить настройки из файла окружения");
ЗавершитьРаботу(1);
КонецПопытки;
УправляемыйИнтерфейс = Новый УправляемыйИнтерфейс();
Диалоги = УправляемыйИнтерфейс.СтандартныеДиалоги;
Если
Действие = "fromfile"
Тогда
Ответ = Диалоги.Вопрос("Загрузить код " + ВопросРасширениеКонфигурация + " в базу " + ВопросБаза + ВопросПользователь + "? .",
РежимДиалогаВопрос.ДаНет, , , "Вопрос");
Если
Ответ = КодВозвратаДиалога.Нет
Тогда
ЗавершитьРаботу(0);
КонецЕсли;
ИначеЕсли
Действие = "tofile"
Тогда
Ответ = Диалоги.Вопрос("Перед коммитом выгрузить " + ВопросРасширениеКонфигурация + " из базы " + ВопросБаза + "в файлы" + ВопросПользователь + "? .",
РежимДиалогаВопрос.ДаНет, , , "Вопрос");
Если
Ответ = КодВозвратаДиалога.Нет
Тогда
ЗавершитьРаботу(0);
КонецЕсли;
КонецЕсли;
Команда = Новый Команда;
Команда.УстановитьКоманду("vrunner");
Команда.ДобавитьПараметр("session kill --with-nolock");
Команда.ДобавитьПараметр("--filter appid=Designer");
Команда.ДобавитьПараметр("--db " + Части[1]);
Команда.ДобавитьПараметр("--ras " + СерверRAS);
Результат = Команда.Исполнить();
Сообщить(Команда.ПолучитьВывод());
Если
не результат = 0
Тогда
ЗавершитьРаботу(Результат);
КонецЕсли;
Команда = Новый Команда;
Если
Действие = "fromfile"
Тогда
Если
ЭтоРасширение
Тогда
Команда.УстановитьКоманду("vrunner");
Команда.ДобавитьПараметр("compileext");
Команда.ДобавитьПараметр(КаталогИсходников);
Команда.ДобавитьПараметр(ИмяРасширения);
Команда.ДобавитьПараметр("--settings " + ИмяФайлаОкружения);
Иначе
Команда.УстановитьКоманду("vrunner");
Команда.ДобавитьПараметр("compile");
Команда.ДобавитьПараметр("--src");
Команда.ДобавитьПараметр(КаталогИсходников);
Команда.ДобавитьПараметр("-c");
Команда.ДобавитьПараметр("--settings " + ИмяФайлаОкружения);
КонецЕсли;
Результат = Команда.Исполнить();
Сообщить(Команда.ПолучитьВывод());
СистФайл = Новый ТекстовыйДокумент();
СистФайл.УстановитьТекст("Последнее переключение на ветку было " + Строка(ТекущаяДата()));
СистФайл.Записать(СиcтемныйФайл, КодировкаТекста.UTF8NoBOM);
Репозиторий = Новый ГитРепозиторий();
Репозиторий.УстановитьРабочийКаталог(ПутьКРепозиторию());
Репозиторий.ДобавитьФайлВИндекс(СиcтемныйФайл);
Сообщить(Репозиторий.ПолучитьВыводКоманды());
ИначеЕсли
Действие = "tofile"
Тогда
Команда = Новый Команда;
Если
ЭтоРасширение
Тогда
Команда.УстановитьКоманду("vrunner");
Команда.ДобавитьПараметр("decompileext");
Команда.ДобавитьПараметр(ИмяРасширения);
Команда.ДобавитьПараметр(КаталогИсходников);
Команда.ДобавитьПараметр("--settings " + ИмяФайлаОкружения);
Иначе
Команда.УстановитьКоманду("vrunner");
Команда.ДобавитьПараметр("decompile");
Команда.ДобавитьПараметр("-o");
Команда.ДобавитьПараметр(КаталогИсходников);
Команда.ДобавитьПараметр("-c");
Команда.ДобавитьПараметр("--settings " + ИмяФайлаОкружения);
КонецЕсли;
Результат = Команда.Исполнить();
Сообщить(Команда.ПолучитьВывод());
Команда = Новый Команда;
Команда.УстановитьКоманду("git");
Команда.ДобавитьПараметр("rm");
Команда.ДобавитьПараметр("-f");
Команда.ДобавитьПараметр(СиcтемныйФайл);
Результат = Команда.Исполнить();
Сообщить(Команда.ПолучитьВывод());
Репозиторий = Новый ГитРепозиторий();
Репозиторий.УстановитьРабочийКаталог(ПутьКРепозиторию());
Репозиторий.ДобавитьФайлВИндекс(КаталогИсходников);
Сообщить(Репозиторий.ПолучитьВыводКоманды());
Иначе
Сообщить("Команда сборки не распознана");
ЗавершитьРаботу(1);
КонецЕсли;
ЗавершитьРаботу(Результат);