Skip to content

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

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

Open
wants to merge 6 commits into
base: develop
Choose a base branch
from
115 changes: 98 additions & 17 deletions src/core/Классы/МенеджерСинхронизации.os
Original file line number Diff line number Diff line change
Expand Up @@ -519,30 +519,71 @@
//
Функция ВыполнитьGitPull(Знач ЛокальныйРепозиторий, Знач УдаленныйРепозиторий, Знач ИмяВетки) Экспорт

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

Если ЗначениеЗаполнено(ИмяВетки) Тогда

// надо проверить текущую ветку, совпдает ли она с требуемой
КомандныйФайлСтатуса = НовыйКомандныйФайл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 status");
ПараметрыКоманды.Добавить("-b");
ПараметрыКоманды.Добавить("-s");

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

Файл = Новый Файл(КомандныйФайлСтатуса.ИмяФайлаЛога);
Если Файл.Существует() Тогда

ЧТ = Новый ЧтениеТекста(КомандныйФайлСтатуса.ИмяФайлаЛога, "utf-8");
СтрокаФайла = ЧТ.Прочитать();
ЧТ.Закрыть();

// формат строки ## master...origin/master etc
ПозицияРазделителя = СтрНайти(СтрокаФайла, "...");
Если ПозицияРазделителя Тогда

ИмяТекущейВетки = Сред(СтрокаФайла, 4, ПозицияРазделителя - 4);
Если ИмяТекущейВетки <> ИмяВетки Тогда

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

Choose a reason for hiding this comment

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

Предлагаю использовать формат СтрШаблон,
в методы вывода лога я давно добавил возможность использования этой фичи.
например, Лог.Отладка("строка %1", НужнаяСтрока);
очень удобно

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

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

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

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

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

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецЕсли;

ЗакрытьКомандныйФайлGit(КомандныйФайлСтатуса);

КонецЕсли;

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

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

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

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

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

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

КомандныйФайл = Новый КомандныйФайл;
ИмяФайлаЛога = ВременныеФайлы.СоздатьФайл("log");
Copy link
Member

@artbear artbear Feb 23, 2017

Choose a reason for hiding this comment

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

1commands уже научился получать непосредственный вывод от команд.
Поэтому промежуточный файл лога, с использованием СуффиксПеренаправленияВывода, теперь не нужен.
Пример соответствующего кода есть в методе, выполняющем коммит

Предлагаю доработать и здесь, раз уж начали доработку :)

Copy link
Member

Choose a reason for hiding this comment

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

ИМХО в этом случае не нужно управление файлом лога и не нужно доп.функции обертки НовыйКомандныйФайлGit, ЗакрытьКомандныйФайлGit

ИсполнитьКомандныйФайлGit вполне можно оставить.

Если ЭтоWindows Тогда

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

Choose a reason for hiding this comment

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

Вместо
СтроковыеФункции.ПодставитьПараметрыВСтроку("cd /d ""%1""", ЛокальныйРепозиторий)
предлагаю сразу юзать СтрШаблон, он уже давно поддерживается.
СтрШаблон("cd /d ""%1""", ЛокальныйРепозиторий)


Иначе

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

Choose a reason for hiding this comment

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

И здесь СтрШаблон


КонецЕсли;

Возврат Новый Структура("КомандныйФайл, ИмяФайлаЛога", КомандныйФайл, ИмяФайлаЛога);

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

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

КомандныйФайл = КомандныйФайлОбъект.КомандныйФайл;

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

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

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

Процедура ЗакрытьКомандныйФайлGit(КомандныйФайлОбъект)

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

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

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