1
0
mirror of https://github.com/1C-Company/GitConverter.git synced 2025-03-19 21:08:00 +02:00

Merge pull request #138 from 1C-Company/feature/121

Подключение удаленного репозитория
This commit is contained in:
Dmitriy Marmyshev 2020-11-14 12:52:43 +03:00 committed by GitHub
commit 5c879bf1b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 705 additions and 116 deletions

View File

@ -2095,22 +2095,120 @@
<currentRowUse>Auto</currentRowUse>
</extInfo>
</items>
<items xsi:type="form:FormField">
<name>ИмяВетки</name>
<id>107</id>
<items xsi:type="form:FormGroup">
<name>Группа12</name>
<id>211</id>
<items xsi:type="form:FormField">
<name>ИмяВетки</name>
<id>107</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<dataPath xsi:type="form:MultiLanguageDataPath">
<paths xsi:type="form:DataPath">
<segments>Объект.ИмяВетки</segments>
</paths>
</dataPath>
<shortcut>Ctrl+S</shortcut>
<toolTip>
<key>ru</key>
<value>В Git репозитории основную (главную) ветку принято называть master. Если репозиторий публикуется на сервере (синхронизируется с сервром) запросите список векток, созданных в репозитории, по кнопке &lt;-. Если необходимая ветка отсутствует на сервере или репозиторий пуст - укажите имя ветки которая будет создана.</value>
</toolTip>
<extendedTooltip>
<name>ИмяВеткиРасширеннаяПодсказка1</name>
<id>109</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>ИмяВеткиКонтекстноеМеню1</name>
<id>108</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<autoFill>true</autoFill>
</contextMenu>
<type>InputField</type>
<editMode>Enter</editMode>
<showInHeader>true</showInHeader>
<headerHorizontalAlign>Left</headerHorizontalAlign>
<showInFooter>true</showInFooter>
<extInfo xsi:type="form:InputFieldExtInfo">
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<wrap>true</wrap>
<dropListButton>true</dropListButton>
<chooseType>true</chooseType>
<typeDomainEnabled>true</typeDomainEnabled>
<textEdit>true</textEdit>
<choiceList>
<presentation>
<key>ru</key>
<value>master (?)</value>
</presentation>
<value xsi:type="core:StringValue">
<value>master</value>
</value>
</choiceList>
<inputHint>
<key>ru</key>
<value>Загрузките ветки с сервера или создайте новую...</value>
</inputHint>
</extInfo>
</items>
<items xsi:type="form:Button">
<name>ЗагрузитьСписокВеток</name>
<id>215</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<extendedTooltip>
<name>ЗагрузитьСписокВетокРасширеннаяПодсказка</name>
<id>216</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<type>UsualButton</type>
<commandName>Form.Command.ЗагрузитьСписокВеток</commandName>
<representation>Picture</representation>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<placementArea>UserCmds</placementArea>
<toolTipRepresentation>Balloon</toolTipRepresentation>
<representationInContextMenu>Auto</representationInContextMenu>
</items>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<dataPath xsi:type="form:MultiLanguageDataPath">
<paths xsi:type="form:DataPath">
<segments>Объект.ИмяВетки</segments>
</paths>
</dataPath>
<extendedTooltip>
<name>ИмяВеткиРасширеннаяПодсказка1</name>
<id>109</id>
<name>Группа12РасширеннаяПодсказка</name>
<id>212</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
@ -2123,28 +2221,13 @@
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>ИмяВеткиКонтекстноеМеню1</name>
<id>108</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<autoFill>true</autoFill>
</contextMenu>
<type>InputField</type>
<editMode>Enter</editMode>
<showInHeader>true</showInHeader>
<headerHorizontalAlign>Left</headerHorizontalAlign>
<showInFooter>true</showInFooter>
<extInfo xsi:type="form:InputFieldExtInfo">
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<wrap>true</wrap>
<chooseType>true</chooseType>
<typeDomainEnabled>true</typeDomainEnabled>
<textEdit>true</textEdit>
<type>UsualGroup</type>
<extInfo xsi:type="form:UsualGroupExtInfo">
<group>AlwaysHorizontal</group>
<showLeftMargin>true</showLeftMargin>
<united>true</united>
<throughAlign>Auto</throughAlign>
<currentRowUse>Auto</currentRowUse>
</extInfo>
</items>
<items xsi:type="form:FormGroup">
@ -2237,9 +2320,46 @@
<type>UsualButton</type>
<commandName>Form.Command.УстановитьАдресРепозиторияGit</commandName>
<representation>Picture</representation>
<width>4</width>
<autoMaxHeight>true</autoMaxHeight>
<placementArea>UserCmds</placementArea>
<toolTipRepresentation>Balloon</toolTipRepresentation>
</items>
<items xsi:type="form:Button">
<name>ПроверитьДоступКРепозиториюGit</name>
<id>209</id>
<title>
<key>ru</key>
<value>Проверить доступ...</value>
</title>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<extendedTooltip>
<name>ПроверитьДоступКРепозиториюGitРасширеннаяПодсказка</name>
<id>210</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<type>UsualButton</type>
<commandName>Form.Command.ПроверитьДоступКРепозиториюGit</commandName>
<representation>PictureAndText</representation>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<placementArea>UserCmds</placementArea>
<toolTipRepresentation>Balloon</toolTipRepresentation>
<representationInContextMenu>Auto</representationInContextMenu>
</items>
<visible>true</visible>
<enabled>true</enabled>
@ -2289,6 +2409,10 @@
<segments>Объект.ПользовательСервераGit</segments>
</paths>
</dataPath>
<handlers>
<event>OnChange</event>
<name>ПользовательСервераGitПриИзменении</name>
</handlers>
<extendedTooltip>
<name>ПользовательСервераGitРасширеннаяПодсказка</name>
<id>74</id>
@ -2349,6 +2473,10 @@
<segments>Объект.ПарольСервераGit</segments>
</paths>
</dataPath>
<handlers>
<event>OnChange</event>
<name>ПарольСервераGitПриИзменении</name>
</handlers>
<extendedTooltip>
<name>ПарольСервераGitРасширеннаяПодсказка</name>
<id>77</id>
@ -3728,6 +3856,19 @@
<common>true</common>
</edit>
</attributes>
<attributes>
<name>РепозиторийСоздан</name>
<id>15</id>
<valueType>
<types>Boolean</types>
</valueType>
<view>
<common>true</common>
</view>
<edit>
<common>true</common>
</edit>
</attributes>
<formCommands>
<name>ОбновитьСостояние</name>
<title>
@ -3922,6 +4063,54 @@
</action>
<currentRowUse>Auto</currentRowUse>
</formCommands>
<formCommands>
<name>ПроверитьДоступКРепозиториюGit</name>
<title>
<key>ru</key>
<value>Проверить доступ к репозиторию git</value>
</title>
<id>10</id>
<toolTip>
<key>ru</key>
<value>Проверить доступ к серверному репозиторию git на сервере 1С предприятия от имени пользователя под которым запущен сервер 1С.</value>
</toolTip>
<use>
<common>true</common>
</use>
<picture xsi:type="core:PictureRef">
<picture>StdPicture.CheckSyntax</picture>
</picture>
<action xsi:type="form:FormCommandHandlerContainer">
<handler>
<name>ПроверитьДоступКРепозиториюGit</name>
</handler>
</action>
<currentRowUse>Auto</currentRowUse>
</formCommands>
<formCommands>
<name>ЗагрузитьСписокВеток</name>
<title>
<key>ru</key>
<value>Загрузить список веток</value>
</title>
<id>11</id>
<toolTip>
<key>ru</key>
<value>Загрузить список веток сервера</value>
</toolTip>
<use>
<common>true</common>
</use>
<picture xsi:type="core:PictureRef">
<picture>StdPicture.MoveLeft</picture>
</picture>
<action xsi:type="form:FormCommandHandlerContainer">
<handler>
<name>ЗагрузитьСписокВеток</name>
</handler>
</action>
<currentRowUse>Auto</currentRowUse>
</formCommands>
<commandInterface>
<navigationPanel/>
<commandBar/>

View File

@ -141,9 +141,25 @@
Процедура АдресРепозиторияGitПриИзменении(Элемент)
УстановитьДоступность(ЭтаФорма);
ЗадатьВопросПроверкиДоступаПриИзменении();
КонецПроцедуры
&НаКлиенте
Процедура ПользовательСервераGitПриИзменении(Элемент)
ЗадатьВопросПроверкиДоступаПриИзменении();
КонецПроцедуры
&НаКлиенте
Процедура ПарольСервераGitПриИзменении(Элемент)
ЗадатьВопросПроверкиДоступаПриИзменении();
КонецПроцедуры
&НаКлиенте
Процедура ТипХранилищаПриИзменении(Элемент)
@ -204,7 +220,40 @@
КонецЕсли;
СоздатьРепозиторийGitНаСервере();
Если ЗначениеЗаполнено(Объект.АдресРепозиторияGit) Тогда
Результат = ПроверитьДоступКРепозиториюGitНаСервере();
Если Не Результат.Успешно Тогда
ПоказатьПредупреждение( , НСтр("ru = 'Ошибка доступа к репозиторию на сервере:'") + Символы.ПС
+ Результат.ТекстОшибки);
Возврат;
КонецЕсли;
ОбновитьИменаВеток(Результат.Ветки);
Если Результат.Ветки.Количество() > 0 Тогда
Оповещение = Новый ОписаниеОповещения("СоздатьРепозиторийGitНаСервереОтвет", ЭтотОбъект);
ТекстВопроса = НСтр("ru = 'Указанный репозиторий на сервере не пустой, содержит ветки.
|Всё равно, создать новый локальный репозиторий?'");
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Создать новый, установить адрес!'"));
Если Результат.Ветки.Найти(Объект.ИмяВетки) <> Неопределено Тогда
Кнопки.Добавить(КодВозвратаДиалога.ОК, НСтр("ru = 'Клонировать эту ветку с сервера'"));
Иначе
Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Клонировать с сервера и создать ветку'"));
КонецЕсли;
Кнопки.Добавить(КодВозвратаДиалога.Отмена);
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Отмена, НСтр("ru = 'Внимание!'"));
Возврат;
КонецЕсли;
КонецЕсли;
ТекстЛога = Новый ТекстовыйДокумент();
СоздатьРепозиторийGitНаСервере(ТекстЛога);
ТекстЛога.Показать(НСтр("ru = 'Лог операции'"), "log.txt");
КонецПроцедуры
@ -242,7 +291,31 @@
КонецЕсли;
УстановитьАдресРепозиторияGitНаСервере();
Результат = ПроверитьДоступКРепозиториюGitНаСервере();
Если НЕ Результат.Успешно Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Ошибка доступа к репозиторию на сервере:'") + Символы.ПС + Результат.ТекстОшибки);
Возврат;
КонецЕсли;
ОбновитьИменаВеток(Результат.Ветки);
Если Результат.Ветки.Найти(Объект.ИмяВетки) <> Неопределено Тогда
Оповещение = Новый ОписаниеОповещения("УстановитьАдресРепозиторияGitОтвет", ЭтотОбъект);
ТекстВопроса = СтрШаблон(НСтр("ru = 'Ветка %1 существует на сервере. При отправке изменений могут возникнуть конфилкты, которые необходимо будет разрешить вручную.
|Установить адрес сервера?'"), Объект.ИмяВетки);
Кнопки = Новый СписокЗначений();
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Понимаю, установить адрес сервера!'"));
Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Выбрать другую ветку'"));
Кнопки.Добавить(КодВозвратаДиалога.Отмена);
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки, ,КодВозвратаДиалога.Отмена, НСтр("ru = 'Внимание!'"));
Возврат;
КонецЕсли;
ТекстЛога = Новый ТекстовыйДокумент();
УстановитьАдресРепозиторияGitНаСервере(ТекстЛога, Ложь);
ТекстЛога.Показать(НСтр("ru = 'Лог операции'"), "log.txt");
КонецПроцедуры
@ -315,6 +388,59 @@
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьДоступКРепозиториюGit(Команда)
Если НЕ ЗначениеЗаполнено(Объект.АдресРепозиторияGit) Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Не указан адрес репозитория на сервере Git'"));
Возврат;
КонецЕсли;
Результат = ПроверитьДоступКРепозиториюGitНаСервере();
Если НЕ Результат.Успешно Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Ошибка доступа к репозиторию на сервере:'") + Символы.ПС + Результат.ТекстОшибки);
Возврат;
Иначе
ПоказатьПредупреждение(, НСтр("ru = 'Проверка доступа к репозиторию на сервере выполнена успешно.
|На сервере веток:'") + " " + Результат.Ветки.Количество());
КонецЕсли;
ОбновитьИменаВеток(Результат.Ветки);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьСписокВеток(Команда)
Если НЕ ЗначениеЗаполнено(Объект.АдресРепозиторияGit) Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Не указан адрес репозитория на сервере Git'"));
Возврат;
КонецЕсли;
Результат = ПроверитьДоступКРепозиториюGitНаСервере();
Если НЕ Результат.Успешно Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Ошибка запроса списка веток:'") + Символы.ПС + Результат.ТекстОшибки);
Возврат;
КонецЕсли;
ОбновитьИменаВеток(Результат.Ветки);
Если Результат.Ветки.Количество() > 0 Тогда
Оповещение = Новый ОписаниеОповещения("ВыборИмениВеткиОтвет", ЭтотОбъект);
Элементы.ИмяВетки.СписокВыбора.ПоказатьВыборЭлемента(Оповещение, НСтр("ru = 'Выберите ветку серверного репозитория'"));
Иначе
ПоказатьПредупреждение( , НСтр("ru = 'На сервере 0 веток.'"));
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@ -502,7 +628,7 @@
Если МассивФоновыхЗаданий.Количество() > 0 Тогда
Задание = МассивФоновыхЗаданий[0];
СостояниеЗадания = НСтр("ru='Выполняется конвертация с %Дата%'");
СостояниеЗадания = НСтр("ru = 'Выполняется конвертация с %Дата%'");
СостояниеЗадания = СтрЗаменить(СостояниеЗадания, "%Дата%", Задание.Начало);
Иначе
@ -585,11 +711,19 @@
Форма.Элементы.ФормаКонвертироватьВФорматEDT.Видимость = НЕ Форма.Объект.КонвертироватьВФорматEDT;
Форма.Элементы.ДобавлятьМеткиСВерсиейКонфигурации.Видимость = Форма.Объект.КонвертироватьВФорматEDT;
ЭтоHTTPАдрес = СтрНачинаетсяС(Форма.Объект.АдресРепозиторияGit, "http://")
ИЛИ СтрНачинаетсяС(Форма.Объект.АдресРепозиторияGit, "https://");
Форма.Элементы.СоздатьРепозиторийGit.Доступность = НЕ Форма.РепозиторийСоздан;
Форма.Элементы.ФормаСоздатьРепозиторийGit.Доступность = НЕ Форма.РепозиторийСоздан;
ЕстьАдрес = ЗначениеЗаполнено(Форма.Объект.АдресРепозиторияGit);
ЭтоHTTPАдрес = ЭтоHTTPАдрес(Форма.Объект.АдресРепозиторияGit);
Форма.Элементы.ПользовательСервераGit.АвтоОтметкаНезаполненного = ЭтоHTTPАдрес;
Форма.Элементы.ПарольСервераGit.АвтоОтметкаНезаполненного = ЭтоHTTPАдрес;
Форма.Элементы.ЗагрузитьСписокВеток.Доступность = ЕстьАдрес;
Форма.Элементы.УстановитьАдресРепозиторияGit.Доступность = ЕстьАдрес И Форма.РепозиторийСоздан;
Форма.Элементы.ПроверитьДоступКРепозиториюGit.Доступность = ЕстьАдрес;
ЭтоРасширение = Форма.Объект.ТипХранилища =
ПредопределенноеЗначение("Перечисление.ТипыХранилищаКонфигураций.Расширение");
@ -671,29 +805,24 @@
&НаСервере
Процедура ПроверитьНаличиеРепозитория()
Если НЕ ЗначениеЗаполнено(Объект.ЛокальныйКаталогGit) Тогда
РепозиторийСоздан = Ложь;
Если ЗначениеЗаполнено(Объект.ЛокальныйКаталогGit) Тогда
Элементы.СоздатьРепозиторийGit.Доступность = Ложь;
Элементы.ФормаСоздатьРепозиторийGit.Доступность = Ложь;
Возврат;
НайденныеФайлы = НайтиФайлы(Объект.ЛокальныйКаталогGit, "*");
Для Каждого Файл Из НайденныеФайлы Цикл
Если НРег(Файл.Имя) = ".git" Тогда
РепозиторийСоздан = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
НайденныеФайлы = НайтиФайлы(Объект.ЛокальныйКаталогGit, "*");
Для каждого Файл Из НайденныеФайлы Цикл
Если НРег(Файл.Имя) = ".git" Тогда
Элементы.СоздатьРепозиторийGit.Доступность = Ложь;
Элементы.ФормаСоздатьРепозиторийGit.Доступность = Ложь;
Возврат;
КонецЕсли;
КонецЦикла;
Элементы.СоздатьРепозиторийGit.Доступность = Истина;
Элементы.ФормаСоздатьРепозиторийGit.Доступность = Истина;
УстановитьДоступность(ЭтотОбъект);
КонецПроцедуры
@ -749,18 +878,36 @@
КонецПроцедуры
&НаСервере
Процедура СоздатьРепозиторийGitНаСервере()
Процедура СоздатьРепозиторийGitНаСервере(ЛогОперации)
КонвертацияХранилища.СоздатьРепозиторийGit(Объект.Ссылка);
КонвертацияХранилища.СоздатьРепозиторийGit(Объект.Ссылка, ЛогОперации);
ПроверитьНаличиеРепозитория();
КонецПроцедуры
&НаСервере
Процедура УстановитьАдресРепозиторияGitНаСервере()
Процедура КлонироватьРепозиторийGitСоздатьВеткуНаСервере(ЛогОперации)
КонвертацияХранилища.УстановитьАдресРепозиторияGit(Объект.Ссылка);
КонвертацияХранилища.СоздатьРепозиторийGit(Объект.Ссылка, ЛогОперации, Истина, Истина);
ПроверитьНаличиеРепозитория();
КонецПроцедуры
&НаСервере
Процедура КлонироватьРепозиторийGitНаСервере(ЛогОперации)
КонвертацияХранилища.СоздатьРепозиторийGit(Объект.Ссылка, ЛогОперации, Истина, Ложь);
ПроверитьНаличиеРепозитория();
КонецПроцедуры
&НаСервере
Процедура УстановитьАдресРепозиторияGitНаСервере(ЛогОперации, ВеткаСуществует)
КонвертацияХранилища.УстановитьАдресРепозиторияGit(Объект.Ссылка, ЛогОперации, ВеткаСуществует);
КонецПроцедуры
@ -771,4 +918,141 @@
КонецПроцедуры
&НаКлиенте
Процедура СоздатьРепозиторийGitНаСервереОтвет(Ответ, ДополнительныеПараметры) Экспорт
ТекстЛога = Новый ТекстовыйДокумент();
ПоказыватьЛог = Ложь;
Если Ответ = КодВозвратаДиалога.Да Тогда
ПоказыватьЛог = Истина;
СоздатьРепозиторийGitНаСервере(ТекстЛога);
ИначеЕсли Ответ = КодВозвратаДиалога.ОК Тогда
ПоказыватьЛог = Истина;
КлонироватьРепозиторийGitНаСервере(ТекстЛога);
ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
ПоказыватьЛог = Истина;
КлонироватьРепозиторийGitСоздатьВеткуНаСервере(ТекстЛога);
КонецЕсли;
Если ПоказыватьЛог Тогда
ТекстЛога.Показать(НСтр("ru = 'Лог операции'"), "log.txt");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьАдресРепозиторияGitОтвет(Ответ, ДополнительныеПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
ТекстЛога = Новый ТекстовыйДокумент();
УстановитьАдресРепозиторияGitНаСервере(ТекстЛога, Истина);
ТекстЛога.Показать(НСтр("ru = 'Лог операции'"), "log.txt");
ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда
Объект.ИмяВетки = "";
Модифицированность = Истина;
ЭтотОбъект.ТекущийЭлемент = Элементы.ИмяВетки;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьВопросПроверкиДоступаПриИзменении()
Если ЗначениеЗаполнено(Объект.АдресРепозиторияGit)
И НЕ РепозиторийСоздан
И (НЕ ЭтоHTTPАдрес(Объект.АдресРепозиторияGit)
ИЛИ ЗначениеЗаполнено(Объект.ПользовательСервераGit)
И ЗначениеЗаполнено(Объект.ПарольСервераGit)) Тогда
Оповещение = Новый ОписаниеОповещения("ЗадатьВопросПроверкиДоступаПриИзмененииОтвет", ЭтотОбъект);
ТекстВопроса = НСтр("ru = 'Проверить доступ к репозиторию на сервере и загрузить список веток?'");
Кнопки = Новый СписокЗначений();
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Проверить и загрузить список веток'"));
Кнопки.Добавить(КодВозвратаДиалога.Нет);
ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки, ,КодВозвратаДиалога.Да, НСтр("ru = 'Внимание!'"));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьВопросПроверкиДоступаПриИзмененииОтвет(Ответ, ДополнительныеПараметры) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
Объект.ИмяВетки = "";
Модифицированность = Истина;
Результат = ПроверитьДоступКРепозиториюGitНаСервере();
Если Не Результат.Успешно Тогда
ПоказатьПредупреждение( , НСтр("ru = 'Ошибка запроса списка веток:'") + Символы.ПС + Результат.ТекстОшибки);
Возврат;
КонецЕсли;
ОбновитьИменаВеток(Результат.Ветки);
ЭтотОбъект.ТекущийЭлемент = Элементы.ИмяВетки;
Если Результат.Ветки.Количество() > 0 Тогда
Оповещение = Новый ОписаниеОповещения("ВыборИмениВеткиОтвет", ЭтотОбъект);
Элементы.ИмяВетки.СписокВыбора.ПоказатьВыборЭлемента(Оповещение, НСтр("ru = 'Выберите ветку серверного репозитория'"));
Иначе
ПоказатьПредупреждение( , НСтр("ru = 'На сервере 0 веток.'"));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыборИмениВеткиОтвет(Ответ, ДополнительныеПараметры) Экспорт
Если ТипЗнч(Ответ) = Тип("ЭлементСпискаЗначений") Тогда
Объект.ИмяВетки = Ответ.Значение;
КонецЕсли;
КонецПроцедуры
// Параметры:
// Адрес - Строка - адрес для проверки
// Возвращаемое значение:
// Булево - Истина, если это адресс HTTP или HTTPS
&НаКлиентеНаСервереБезКонтекста
функция ЭтоHTTPАдрес(Адрес)
Возврат СтрНачинаетсяС(Адрес, "http://") ИЛИ СтрНачинаетсяС(Адрес, "https://");
КонецФункции
&НаКлиенте
Процедура ОбновитьИменаВеток(Ветки)
Элементы.ИмяВетки.СписокВыбора.Очистить();
Если Ветки.Найти("master") = Неопределено Тогда
Элементы.ИмяВетки.СписокВыбора.Добавить("master", "master (?)");
КонецЕсли;
Для Каждого Ветка Из Ветки Цикл
Элементы.ИмяВетки.СписокВыбора.Добавить(Ветка);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПроверитьДоступКРепозиториюGitНаСервере()
ЭтоHTTPАдрес = ЭтоHTTPАдрес(Объект.АдресРепозиторияGit);
АдресРепозиторияGit = Объект.АдресРепозиторияGit;
Если ЭтоHTTPАдрес Тогда
ПозицияРазделителя = СтрНайти(АдресРепозиторияGit, "://");
Если ПозицияРазделителя > 0 и ЗначениеЗаполнено(Объект.ПользовательСервераGit) Тогда
АдресРепозиторияGit = Лев(АдресРепозиторияGit, ПозицияРазделителя + 2)
+ Объект.ПользовательСервераGit + ":"
+ Объект.ПарольСервераGit + "@"
+ Прав(АдресРепозиторияGit, СтрДлина(АдресРепозиторияGit)
- ПозицияРазделителя - 2);
КонецЕсли;
КонецЕсли;
Возврат КонвертацияХранилища.ПолучитьИнформациюРепозиторияGitНаСервере(АдресРепозиторияGit);
КонецФункции
#КонецОбласти

View File

@ -1525,7 +1525,7 @@
// ВерсияEDT - Строка - номер версии EDT;
//
// Возвращаемое значение:
// Массив - Список версий поддерживаемых в EDT
// Массив из Строка - Список версий поддерживаемых в EDT
//
Функция ПолучитьСписокВерсийПлатформыEDT(ВерсияEDT) Экспорт
@ -1563,7 +1563,7 @@
КонецФункции
// Определяет количестов установленныз версий EDT. Если Истина,
// Определяет количестов установленных версий EDT. Если Истина,
// при работе с ring необходимо указать номер версии.
//
// Параметры:
@ -1593,6 +1593,61 @@
КонецФункции
// Получает информацию о серверном репозитории или возвращает текст ошибки доступа
//
// Параметры:
// АдресРепозиторияGit - Строка - адрес репозитория Git на сервере
//
// Возвращаемое значение:
// Структура - Результат запроса информации с сервера, содержит:
// * Успешно - Булево - Истина, если результат запроса к серверу был успешный
// * ТекстОшибки - Строка - текст ошибки если запрос к серверу был не успешный
// * Ветки - Массив из Строка - список имен веток доступных на сервере
//
Функция ПолучитьИнформациюРепозиторияGitНаСервере(АдресРепозиторияGit) Экспорт
ЭтоWindowsСервер = ОбщегоНазначенияПовтИсп.ЭтоWindowsСервер();
ИмяФайлаВывода = ПолучитьИмяВременногоФайла("txt");
СтрокаКоманды = "git ls-remote --heads %АдресРепозиторияGit%> ""%ИмяФайлаВывода%"" 2>&1";
СтрокаКоманды = СтрЗаменить(СтрокаКоманды, "%ИмяФайлаВывода%", ИмяФайлаВывода);
СтрокаКоманды = СтрЗаменить(СтрокаКоманды, "%АдресРепозиторияGit%", АдресРепозиторияGit);
КодВозврата = Неопределено;
ЗапуститьПриложение(?(ЭтоWindowsСервер, "cmd /C ", "")
+ СтрокаКоманды, КаталогВременныхФайлов(), Истина, КодВозврата);
Результат = Новый Структура("Успешно, ТекстОшибки, Ветки", Ложь, "", Новый Массив());
ФайлВывода = Новый ТекстовыйДокумент();
ФайлВывода.Прочитать(ИмяФайлаВывода, КодировкаТекста.UTF8);
Если КодВозврата = 0 Тогда
Результат.Успешно = Истина;
Для НомерСтроки = 1 По ФайлВывода.КоличествоСтрок() Цикл
ИмяВетки = СокрЛП(ФайлВывода.ПолучитьСтроку(НомерСтроки));
ПозицияТаб = СтрНайти(ИмяВетки, Символы.Таб);
Если ПозицияТаб > 0 Тогда
ИмяВетки = СокрЛП(Сред(ИмяВетки, ПозицияТаб + 1));
КонецЕсли;
Если СтрНачинаетсяС(ИмяВетки, "refs/heads/") Тогда
ИмяВетки = Сред(ИмяВетки, 12);
КонецЕсли;
Результат.Ветки.Добавить(ИмяВетки);
КонецЦикла;
Иначе
Результат.Успешно = Ложь;
Результат.ТекстОшибки = ФайлВывода.ПолучитьТекст();
КонецЕсли;
Возврат Результат;
КонецФункции
// Считывает структуру выгрузки версии из файлов
//
// Параметры:
@ -1952,7 +2007,10 @@
//
// Параметры:
// Хранилище - СправочникСсылка.ХранилищаКонфигураций - Ссылка на хранилище, по которому выполняются коммиты
Процедура СоздатьРепозиторийGit(Хранилище) Экспорт
// ЛогОперации - ТекстовыйДокумент - документ в который будет прочитан лог выполенения операции
// Клонировать - Булево - клонировать с сервера существующий репозиторий
// СоздатьВетку - Булево - Создать новую ветку от основной ветки серверного репозитория
Процедура СоздатьРепозиторийGit(Хранилище, ЛогОперации, Клонировать = Ложь, СоздатьВетку = Ложь) Экспорт
ЭтоWindowsСервер = ОбщегоНазначенияПовтИсп.ЭтоWindowsСервер();
@ -1960,28 +2018,20 @@
| ИмяПроектаEDT, ПользовательСервераGit, ПарольСервераGit, ИмяВетки",
"ВерсияВGit", "ВерсияВGit.Код");
РеквизитыХранилища = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Хранилище, ИменаРеквизитов);
Файл = Новый Файл(РеквизитыХранилища.ЛокальныйКаталогGit);
Если Не Файл.Существует() Тогда
СоздатьКаталог(РеквизитыХранилища.ЛокальныйКаталогGit);
КонецЕсли;
КаталогВыгрузкиВРепозитории = КаталогФайловПроектаВРепозитории(РеквизитыХранилища);
МассивКаталогов = СтрРазделить(КаталогВыгрузкиВРепозитории, ПолучитьРазделительПути(), Ложь);
ПутьККаталогу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(РеквизитыХранилища.ЛокальныйКаталогGit);
Для Каждого ИмяКаталога Из МассивКаталогов Цикл
ПутьККаталогу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьККаталогу + ИмяКаталога);
Файл = Новый Файл(ПутьККаталогу);
Если Не Файл.Существует() Тогда
СоздатьКаталог(ПутьККаталогу);
КонецЕсли;
КонецЦикла;
СоздатьКаталогиВИерерахии(РеквизитыХранилища.КаталогВыгрузкиВерсий);
СоздатьКаталогиВИерерахии(РеквизитыХранилища.ЛокальныйКаталогGit);
КаталогВыгрузкиВРепозитории = КаталогФайловПроектаВРепозитории(РеквизитыХранилища);
ФайлЛога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(РеквизитыХранилища.КаталогВыгрузкиВерсий)
+ "git_log_init" + ".txt";
ФайлКомандыGit = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(РеквизитыХранилища.КаталогВыгрузкиВерсий)
+ "git_command_init" + ?(ЭтоWindowsСервер, ".bat", ".sh");
Параметры = Новый Структура("ИмяФайлаЛога", ФайлЛога);
ДобавитьЗаписьВЛог(Параметры, НСтр("ru = 'Начало инициализации Git репозитория'"));
ФайлКоманды = Новый ТекстовыйДокумент;
Если НЕ ЭтоWindowsСервер Тогда
@ -2009,8 +2059,38 @@
ФайлКоманды.ДобавитьСтроку(ТекстКомандыУстановкиКаталога);
// Инициализация репозитория
ТекстКоманды = "git init" + ВыводЛога;
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
АдресРепозиторияGit = РеквизитыХранилища.АдресРепозиторияGit;
ПозицияРазделителя = СтрНайти(АдресРепозиторияGit, "://");
Если ПозицияРазделителя > 0 Тогда
АдресРепозиторияGit = Лев(АдресРепозиторияGit, ПозицияРазделителя + 2)
+ РеквизитыХранилища.ПользовательСервераGit + ":" + РеквизитыХранилища.ПарольСервераGit + "@" + Прав(
АдресРепозиторияGit, СтрДлина(АдресРепозиторияGit) - ПозицияРазделителя - 2);
КонецЕсли;
Если Клонировать И Не СоздатьВетку И ЗначениеЗаполнено(АдресРепозиторияGit) Тогда
ТекстКоманды = "git clone -b ""%ИмяВетки%"" %АдресРепозиторияGit% ." + ВыводЛога;
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%АдресРепозиторияGit%", АдресРепозиторияGit);
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%ИмяВетки%", РеквизитыХранилища.ИмяВетки);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ИначеЕсли Клонировать И СоздатьВетку И ЗначениеЗаполнено(АдресРепозиторияGit) Тогда
ТекстКоманды = "git clone %АдресРепозиторияGit% ." + ВыводЛога;
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%АдресРепозиторияGit%", АдресРепозиторияGit);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "git checkout -b ""%ИмяВетки%""" + ВыводЛога;
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%ИмяВетки%", РеквизитыХранилища.ИмяВетки);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
Иначе
ТекстКоманды = "git init" + ВыводЛога;
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
Если ЗначениеЗаполнено(АдресРепозиторияGit) Тогда
ТекстКоманды = "git remote add origin %АдресРепозиторияGit%" + ВыводЛога;
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%АдресРепозиторияGit%", АдресРепозиторияGit);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "git fetch origin" + ВыводЛога;
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
КонецЕсли;
КонецЕсли;
// Делаем пути к файлам русскоязычными
ТекстКоманды = "git config --local core.quotepath false" + ВыводЛога;
@ -2042,38 +2122,20 @@
КонецЕсли;
ТекстКоманды = "git config --local core.safecrlf warn" + ВыводЛога;
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
// Инициализация репозитория на сервере
АдресРепозиторияGit = РеквизитыХранилища.АдресРепозиторияGit;
ПозицияРазделителя = СтрНайти(АдресРепозиторияGit, "://");
Если ПозицияРазделителя > 0 Тогда
ТекстКоманды = "git remote add origin %АдресРепозиторияGit%" + ВыводЛога;
АдресРепозиторияGit = Лев(АдресРепозиторияGit, ПозицияРазделителя + 2)
+ РеквизитыХранилища.ПользовательСервераGit + ":"
+ РеквизитыХранилища.ПарольСервераGit + "@"
+ Прав(АдресРепозиторияGit, СтрДлина(АдресРепозиторияGit)
- ПозицияРазделителя - 2);
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%АдресРепозиторияGit%", АдресРепозиторияGit);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "git fetch origin" + ВыводЛога;
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "git branch --set-upstream-to=origin/%ИмяВетки% %ИмяВетки%" + ВыводЛога;
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%ИмяВетки%", РеквизитыХранилища.ИмяВетки);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
КонецЕсли;
ТекстКоманды = "git status" + ВыводЛога;
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
Если ЭтоWindowsСервер Тогда
ФайлКоманды.Записать(ФайлКомандыGit, КодировкаТекста.OEM);
Иначе
ФайлКоманды.Записать(ФайлКомандыGit, КодировкаТекста.Системная, Символы.ПС);
КонецЕсли;
ЗапуститьПриложение(?(ЭтоWindowsСервер, "", "bash ")
+ ФайлКомандыGit, РеквизитыХранилища.ЛокальныйКаталогGit, Истина);
СоздатьКаталогиВИерерахии(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(РеквизитыХранилища.ЛокальныйКаталогGit) + КаталогВыгрузкиВРепозитории);
ИмяФайлаИсключений = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(РеквизитыХранилища.ЛокальныйКаталогGit)
+ ".gitignore";
ЕстьИсключениеИндекса = Ложь;
@ -2116,14 +2178,35 @@
ФайлАтрибутов.ДобавитьСтроку("*.addin binary");
ФайлАтрибутов.Записать(ИмяФайлаАтрибутов);
КонецЕсли;
// Добавляем изменения в индекс и проверяем статус
СтрокаКоманды = "git add --all ./ >> ""%ФайлЛога%"" 2>&1 && git status >> ""%ФайлЛога%"" 2>&1";
СтрокаКоманды = СтрЗаменить(СтрокаКоманды, "%ФайлЛога%", ФайлЛога);
КодВозврата = Неопределено;
ЗапуститьПриложение(?(ЭтоWindowsСервер, "cmd /C ", "")
+ СтрокаКоманды, РеквизитыХранилища.ЛокальныйКаталогGit, Истина, КодВозврата);
Если КодВозврата <> Неопределено И КодВозврата <> 0 Тогда
ДобавитьЗаписьВЛог(Параметры, НСтр("ru = 'Инициализация Git репозитория выполнена с ошибкой.'"));
КонецЕсли;
ДобавитьЗаписьВЛог(Параметры, НСтр("ru = 'Окончание инициализации Git репозитория'"));
Файл = Новый Файл(ФайлЛога);
Если Файл.Существует() Тогда
ЛогОперации.Прочитать(ФайлЛога, КодировкаТекста.UTF8);
КонецЕсли;
КонецПроцедуры
// Выполняет инициализацию хранилища в Git
// Устанавливает адрес серверного хранилища в Git в локальный репозиторий
//
// Параметры:
// Хранилище - СправочникСсылка.ХранилищаКонфигураций - Ссылка на хранилище, по которому выполняются коммиты
Процедура УстановитьАдресРепозиторияGit(Хранилище) Экспорт
// ЛогОперации - ТабличныйДокумент - документ в который будет прочитан лог выполенения операции
// ВеткаСуществует - Булево - серверная ветка существует
Процедура УстановитьАдресРепозиторияGit(Хранилище, ЛогОперации, ВеткаСуществует) Экспорт
ЭтоWindowsСервер = ОбщегоНазначенияПовтИсп.ЭтоWindowsСервер();
@ -2134,7 +2217,10 @@
+ "git_log_add_remote" + ".txt";
ФайлКомандыGit = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(РеквизитыХранилища.КаталогВыгрузкиВерсий)
+ "git_command_add_remote" + ?(ЭтоWindowsСервер, ".bat", ".sh");
Параметры = Новый Структура("ИмяФайлаЛога", ФайлЛога);
ДобавитьЗаписьВЛог(Параметры, НСтр("ru = 'Начало добавления адреса Git репозитория'"));
ФайлКоманды = Новый ТекстовыйДокумент;
Если НЕ ЭтоWindowsСервер Тогда
@ -2184,9 +2270,11 @@
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "git fetch origin" + ВыводЛога;
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
ТекстКоманды = "git branch --set-upstream-to=origin/%ИмяВетки% %ИмяВетки%" + ВыводЛога;
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%ИмяВетки%", РеквизитыХранилища.ИмяВетки);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
Если ВеткаСуществует Тогда
ТекстКоманды = "git branch --set-upstream-to=origin/%ИмяВетки% %ИмяВетки%" + ВыводЛога;
ТекстКоманды = СтрЗаменить(ТекстКоманды, "%ИмяВетки%", РеквизитыХранилища.ИмяВетки);
ФайлКоманды.ДобавитьСтроку(ТекстКоманды);
КонецЕсли;
КонецЕсли;
Если ЭтоWindowsСервер Тогда
@ -2200,9 +2288,14 @@
+ ФайлКомандыGit, РеквизитыХранилища.ЛокальныйКаталогGit, Истина, КодВозврата);
Если КодВозврата <> Неопределено И КодВозврата <> 0 Тогда
ТекстШаблона = НСтр("ru = 'Установка адреса Git-сервера выполнена с ошибкой.
|Файл лога: %ФайлЛога%'");
ВызватьИсключение СтрЗаменить(ТекстШаблона, "%ФайлЛога%", ФайлЛога);
ДобавитьЗаписьВЛог(Параметры, НСтр("ru = 'Установка адреса Git-сервера выполнена с ошибкой.'"));
КонецЕсли;
ДобавитьЗаписьВЛог(Параметры, НСтр("ru = 'Окончание добавления адреса Git репозитория'"));
Файл = Новый Файл(ФайлЛога);
Если Файл.Существует() Тогда
ЛогОперации.Прочитать(ФайлЛога, КодировкаТекста.UTF8);
КонецЕсли;
КонецПроцедуры
@ -3996,7 +4089,7 @@
Если Параметры.Свойство("ИмяФайлаЛога") И ЗначениеЗаполнено(Параметры.ИмяФайлаЛога) Тогда
Лог = Новый ЗаписьТекста();
Лог.Открыть(Параметры.ИмяФайлаЛога, , , Истина);
Лог.Открыть(Параметры.ИмяФайлаЛога, КодировкаТекста.UTF8, , Истина);
Лог.ЗаписатьСтроку(Строка(ТекущаяДатаСеанса()) + " " + ТекстЛога);
Если ЗначениеЗаполнено(Комментарий) Тогда
Лог.ЗаписатьСтроку(Комментарий);
@ -4172,4 +4265,27 @@
КонецПроцедуры
Процедура СоздатьКаталогиВИерерахии(Знач ПутьККаталогу)
ЭтоWindowsСервер = ОбщегоНазначенияПовтИсп.ЭтоWindowsСервер();
МассивКаталогов = СтрРазделить(ПутьККаталогу, ПолучитьРазделительПути(), Ложь);
ПутьККаталогу = Лев(ПутьККаталогу, Найти(ПутьККаталогу, ПолучитьРазделительПути()));
Если ЭтоWindowsСервер
И МассивКаталогов.Количество() > 1
И СтрНайти(МассивКаталогов[0], ":") > 0
ИЛИ СтрДлина(ПутьККаталогу) > СтрДлина(ПолучитьРазделительПути()) Тогда
МассивКаталогов.Удалить(0);
КонецЕсли;
Для Каждого ИмяКаталога Из МассивКаталогов Цикл
ПутьККаталогу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьККаталогу + ИмяКаталога);
Файл = Новый Файл(ПутьККаталогу);
Если Не Файл.Существует() Тогда
СоздатьКаталог(ПутьККаталогу);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти