forked from silverbulleters/rector
-
Notifications
You must be signed in to change notification settings - Fork 2
/
prepare.os
384 lines (305 loc) · 23.2 KB
/
prepare.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
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
#Использовать logos
#Использовать fs
#Использовать gitrunner
#Использовать cmdline
#Использовать v8storage
Перем КаталогРепозитаря;
Перем КаталогИсходниковРепозитария;
Перем URLРепозитария;
Перем КаталогИсходников;
Перем ГитРепозиторий;
Перем ПутьХранилища;
Перем ХранилищеКонфигурации;
Перем ПользовательХранилища;
Перем ПарольПользователяХранилища;
Перем АвторКоммитаХранилища;
Перем АвторКоммитаGit;
Перем ЭлектроннаяПочтаАвтора;
// Перем ПредставлениеАвтора;
Процедура Инициализация()
Парсер = Новый ПарсерАргументовКоманднойСтроки();
Парсер.ДобавитьИменованныйПараметр("--projectPath", "Каталог проекта");
Парсер.ДобавитьИменованныйПараметр("--storagePath", "Каталог хранилища");
Парсер.ДобавитьИменованныйПараметр("--storage_psw", "Пользователь хранилища");
Парсер.ДобавитьИменованныйПараметр("--storage_user", "Пароль пользователя хранилища");
Параметры = Парсер.Разобрать(АргументыКоманднойСтроки);
КаталогРепозитаря = Параметры["--projectPath"];
Если КаталогРепозитаря = Неопределено Тогда
КаталогРепозитаря = ОбъединитьПути(ТекущийКаталог(), "project");
ФС.ОбеспечитьПустойКаталог(КаталогРепозитаря);
КонецЕсли;
КаталогИсходниковРепозитария = ОбъединитьПути(КаталогРепозитаря, "src", "cf");
URLРепозитария = Параметры["--repoURL"];
КаталогИсходников = Параметры["--srcPath"];
Если КаталогИсходников = Неопределено Тогда
КаталогИсходников = ОбъединитьПути(ТекущийКаталог(), "src", "cf");
КонецЕсли;
ПутьХранилища = Параметры["--storagePath"];
ПользовательХранилища = Параметры["--storage_user"];
ПарольПользователяХранилища = Параметры["--storage_psw"];
КонецПроцедуры
Процедура ОсновнаяРабота()
ИнициализацияПроекта();
ВыгрузитьИсходники();
КонецПроцедуры
Процедура ВыгрузитьИсходники()
ХранилищеКонфигурации = Новый МенеджерХранилищаКонфигурации();
ХранилищеКонфигурации.УстановитьПутьКХранилищу(ПутьХранилища);
Если (ПользовательХранилища <> Неопределено и ПарольПользователяХранилища <> Неопределено) Тогда
ХранилищеКонфигурации.УстановитьПараметрыАвторизации(ПользовательХранилища, ПарольПользователяХранилища);
КонецЕсли;
Сообщить("Получаю таблицу версий хранилища");
ТаблицаВерсийХранилища = ХранилищеКонфигурации.ПолучитьТаблицуВерсий();
Сообщить("найденно " + ТаблицаВерсийХранилища.Количество() + " версий");
// Отладка = Ложь;
// ФС.ОбеспечитьПустойКаталог(КаталогРепозитаря);
НоваяКонфигурацияПоставщика = "D:\tmp\prepareproject\src\cf\Ext\ParentConfigurations\БухгалтерияПредприятияКОРП.cf";
СтараяКонфигурацияПоставщика = КаталогИсходниковРепозитария + "\Ext\ParentConfigurations\БухгалтерияПредприятияКОРП.cf";
// НоваяКонфигурацияПоставщика = "D:\tmp\prepareproject\src\cf\Ext\ParentConfigurations\ТестоваяПоставка.cf";
// СтараяКонфигурацияПоставщика = КаталогИсходниковРепозитария + "\Ext\ParentConfigurations\ТестоваяПоставка.cf";
ПутьКФайлуСопоставления = ОбъединитьПути(ТекущийКаталог(), "resources", "gitsync", "AUTHORS");
Сообщить("Получаю таблицу авторов");
ТаблицаСопоставления = ПолучитьТаблицуАвторов(ПутьКФайлуСопоставления);
Сообщить("Количестово авторов в файле сопоставления" + ТаблицаСопоставления.Количество());
Для каждого ВерсияХранилища Из ТаблицаВерсийХранилища Цикл
Если ВерсияХранилища.Номер = 2 Тогда
ИнициализироватьGitsync(ВерсияХранилища.Дата);
КонецЕсли;
Комментарий = ВерсияХранилища.Комментарий;
Если Комментарий = "" Тогда
Комментарий = ".";
КонецЕсли;
Сообщить("Ищем соответствие автору:" + ВерсияХранилища.Автор);
СтрокаПользователя = ТаблицаСопоставления.Найти(ВерсияХранилища.Автор, "Автор");
Сообщить("Найден автор: " + СтрокаПользователя.ПользовательGit);
Если СтрокаПользователя = Неопределено Тогда
ПользовательGit = "ci-bot";
ПочтаПользователяGit = "[email protected]";
Иначе
ПользовательGit = СтрокаПользователя.ПользовательGit;
ПочтаПользователяGit = СтрокаПользователя.ПочтаПользователяGit;
КонецЕсли;
Сообщить("Автор: " + ПользовательGit);
Сообщить("ПочтаПользователяGit: " + ПочтаПользователяGit);
Сообщить("Получаю таблицу версию" + ВерсияХранилища.Номер + " хранилища");
ПолучитьВерсиюХранилища(ВерсияХранилища);
Если НЕ ФС.ФайлСуществует(СтараяКонфигурацияПоставщика) ИЛИ НЕ ФайлыРавны(НоваяКонфигурацияПоставщика, СтараяКонфигурацияПоставщика) Тогда
Сообщить("Выгружаю конфигурацию поставщика");
// ВыгрузитьОбновлениеКонфигурацииПоставщика(Комментарий, ПользовательGit, ПочтаПользователяGit, ВерсияХранилища.Дата, НоваяКонфигурацияПоставщика);
Иначе
Сообщить("Выгружаю конфигурацию разработки");
//ВыгрузитьКонфигурациюРазработчика(Комментарий, ПользовательGit, ПочтаПользователяGit, ВерсияХранилища.Дата);
КонецЕсли;
// Отладка = Истина;
КонецЦикла;
КонецПроцедуры
Процедура ВыгрузитьОбновлениеКонфигурацииПоставщика(Комментарий, ПользовательGit, ПочтаПользователяGit, Дата, НоваяКонфигурацияПоставщика);
// Создаем и переходим в ветку base1C
Сообщить("Получаю список веток");
КолекцияВетокРепозитария = ГитРепозиторий.ПолучитьСписокВеток();
Если КолекцияВетокРепозитария.Найти("base1c", "Имя") = Неопределено Тогда
Сообщить("Ветка base1C не существует - создаем и переходим");
ГитРепозиторий.ПерейтиВВетку("base1c", Истина);
Иначе
Сообщить("Ветка base1C существует - переходим");
ГитРепозиторий.ПерейтиВВетку("base1c", , Истина);
КонецЕсли;
// выружаем конфигурацию поставщика
Конфигуратор = Новый УправлениеКонфигуратором();
Сообщить("Загружаю конфигурацию поставщика во временную ИБ");
Конфигуратор.ЗагрузитьКонфигурациюИзФайла(НоваяКонфигурацияПоставщика);
Сообщить("Выгружаю исходники конфигурации поставщика");
Конфигуратор.ВыгрузитьКонфигурациюВФайлы(КаталогИсходников);
ФС.КопироватьСодержимоеКаталога(КаталогИсходников, КаталогИсходниковРепозитария);
ФайлВерсии = ОбъединитьПути(КаталогИсходниковРепозитария, "Configuration.xml");
СохранитьИзмененияGit("Обновление конфигурации на версию поставщика: " + ПолучитьВерсиюКонфигурации(ФайлВерсии), "1c", "[email protected]", Дата);
ГитРепозиторий.ПерейтиВВетку("master", , Истина);
ПараметрыКоманды = Новый Массив();
ПараметрыКоманды.Добавить("merge");
ПараметрыКоманды.Добавить("base1c");
ПараметрыКоманды.Добавить("-Xtheirs");
ПараметрыКоманды.Добавить("--no-commit");
Сообщить("Мержим изменения из base1C");
ГитРепозиторий.ВыполнитьКоманду(ПараметрыКоманды);
ВыгрузитьКонфигурациюРазработчика(Комментарий, ПользовательGit, ПочтаПользователяGit, Дата);
//делаем слияние с base 1c
КонецПроцедуры
Процедура ВыгрузитьКонфигурациюРазработчика(Комментарий, ПользовательGit, ПочтаПользователяGit, Дата)
Сообщить("Выгружаем конфигурацию разработчика");
КаталогИсходниковВРепозитарии = ОбъединитьПути(КаталогРепозитаря, "src", "cf");
Сообщить("Копируем изменения из рабочего квталога в репозитарий");
ФС.КопироватьСодержимоеКаталога(КаталогИсходников, КаталогИсходниковВРепозитарии);
СохранитьИзмененияGit(Комментарий, ПользовательGit, ПочтаПользователяGit, Дата)
КонецПроцедуры
Процедура ПолучитьВерсиюХранилища(ВерсияХранилища)
ИмяФайлаКофигурации = ОбъединитьПути(ТекущийКаталог(), "config.cf");
ХранилищеКонфигурации.СохранитьВерсиюКонфигурацииВФайл(ВерсияХранилища.Номер, ИмяФайлаКофигурации);
Конфигуратор = Новый УправлениеКонфигуратором();
Конфигуратор.ЗагрузитьКонфигурациюИзФайла(ИмяФайлаКофигурации);
Конфигуратор.ВыгрузитьКонфигурациюВФайлы(КаталогИсходников);
КонецПроцедуры
Процедура ИнициализацияПроекта()
// Создем новый git репозитарий
//
Сообщить(КаталогРепозитаря);
ГитРепозиторий = Новый ГитРепозиторий();
ГитРепозиторий.УстановитьРабочийКаталог(КаталогРепозитаря);
ГитРепозиторий.Инициализировать();
ФС.КопироватьСодержимоеКаталога(ОбъединитьПути(ТекущийКаталог(), "resources", "repo"), КаталогРепозитаря);
ГитРепозиторий.УстановитьНастройку("user.name", "ci-bot");
ГитРепозиторий.УстановитьНастройку("user.email", "[email protected]");
ГитРепозиторий.УстановитьНастройку("core.quotePath", "true", РежимУстановкиНастроекGit.Локально);
Если URLРепозитария <> Неопределено Тогда
ГитРепозиторий.ДобавитьВнешнийРепозиторий("origin", "http://github.com/EvilBeaver/oscript-library");
КонецЕсли;
СохранитьИзмененияGit("Инициализация репозитария", "ci-bot", "[email protected]", Дата("20150101"));
КонецПроцедуры
Процедура ИнициализироватьGitsync(ДатаКоммита)
ФС.КопироватьСодержимоеКаталога(ОбъединитьПути(ТекущийКаталог(), "resources", "gitsync"), КаталогИсходниковРепозитария);
СохранитьИзмененияGit("Инициализация gitsync", "ci-bot", "[email protected]", ДатаКоммита);
КонецПроцедуры
Процедура СохранитьИзмененияGit(ТекстСообщения, АвторКоммита, ПочтаАвтораКоммита, Дата)
Если Дата = Неопределено Тогда
Дата = ТекущаяДата();
КонецЕсли;
ДатаДляГит = ДатаPOSIX(Дата);
Сообщить("ДатаДляГит " + ДатаДляГит);
Сообщить("Добавляем изменения в Git");
ГитРепозиторий.ДобавитьФайлВИндекс(".");
ГитРепозиторий.УстановитьНастройку("user.name", АвторКоммита);
ГитРепозиторий.УстановитьНастройку("user.email", ПочтаАвтораКоммита);
ПредставлениеАвтора = АвторКоммита + " <" + ПочтаАвтораКоммита + ">";
ГитРепозиторий.Закоммитить(ТекстСообщения, Истина, , ПредставлениеАвтора, ДатаДляГит, , ДатаДляГит);
КонецПроцедуры
// Вычиcлсяет значение хеш-суммы (контрольной суммы) для указанного файлов по алгоритму SHA-1.
//
// Параметры:
// <ПутьКФайлу> - Строка - Путь к файлу, сумму котрого необходимо вычислить
//
// Возвращаемое значение:
// Строка - Контрольная сумма файла
//
Функция ПолучитьСуммуФайлаSHA1(ПутьКФайлу) Экспорт
Если НЕ ФС.ФайлСуществует(ПутьКФайлу) Тогда
ВызватьИсключение "Выбран каталог или файла " + ПутьКФайлу +" не существует";
КонецЕсли;
Команда = Новый Команда;
СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
Если ЭтоWindows Тогда
Команда.УстановитьКоманду("certutil");
Команда.ДобавитьПараметр("-hashfile");
Команда.ДобавитьПараметр(ПутьКФайлу);
Команда.Исполнить();
Ответ = Команда.ПолучитьВывод();
Результат = СокрЛП(СтрПолучитьСтроку(СтрЗаменить(Ответ, " ", ""), 2));
Иначе
Команда.УстановитьКоманду("sha1sum");
Команда.ДобавитьПараметр(ПутьКФайлу);
Команда.Исполнить();
Результат = СтрРазделить(Команда.ПолучитьВывод(), " ")[0];
КонецЕсли;
Сообщить(Результат);
Возврат Результат;
КонецФункции
// Сравнивает хеш-суммы 2-х переданных файлов
//
// Параметры:
// <ПервыйФайл> - Строка - Путь к первому файлу.
//
// <ПервыйФайл> - Строка - Путь ко второму файлу.
//
// Возвращаемое значение:
// Булево - Результат сравнения
//
Функция ФайлыРавны(ПервыйФайл , ВторойФайл) Экспорт
Возврат ПолучитьСуммуФайлаSHA1(ПервыйФайл) = ПолучитьСуммуФайлаSHA1(ВторойФайл);
КонецФункции
// Получает таблицу авторов из файла
//
// Параметры:
// ПутьКФайлуАвторов - Строка - путь к файлу авторов
//
// Возвращаемое значение:
// ТаблицаЗначений - таблица пользователей с колонками
// * Автор - Строка - имя автора версии в хранилище
// * ПредставлениеАвтора - Строка - представление автора для коммита в git
//
Функция ПолучитьТаблицуАвторов(Знач ПутьКФайлуАвторов) Экспорт
СтандартнаяОбработка = Истина;
ТаблицаАвторов = НоваяТаблицаАвторов();
Если СтандартнаяОбработка Тогда
ПрочитатьФайлАвторов(ПутьКФайлуАвторов, ТаблицаАвторов);
КонецЕсли;
Возврат ТаблицаАвторов;
КонецФункции
Процедура ПрочитатьФайлАвторов(ПутьКФайлуАвторов, ТаблицаАвторов)
Если НЕ ЗначениеЗаполнено(ПутьКФайлуАвторов) Тогда
Возврат;
КонецЕсли;
Файл = Новый Файл(ПутьКФайлуАвторов);
Если Не Файл.Существует() Тогда
Возврат;
КонецЕсли;
ТекстовыйФайл = Новый ЧтениеТекста(ПутьКФайлуАвторов, "utf-8");
ТекстФайла = ТекстовыйФайл.Прочитать();
МассивСтрокФайла = СтрРазделить(ТекстФайла, Символы.ПС, Ложь);
Для каждого СтрокаФайла Из МассивСтрокФайла Цикл
Если СтрНачинаетсяС(СокрЛП(СтрокаФайла), "//") Тогда
Продолжить;
КонецЕсли;
МассивКлючей = СтрРазделить(СтрокаФайла, "=", Ложь);
НоваяСтрока = ТаблицаАвторов.Добавить();
НоваяСтрока.Автор = СокрЛП(МассивКлючей[0]);
ПредставлениеАвтора = СокрЛП(МассивКлючей[1]);
Сообщить("ПредставлениеАвтора: "+ ПредставлениеАвтора);
НоваяСтрока.ПользовательGit = СтрРазделить(ПредставлениеАвтора,"<")[0];
НоваяСтрока.ПочтаПользователяGit = СтрЗаменить(СтрРазделить(ПредставлениеАвтора, "<")[1], ">", "");
КонецЦикла;
ТекстовыйФайл.Закрыть();
Если ТекстовыйФайл <> Неопределено Тогда
ОсвободитьОбъект(ТекстовыйФайл);
КонецЕсли;
КонецПроцедуры
Функция НоваяТаблицаАвторов()
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Автор");
Таблица.Колонки.Добавить("ПользовательGit");
Таблица.Колонки.Добавить("ПочтаПользователяGit");
Возврат Таблица;
КонецФункции
Функция ДатаPOSIX(Знач Дата)
Возврат "" + Год(Дата) + "-" + ФорматДвузначноеЧисло(Месяц(Дата)) + "-" + ФорматДвузначноеЧисло(День(Дата)) + " "
+ ФорматДвузначноеЧисло(Час(Дата)) + ":" + ФорматДвузначноеЧисло(Минута(Дата))
+ ":" + ФорматДвузначноеЧисло(Секунда(Дата));
КонецФункции
Функция ФорматДвузначноеЧисло(ЗначениеЧисло)
ЧислоСтрокой = Строка(ЗначениеЧисло);
Если СтрДлина(ЧислоСтрокой) < 2 Тогда
ЧислоСтрокой = "0" + ЧислоСтрокой;
КонецЕсли;
Возврат ЧислоСтрокой;
КонецФункции
Функция ДоменПочтыДляGit()
Возврат "1bit.com"
КонецФункции
Функция ПолучитьВерсиюКонфигурации(ФайлВерсии)
Файл = Новый ЧтениеТекста(ФайлВерсии);
ФайлСтрокой = Файл.Прочитать();
Файл.Закрыть();
РВ = Новый РегулярноеВыражение("<Version>(.*)<\/Version>");
Совпадения = РВ.НайтиСовпадения(ФайлСтрокой);
Если Совпадения.Количество() > 0 Тогда
Результат = Совпадения[0].Значение;
Результат = СтрЗаменить(Результат, "<Version>", "");
Результат = СтрЗаменить(Результат, "</Version>", "");
Возврат Результат;
КонецЕсли;
КонецФункции
Лог = Логирование.ПолучитьЛог("oscript.app.PrepareBase");
Инициализация();
Попытка
ОсновнаяРабота();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;