Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Доработан функционал смены ветки #49

Open
wants to merge 6 commits into
base: develop
Choose a base branch
from
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