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

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

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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Название КомандныйФайлСтатуса уже не отвечает своему назначения, т.к. вместо гит статус юзаем гит бранч


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

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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не обрабатывается неуспешный результат git branch.
Вдруг локальный репо это не репо гит?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тем более, что у нас API-метод


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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А почему бы регулярки не использовать вместо построчного перебора?
Формат-то все равно един * пробел имяВетки

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вот регулярка \*\s*(.*)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вообще это не самый простой способ получения ветки. В гитраннере есть готовая реализация. Наверное, надо потихоньку переводить на него :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Стоит менять? или в рамках задачи перевода на гитраннер все сделаем?

НужноПереключитьВетку = ИСТИНА;

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

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

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

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

Иначе

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

КонецЕсли;

Прервать;

КонецЕсли;

КонецЦикла;

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

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

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

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

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

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

КонецЕсли;

КонецЕсли;

КонецЕсли;

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

КонецЕсли;

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

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

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

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

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

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

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

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

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

Иначе

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

КонецЕсли;

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

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

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

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

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

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

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