Skip to content

Commit 099ace6

Browse files
committed
Изменена общая функциональность работы с git, использована бибиотека gitrunner
1 parent 0d4a7f4 commit 099ace6

File tree

3 files changed

+67
-113
lines changed

3 files changed

+67
-113
lines changed

packagedef

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
.ЗависитОт("tempfiles")
1010
.ЗависитОт("tool1cd", "0.3")
1111
.ЗависитОт("v8runner", "0.7.0")
12+
.ЗависитОт("gitrunner", "1.1.0")
1213
.ЗависитОт("strings")
1314
.ЗависитОт("1commands", "1.1.1")
1415
.ВключитьФайл("src")

src/core/Классы/МенеджерСинхронизации.os

Lines changed: 63 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#Использовать v8runner
1414
#Использовать strings
1515
#Использовать 1commands
16+
#Использовать gitrunner
1617

1718
Перем Лог;
1819
Перем мФайлПрограммыРаспаковки;
@@ -429,153 +430,102 @@
429430

430431
КонецПроцедуры
431432

432-
// Выполняет фиксацию изменений в локальном каталоге git
433+
/////////////////////////////////////
434+
// GIT Пересмотр
435+
436+
// <Описание процедуры>
433437
//
434-
Процедура ВыполнитьКоммитГит(Знач КаталогРабочейКопии, Знач Комментарий, Знач Автор, Знач Дата=Неопределено) Экспорт
438+
Функция ПолучитьГитРепозиторий(Знач КаталогРабочейКопии)
435439

436-
Если Дата = Неопределено Тогда
437-
Дата = ТекущаяДата();
438-
КонецЕсли;
440+
ГитРепозиторий = Новый ГитРепозиторий;
441+
ГитРепозиторий.УстановитьРабочийКаталог(КаталогРабочейКопии);
442+
ГитРепозиторий.УстановитьНастройку("core.quotepath","false",РежимУстановкиНастроекGit.Локально);
443+
ГитРепозиторий.УстановитьНастройку("merge.ours.driver","true",РежимУстановкиНастроекGit.Локально);
444+
Возврат ГитРепозиторий;
445+
446+
КонецФункции // ПолучитьГитРепозиторий()
447+
448+
Функция ПодготовитьФайлКоммита(Знач Комментарий)
439449

440450
ИмяФайлаКомментария = ВременныеФайлы.СоздатьФайл("txt");
441451
ФайлКомментария = Новый ЗаписьТекста(ИмяФайлаКомментария, КодировкаТекста.UTF8NoBOM);
442452
ФайлКомментария.Записать(?(ПустаяСтрока(Комментарий), ".", Комментарий));
443453
ФайлКомментария.Закрыть();
444-
Лог.Информация("Текст коммита: <"+Комментарий+">");
445-
446-
КомандныйФайл = Новый КомандныйФайл;
447-
448-
КомандныйФайл.УстановитьКодировкуВывода(КодировкаТекста.UTF8);
449-
450-
ПрефиксЭкспортаПеременной = ?(ЭтоWindows, "set", "export");
451-
Если ЭтоWindows Тогда
452-
КомандныйФайл.ДобавитьКоманду("cd /d " + ОбернутьВКавычки(КаталогРабочейКопии));
453-
Иначе
454-
КомандныйФайл.ДобавитьКоманду("cd " + ОбернутьВКавычки(КаталогРабочейКопии));
455-
КонецЕсли;
456-
КомандныйФайл.ДобавитьКоманду(ПрефиксЭкспортаПеременной + " GIT_AUTHOR_DATE="+ОбернутьВКавычки(ДатаPOSIX(Дата)));
457-
КомандныйФайл.ДобавитьКоманду(ПрефиксЭкспортаПеременной + " GIT_COMMITTER_DATE="+ОбернутьВКавычки(ДатаPOSIX(Дата)));
458-
КомандныйФайл.ДобавитьКоманду(СтрШаблон("git add -A ."));
454+
Лог.Отладка(СтрШаблон("Текст коммита: %1", Комментарий));
459455

460-
авторДляГит = Автор;
461-
Если Найти(Автор, "<") <= Найти(Автор, ">") Тогда
462-
авторДляГит = Автор+" <"+Автор+"@localhost>"; // e-mail может быть удобен для поиска в связанных системах //авторДляГит = Автор+" <"+Автор+">";
463-
КонецЕсли;
456+
Возврат ИмяФайлаКомментария;
464457

465-
КомандаКоммита = СтрШаблон("git commit -a --file=""%1"" --author=""%2"" ", ИмяФайлаКомментария, Автор);
466-
467-
КомандныйФайл.ДобавитьКоманду(КомандаКоммита);
468-
469-
Если Не ЭтоWindows Тогда
470-
КомандныйФайл.ДобавитьКоманду("exit $#");
471-
Иначе
472-
// сейчас аккуратно верну кодировку,
473-
// иначе после выполнения коммита все последующие команды скриптов будут неверно отображаться в консоли!
474-
КомандныйФайл.ДобавитьКоманду("set gitsync_exit=%ERRORLEVEL%");
475-
КомандныйФайл.ДобавитьКоманду("chcp 866 >nul");// >nul важен для исключения ненужной надписи с иероглифами
476-
КомандныйФайл.ДобавитьКоманду("exit /b %gitsync_exit%");
477-
КонецЕсли;
478-
479-
ИмяФайлаВыполнения = КомандныйФайл.Закрыть();
480-
481-
Если Лог.Уровень() = УровниЛога.Отладка Тогда
482-
текстФайла = "";
483-
Если ПолучитьТекстФайла(ИмяФайлаВыполнения, текстФайла) Тогда
484-
Лог.Отладка("ВыполнитьКоммитГит: текст файла запуска "+Символы.ВК+текстФайла);
485-
Иначе
486-
Лог.Ошибка("ВыполнитьКоммитГит: не удалось вывести текст пакетного файла");
487-
КонецЕсли;
488-
КонецЕсли;
458+
КонецФункции
489459

490-
рез = КомандныйФайл.Исполнить();
491460

492-
Лог.Информация("ВыполнитьКоммитГит: Вызов git commit вернул код <" + рез + "> ");
461+
// Выполняет фиксацию изменений в локальном каталоге git
462+
//
463+
Процедура ВыполнитьКоммитГит(Знач КаталогРабочейКопии, Знач Комментарий, Знач Автор, Знач Дата = Неопределено) Экспорт
493464

494-
ВыводКоманды = КомандныйФайл.ПолучитьВывод();
495-
Если рез <> 0 Тогда
496-
Лог.Ошибка("ВыполнитьКоммитГит: Лог неудачной команды git commit %1%2", Символы.ПС, ВыводКоманды);
497-
Иначе
498-
Лог.Отладка("ВыполнитьКоммитГит: Лог команды git commit %1%2", Символы.ПС, ВыводКоманды);
465+
Если Дата = Неопределено Тогда
466+
Дата = ТекущаяДата();
499467
КонецЕсли;
500468

501-
УдалитьВременныеФайлыПриНеобходимости(ИмяФайлаВыполнения);
502-
УдалитьВременныеФайлыПриНеобходимости(ИмяФайлаКомментария);
503-
504-
Если Рез <> 0 Тогда
505-
ВызватьИсключение "Коммит в git выполнить не удалось. См. лог";
506-
КонецЕсли;
469+
авторДляГит = Автор;
470+
471+
Лог.Отладка(СтрШаблон("Автор коммита: %1", авторДляГит));
472+
ДатаДляГит = ДатаPOSIX(Дата);
473+
Лог.Отладка(СтрШаблон("Дата коммита: %1", ДатаДляГит));
474+
ИмяФайлаКомментария = ПодготовитьФайлКоммита(Комментарий);
475+
476+
ГитРепозиторий = ПолучитьГитРепозиторий(КаталогРабочейКопии);
477+
// Выполнение индексации всех измененных файлов
478+
ГитРепозиторий.ВыполнитьКоманду(СтрРазделить("add -A .", " "));
479+
ГитРепозиторий.Закоммитить(Комментарий,
480+
Истина,
481+
ИмяФайлаКомментария,
482+
авторДляГит,
483+
ДатаДляГит,
484+
авторДляГит,
485+
ДатаДляГит);
486+
Лог.Отладка(СтрШаблон("Вывод команды Commit: %1", СокрЛП(ГитРепозиторий.ПолучитьВыводКоманды())));
487+
488+
ЗавершитьПроцесс_TGitCache_exe();
507489

508490
КонецПроцедуры
509491

510492
// Cтандартная процедура git push
511493
//
512494
Функция ВыполнитьGitPush(Знач ЛокальныйРепозиторий, Знач УдаленныйРепозиторий, Знач ИмяВетки = Неопределено) Экспорт
513495

514-
КомандныйФайл = Новый КомандныйФайл;
515-
ИмяФайлаЛогаКоммита = ВременныеФайлы.СоздатьФайл("log");
516-
Если ЭтоWindows Тогда
517-
КомандныйФайл.ДобавитьКоманду(СтроковыеФункции.ПодставитьПараметрыВСтроку("cd /d ""%1""", ЛокальныйРепозиторий));
518-
Иначе
519-
КомандныйФайл.ДобавитьКоманду(СтроковыеФункции.ПодставитьПараметрыВСтроку("cd ""%1""", ЛокальныйРепозиторий));
520-
КонецЕсли;
521-
522-
КомандныйФайл.ДобавитьКоманду("git gc --auto");
496+
ГитРепозиторий = ПолучитьГитРепозиторий(ЛокальныйРепозиторий);
497+
// Оптимизация git
498+
ГитРепозиторий.ВыполнитьКоманду(СтрРазделить("gc --auto", " "));
499+
Лог.Отладка(СтрШаблон("Вывод команды gc: %1", СокрЛП(ГитРепозиторий.ПолучитьВыводКоманды())));
500+
501+
ПараметрыКомандыPush = Новый Массив;
502+
ПараметрыКомандыPush.Добавить("push -u");
503+
ПараметрыКомандыPush.Добавить(СтрЗаменить(УдаленныйРепозиторий, "%", "%%"));
504+
ПараметрыКомандыPush.Добавить("--all -v");
523505

524-
ПараметрыКоманды = Новый Массив;
525-
ПараметрыКоманды.Добавить("git push -u");
526-
ПараметрыКоманды.Добавить(СтрЗаменить(УдаленныйРепозиторий, "%", "%%"));
527-
ПараметрыКоманды.Добавить("--all -v");
528-
ПараметрыКоманды.Добавить(КомандныйФайл.СуффиксПеренаправленияВывода(ИмяФайлаЛогаКоммита, Истина));
529-
530-
СтрокаКоманды = СобратьКоманднуюСтроку(ПараметрыКоманды);
531-
Если Лог.Уровень() = УровниЛога.Отладка Тогда
532-
сообщение = "строкаКоманды = <"+?(строкаКоманды = Неопределено, "Неопределено", строкаКоманды)+">";
533-
Лог.Отладка(сообщение);
534-
КонецЕсли;
506+
ГитРепозиторий.ВыполнитьКоманду(ПараметрыКомандыPush);
535507

536-
КомандныйФайл.ДобавитьКоманду(СтрокаКоманды);
537-
КомандныйФайл.ДобавитьКоманду("exit " + ?(ЭтоWindows, "/b %ERRORLEVEL%", "$#"));
508+
Лог.Отладка(СтрШаблон("Вывод команды Push: %1", СокрЛП(ГитРепозиторий.ПолучитьВыводКоманды())));
538509

539-
Результат = КомандныйФайл.Исполнить();
540-
ВывестиТекстФайла(ИмяФайлаЛогаКоммита);
541-
УдалитьВременныеФайлыПриНеобходимости(ИмяФайлаЛогаКоммита);
542-
УдалитьВременныеФайлыПриНеобходимости(КомандныйФайл.Закрыть());
543510
ЗавершитьПроцесс_TGitCache_exe();
544511

545-
Возврат Результат;
512+
Возврат 0;
546513

547514
КонецФункции
548515

549516
// Cтандартная процедура git pull
550517
//
551518
Функция ВыполнитьGitPull(Знач ЛокальныйРепозиторий, Знач УдаленныйРепозиторий, Знач ИмяВетки) Экспорт
552519

553-
КомандныйФайл = Новый КомандныйФайл;
554-
ИмяФайлаЛогаКоммита = ВременныеФайлы.СоздатьФайл("log");
555-
Если ЭтоWindows Тогда
556-
КомандныйФайл.ДобавитьКоманду(СтроковыеФункции.ПодставитьПараметрыВСтроку("cd /d ""%1""", ЛокальныйРепозиторий));
557-
Иначе
558-
КомандныйФайл.ДобавитьКоманду(СтроковыеФункции.ПодставитьПараметрыВСтроку("cd ""%1""", ЛокальныйРепозиторий));
559-
КонецЕсли;
560520

561-
ПараметрыКоманды = Новый Массив;
562-
ПараметрыКоманды.Добавить("git pull");
563-
ПараметрыКоманды.Добавить("-v");
564-
ПараметрыКоманды.Добавить(СтрЗаменить(УдаленныйРепозиторий, "%", "%%"));
565-
ПараметрыКоманды.Добавить(КомандныйФайл.СуффиксПеренаправленияВывода(ИмяФайлаЛогаКоммита, Истина));
566-
567-
СтрокаКоманды = СобратьКоманднуюСтроку(ПараметрыКоманды);
568-
сообщение = "строкаКоманды = <"+?(строкаКоманды = Неопределено, "Неопределено", строкаКоманды)+">";
569-
Лог.Отладка(сообщение);
570-
КомандныйФайл.ДобавитьКоманду(СтрокаКоманды);
571-
КомандныйФайл.ДобавитьКоманду("exit " + ?(ЭтоWindows, "/b %ERRORLEVEL%", "$#"));
572-
573-
Результат = КомандныйФайл.Исполнить();
574-
ВывестиТекстФайла(ИмяФайлаЛогаКоммита);
575-
УдалитьВременныеФайлыПриНеобходимости(ИмяФайлаЛогаКоммита);
576-
УдалитьВременныеФайлыПриНеобходимости(КомандныйФайл.Закрыть());
521+
ГитРепозиторий = ПолучитьГитРепозиторий(ЛокальныйРепозиторий);
522+
ГитРепозиторий.Получить(УдаленныйРепозиторий, ИмяВетки);
577523

578-
Возврат Результат;
524+
Лог.Отладка(СтрШаблон("Вывод команды Pull: %1", СокрЛП(ГитРепозиторий.ПолучитьВыводКоманды())));
525+
526+
ЗавершитьПроцесс_TGitCache_exe();
527+
528+
Возврат 0;
579529

580530
КонецФункции
581531

@@ -1433,6 +1383,7 @@
14331383
ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
14341384

14351385
Лог = Логирование.ПолучитьЛог("oscript.app.gitsync");
1386+
14361387
ДоменПочтыДляGitПоУмолчанию = "localhost";
14371388
УдалятьВременныеФайлы = Ложь;
14381389
КоличествоЦикловОжиданияЛицензииПоУмолчанию = 1;

tests/git-sync-test.os

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
Распаковщик = Новый МенеджерСинхронизации();
1717
Лог = Логирование.ПолучитьЛог("oscript.app.gitsync");
1818
Лог.УстановитьУровень(УровниЛога.Отладка);
19-
19+
ЛогGitRunner = Логирование.ПолучитьЛог("oscript.lib.gitrunner");
20+
ЛогGitRunner.УстановитьУровень(Лог.Уровень());
21+
2022
КонецПроцедуры
2123

2224
Функция ПолучитьСписокТестов(Знач Контекст) Экспорт

0 commit comments

Comments
 (0)