Skip to content
122 changes: 105 additions & 17 deletions src/core/Классы/МенеджерСинхронизации.os
Original file line number Diff line number Diff line change
Expand Up @@ -519,30 +519,89 @@
//
Функция ВыполнитьGitPull(Знач ЛокальныйРепозиторий, Знач УдаленныйРепозиторий, Знач ИмяВетки) Экспорт

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

// надо проверить текущую ветку, совпдает ли она с требуемой
КомандныйФайлВетка = НовыйКомандныйФайлGit(ЛокальныйРепозиторий);

ПараметрыКоманды = Новый Массив;
ПараметрыКоманды.Добавить("git branch");

Результат = ИсполнитьКомандныйФайлGit(КомандныйФайлВетка, ПараметрыКоманды);
Если Результат = 0 Тогда

// вывод содержит много мусора, поэтому обработаем построчно
// нужная нам строка начинается с *
СтрокиФайла = СтрРазделить(КомандныйФайлВетка.ПолучитьВывод(), Символы.ПС, ЛОЖЬ);
НужноПереключитьВетку = ИСТИНА;

Для Ит = 0 По СтрокиФайла.Количество() - 1 Цикл

Если СтрНачинаетсяС(СтрокиФайла[Ит], "*") Тогда

ИмяТекущейВетки = СокрЛП(Сред(СтрокиФайла[Ит], 2));
Если ИмяТекущейВетки <> ИмяВетки Тогда

Лог.Отладка("Текущая ветка репозитория '%1', а требуется '%2'", ИмяТекущейВетки, ИмяВетки);

Иначе

НужноПереключитьВетку = ЛОЖЬ;

КонецЕсли;

Прервать;

КонецЕсли;

КонецЦикла;

Если НужноПереключитьВетку Тогда

Лог.Информация("Переключаем на ветку '%1'", ИмяВетки);

КомандныйФайлВетка = НовыйКомандныйФайлGit(ЛокальныйРепозиторий);

ПараметрыКоманды = Новый Массив;
ПараметрыКоманды.Добавить("git checkout");
ПараметрыКоманды.Добавить("-f");
ПараметрыКоманды.Добавить(ИмяВетки);

Результат = ИсполнитьКомандныйФайлGit(КомандныйФайлВетка, ПараметрыКоманды);
ВыводКоманды = КомандныйФайлВетка.ПолучитьВывод();
УдалитьВременныеФайлыПриНеобходимости(КомандныйФайлВетка.Закрыть());
Если Результат <> 0 Тогда

ВызватьИсключение "Ошибка переключения на ветки " + ВыводКоманды;

КонецЕсли;

КонецЕсли;

КонецЕсли;

Лог.Отладка(КомандныйФайлВетка.ПолучитьВывод());
УдалитьВременныеФайлыПриНеобходимости(КомандныйФайлВетка.Закрыть());

// если код не нулевой, вернем код ошибки
Если Результат <> 0 Тогда

Возврат Результат;

КонецЕсли;

КонецЕсли;

КомандныйФайлPull = НовыйКомандныйФайлGit(ЛокальныйРепозиторий);

ПараметрыКоманды = Новый Массив;
ПараметрыКоманды.Добавить("git pull");
ПараметрыКоманды.Добавить("-v");
ПараметрыКоманды.Добавить(СтрЗаменить(УдаленныйРепозиторий, "%", "%%"));
ПараметрыКоманды.Добавить(КомандныйФайл.СуффиксПеренаправленияВывода(ИмяФайлаЛогаКоммита, Истина));

СтрокаКоманды = СобратьКоманднуюСтроку(ПараметрыКоманды);
сообщение = "строкаКоманды = <"+?(строкаКоманды = Неопределено, "Неопределено", строкаКоманды)+">";
Лог.Отладка(сообщение);
КомандныйФайл.ДобавитьКоманду(СтрокаКоманды);
КомандныйФайл.ДобавитьКоманду("exit " + ?(ЭтоWindows, "/b %ERRORLEVEL%", "$#"));

Результат = КомандныйФайл.Исполнить();
ВывестиТекстФайла(ИмяФайлаЛогаКоммита);
УдалитьВременныеФайлыПриНеобходимости(ИмяФайлаЛогаКоммита);
УдалитьВременныеФайлыПриНеобходимости(КомандныйФайл.Закрыть());
Результат = ИсполнитьКомандныйФайлGit(КомандныйФайлPull, ПараметрыКоманды);
Лог.Отладка(КомандныйФайлPull.ПолучитьВывод());
УдалитьВременныеФайлыПриНеобходимости(КомандныйФайлPull.Закрыть());

Возврат Результат;

Expand Down Expand Up @@ -1380,6 +1439,35 @@
Возврат ?(ДоменПочтыДляGitПоУмолчанию = Неопределено, "localhost", ДоменПочтыДляGitПоУмолчанию);
КонецФункции

Функция НовыйКомандныйФайлGit(ЛокальныйРепозиторий)

КомандныйФайл = Новый КомандныйФайл;
Если ЭтоWindows Тогда

КомандныйФайл.ДобавитьКоманду(СтрШаблон("cd /d ""%1""", ЛокальныйРепозиторий));

Иначе

КомандныйФайл.ДобавитьКоманду(СтрШаблон("cd ""%1""", ЛокальныйРепозиторий));

КонецЕсли;

Возврат КомандныйФайл;

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

Функция ИсполнитьКомандныйФайлGit(КомандныйФайл, ПараметрыКоманды)

СтрокаКоманды = СобратьКоманднуюСтроку(ПараметрыКоманды);
Сообщение = СтрШаблон("СтрокаКоманды = <%1>", ?(СтрокаКоманды = Неопределено, "Неопределено", СтрокаКоманды));
Лог.Отладка(Сообщение);
КомандныйФайл.ДобавитьКоманду(СтрокаКоманды);
КомандныйФайл.ДобавитьКоманду(СтрШаблон("exit %1", ?(ЭтоWindows, "/b %ERRORLEVEL%", "$#")));

Возврат КомандныйФайл.Исполнить();

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

//////////////////////////////////////////////////////////////////////////////////////////////
СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
Expand Down