diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\260\321\206\320\270\320\270.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\260\321\206\320\270\320\270.os" index 31554074..1ea42763 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\260\321\206\320\270\320\270.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\260\321\206\320\270\320\270.os" @@ -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.Закрыть()); Возврат Результат; @@ -1380,6 +1439,35 @@ Возврат ?(ДоменПочтыДляGitПоУмолчанию = Неопределено, "localhost", ДоменПочтыДляGitПоУмолчанию); КонецФункции +Функция НовыйКомандныйФайлGit(ЛокальныйРепозиторий) + + КомандныйФайл = Новый КомандныйФайл; + Если ЭтоWindows Тогда + + КомандныйФайл.ДобавитьКоманду(СтрШаблон("cd /d ""%1""", ЛокальныйРепозиторий)); + + Иначе + + КомандныйФайл.ДобавитьКоманду(СтрШаблон("cd ""%1""", ЛокальныйРепозиторий)); + + КонецЕсли; + + Возврат КомандныйФайл; + +КонецФункции + +Функция ИсполнитьКомандныйФайлGit(КомандныйФайл, ПараметрыКоманды) + + СтрокаКоманды = СобратьКоманднуюСтроку(ПараметрыКоманды); + Сообщение = СтрШаблон("СтрокаКоманды = <%1>", ?(СтрокаКоманды = Неопределено, "Неопределено", СтрокаКоманды)); + Лог.Отладка(Сообщение); + КомандныйФайл.ДобавитьКоманду(СтрокаКоманды); + КомандныйФайл.ДобавитьКоманду(СтрШаблон("exit %1", ?(ЭтоWindows, "/b %ERRORLEVEL%", "$#"))); + + Возврат КомандныйФайл.Исполнить(); + +КонецФункции + ////////////////////////////////////////////////////////////////////////////////////////////// СистемнаяИнформация = Новый СистемнаяИнформация; ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;