├── docs └── .gitkepp ├── tests └── fixtures │ ├── extension_storage │ ├── data │ │ ├── ver │ │ ├── objects │ │ │ ├── 15 │ │ │ │ └── af5e8f18aea8397ae287ef2f0f237eca7ba410 │ │ │ ├── 51 │ │ │ │ └── ddb08f4a5453469fb93b1cdc90304d747357b7 │ │ │ ├── 90 │ │ │ │ └── 5786cba6e9271268f277226315b61c46427718 │ │ │ ├── 09 │ │ │ │ └── 0694564fb2cc20d4ee82dff29581aea6ebceb2 │ │ │ ├── 3e │ │ │ │ └── 09dd8ca40ee4c38920ec37b53860a6335d9749 │ │ │ └── fd │ │ │ │ └── 94de288b43ff531cadf282f9664dd70031a9cb │ │ └── pack │ │ │ ├── pack-c262dc49d0c6254821c6af2f1aaced0d0d28d2b3.ind │ │ │ └── pack-c262dc49d0c6254821c6af2f1aaced0d0d28d2b3.pck │ ├── ver │ └── 1cv8ddb.1CD │ ├── edtWorkspace │ ├── .metadata │ │ └── .plugins │ │ │ └── org.eclipse.core.resources │ │ │ ├── .root │ │ │ ├── .indexes │ │ │ │ ├── history.version │ │ │ │ ├── properties.version │ │ │ │ └── properties.index │ │ │ └── 2.tree │ │ │ ├── .projects │ │ │ └── edtExport │ │ │ │ ├── .indexes │ │ │ │ └── properties.index │ │ │ │ ├── org.eclipse.egit.core │ │ │ │ └── GitProjectData.properties │ │ │ │ └── .markers │ │ │ └── .safetable │ │ │ └── org.eclipse.core.resources │ └── edtExport │ │ ├── DT-INF │ │ └── PROJECT.PMF │ │ ├── .settings │ │ └── org.eclipse.core.resources.prefs │ │ ├── src │ │ ├── CommonModules │ │ │ ├── ОбщийМодуль1 │ │ │ │ ├── Module.bsl │ │ │ │ └── ОбщийМодуль1.mdo │ │ │ └── Тестирование │ │ │ │ ├── Тестирование.mdo │ │ │ │ └── Module.bsl │ │ ├── Configuration │ │ │ ├── ManagedApplicationModule.bsl │ │ │ └── Configuration.mdo │ │ ├── Catalogs │ │ │ └── Справочник1 │ │ │ │ ├── Forms │ │ │ │ └── ФормаСписка │ │ │ │ │ └── Form.oform │ │ │ │ └── Справочник1.mdo │ │ ├── Roles │ │ │ └── ПолныеПрава │ │ │ │ ├── ПолныеПрава.mdo │ │ │ │ └── Rights.rights │ │ └── SessionParameters │ │ │ ├── ПараметрыТестирования │ │ │ └── ПараметрыТестирования.mdo │ │ │ └── РежимТестированияВключен │ │ │ └── РежимТестированияВключен.mdo │ │ └── .project │ ├── ТестовыйФайлКонфигурации.cf │ ├── ТестовыйФайлХранилища1С.1CD │ ├── ТестовыйФайлКонфигурации_8_2_17.cf │ └── ОтчетПоВерсиямХранилищаРасширения.mxl ├── bin ├── v8unpack │ ├── v8unpack.dll │ ├── v8unpack_d.exe │ └── v8unpack_1.0.19.dll └── cTool_1CD │ └── cTool_1CD.exe ├── .gitignore ├── src └── Классы │ ├── internal │ ├── bindata │ │ └── Классы │ │ │ ├── МенеджерЗапакованныхФайловGitsyncPlugins.os │ │ │ └── ЗагрузчикЗапакованныхФайловGitsyncPlugins.os │ ├── tool1cd │ │ ├── Модули │ │ │ └── Загрузчик_tool1CD.os │ │ └── Классы │ │ │ ├── ЧтениеХранилищаКонфигурации.os │ │ │ └── ЧтениеТаблицФайловойБазыДанных.os │ └── v8unpack │ │ └── Классы │ │ └── РаспаковкаФорм.os │ ├── disableSupport.os │ ├── plugin.os.template │ ├── checkAuthors.os │ ├── roboCopy.os │ ├── replaceAuthors.os │ ├── unpackForm.os │ ├── limit.os │ ├── increment.os │ ├── syncRemote.os │ ├── checkComments.os │ ├── smartTags.os │ ├── dropSupport.os │ └── dropConfigDump.os ├── .bsl-language-server.json ├── sonar-project.properties ├── LICENSE ├── CONTRIBUTING.md ├── features ├── step_definitions │ ├── smart-tags.os │ ├── limit.os │ ├── edtExport.os │ └── increment.os ├── dropConfigDump.feature ├── check-authors.feature ├── tool1CD.feature ├── smart-tags.feature ├── check-comments.feature ├── increment.feature ├── useIbcmd.feature ├── compatibility.feature ├── unpackForm.feature ├── limit.feature ├── edtExport.feature └── sync-remote.feature ├── .github └── workflows │ ├── release.yml │ ├── qa.yml │ └── testing.yml ├── tasks ├── install-plugins.os ├── test.os ├── coverage.os ├── install-gitsync.os ├── pack.os └── make.os ├── README.md └── packagedef /docs/.gitkepp: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/fixtures/extension_storage/data/ver: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /tests/fixtures/extension_storage/ver: -------------------------------------------------------------------------------- 1 | {0,2,8,3,14,1533,"Designer"} -------------------------------------------------------------------------------- /tests/fixtures/extension_storage/data/objects/15/af5e8f18aea8397ae287ef2f0f237eca7ba410: -------------------------------------------------------------------------------- 1 | {0,0} -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/DT-INF/PROJECT.PMF: -------------------------------------------------------------------------------- 1 | Runtime-Version: 8.3.14 2 | Manifest-Version: 1.0 3 | -------------------------------------------------------------------------------- /bin/v8unpack/v8unpack.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/bin/v8unpack/v8unpack.dll -------------------------------------------------------------------------------- /bin/cTool_1CD/cTool_1CD.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/bin/cTool_1CD/cTool_1CD.exe -------------------------------------------------------------------------------- /bin/v8unpack/v8unpack_d.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/bin/v8unpack/v8unpack_d.exe -------------------------------------------------------------------------------- /bin/v8unpack/v8unpack_1.0.19.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/bin/v8unpack/v8unpack_1.0.19.dll -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding/=UTF-8 3 | -------------------------------------------------------------------------------- /tests/fixtures/ТестовыйФайлКонфигурации.cf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/ТестовыйФайлКонфигурации.cf -------------------------------------------------------------------------------- /tests/fixtures/ТестовыйФайлХранилища1С.1CD: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/ТестовыйФайлХранилища1С.1CD -------------------------------------------------------------------------------- /tests/fixtures/extension_storage/1cv8ddb.1CD: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/extension_storage/1cv8ddb.1CD -------------------------------------------------------------------------------- /tests/fixtures/ТестовыйФайлКонфигурации_8_2_17.cf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/ТестовыйФайлКонфигурации_8_2_17.cf -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/src/CommonModules/ОбщийМодуль1/Module.bsl: -------------------------------------------------------------------------------- 1 | Процедура Тестовая() 2 | // ком1 3 | // ком2 4 | // ком3 5 | // ком4 6 | КонецПроцедуры -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/src/Configuration/ManagedApplicationModule.bsl: -------------------------------------------------------------------------------- 1 | 2 | Процедура ПриНачалеРаботыСистемы() 3 | Сообщить("Начинаем 1"); 4 | КонецПроцедуры 5 | -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/.metadata/.plugins/org.eclipse.core.resources/.projects/edtExport/.indexes/properties.index: -------------------------------------------------------------------------------- 1 | org.eclipse.team.core 2 | repository!org.eclipse.egit.core.GitProvider -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index: -------------------------------------------------------------------------------- 1 | /org.eclipse.core.resourcescontentCacheState2contentCacheTimestamp 1588920119652 -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/.metadata/.plugins/org.eclipse.core.resources/.projects/edtExport/org.eclipse.egit.core/GitProjectData.properties: -------------------------------------------------------------------------------- 1 | #GitProjectData 2 | #Tue May 12 11:59:34 VLAT 2020 3 | .gitdir=../../../../.git 4 | -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/.metadata/.plugins/org.eclipse.core.resources/.root/2.tree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/edtWorkspace/.metadata/.plugins/org.eclipse.core.resources/.root/2.tree -------------------------------------------------------------------------------- /tests/fixtures/extension_storage/data/objects/09/0694564fb2cc20d4ee82dff29581aea6ebceb2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/extension_storage/data/objects/09/0694564fb2cc20d4ee82dff29581aea6ebceb2 -------------------------------------------------------------------------------- /tests/fixtures/extension_storage/data/objects/3e/09dd8ca40ee4c38920ec37b53860a6335d9749: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/extension_storage/data/objects/3e/09dd8ca40ee4c38920ec37b53860a6335d9749 -------------------------------------------------------------------------------- /tests/fixtures/extension_storage/data/objects/51/ddb08f4a5453469fb93b1cdc90304d747357b7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/extension_storage/data/objects/51/ddb08f4a5453469fb93b1cdc90304d747357b7 -------------------------------------------------------------------------------- /tests/fixtures/extension_storage/data/objects/90/5786cba6e9271268f277226315b61c46427718: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/extension_storage/data/objects/90/5786cba6e9271268f277226315b61c46427718 -------------------------------------------------------------------------------- /tests/fixtures/extension_storage/data/objects/fd/94de288b43ff531cadf282f9664dd70031a9cb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/extension_storage/data/objects/fd/94de288b43ff531cadf282f9664dd70031a9cb -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/src/Catalogs/Справочник1/Forms/ФормаСписка/Form.oform: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/edtWorkspace/edtExport/src/Catalogs/Справочник1/Forms/ФормаСписка/Form.oform -------------------------------------------------------------------------------- /tests/fixtures/extension_storage/data/pack/pack-c262dc49d0c6254821c6af2f1aaced0d0d28d2b3.ind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/extension_storage/data/pack/pack-c262dc49d0c6254821c6af2f1aaced0d0d28d2b3.ind -------------------------------------------------------------------------------- /tests/fixtures/extension_storage/data/pack/pack-c262dc49d0c6254821c6af2f1aaced0d0d28d2b3.pck: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/extension_storage/data/pack/pack-c262dc49d0c6254821c6af2f1aaced0d0d28d2b3.pck -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/.metadata/.plugins/org.eclipse.core.resources/.projects/edtExport/.markers: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/edtWorkspace/.metadata/.plugins/org.eclipse.core.resources/.projects/edtExport/.markers -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oscript-library/gitsync-plugins/HEAD/tests/fixtures/edtWorkspace/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.ospx 2 | 3 | build/* 4 | 5 | coverage/* 6 | 7 | bin_gitsync/* 8 | bin/gitsync.exe 9 | bin/gitsync 10 | bin/build_gitsync.bat 11 | tests/*.xml 12 | 13 | exec.log 14 | bdd-log*.xml 15 | 16 | .enabled-plugins 17 | 18 | *.1CD. 19 | *.cfl 20 | *.1CL 21 | 1cv8dtmp.1CD 22 | 23 | oscript_modules/ 24 | .vscode -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/src/CommonModules/ОбщийМодуль1/ОбщийМодуль1.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ОбщийМодуль1 4 | true 5 | 6 | -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/src/Roles/ПолныеПрава/ПолныеПрава.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ПолныеПрава 4 | 5 | ru 6 | Полные права 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/src/CommonModules/Тестирование/Тестирование.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | Тестирование 4 | 5 | ru 6 | Тестирование 7 | 8 | true 9 | true 10 | true 11 | 12 | -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/src/SessionParameters/ПараметрыТестирования/ПараметрыТестирования.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | ПараметрыТестирования 4 | 5 | ru 6 | Параметры тестирования 7 | 8 | 9 | ValueStorage 10 | 11 | 12 | -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/src/SessionParameters/РежимТестированияВключен/РежимТестированияВключен.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | РежимТестированияВключен 4 | 5 | ru 6 | Режим тестирования включен 7 | 8 | 9 | Boolean 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/Классы/internal/bindata/Классы/МенеджерЗапакованныхФайловGitsyncPlugins.os: -------------------------------------------------------------------------------- 1 | Функция ПолучитьИндексФайлов() Экспорт 2 | 3 | ИндексФайлов = Новый Соответствие; 4 | ИндексФайлов.Вставить("v8unpack.dll", "v8unpack_gitsync_plugins"); 5 | ИндексФайлов.Вставить("v8unpack_1.0.19.dll", "v8unpack_1_0_19_gitsync_plugins"); 6 | ИндексФайлов.Вставить("v8unpack_d.exe", "v8unpack_d_gitsync_plugins"); 7 | ИндексФайлов.Вставить("cTool_1CD.exe", "cTool_1CD_gitsync_plugins"); 8 | 9 | Возврат ИндексФайлов; 10 | 11 | КонецФункции 12 | -------------------------------------------------------------------------------- /.bsl-language-server.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://1c-syntax.github.io/bsl-language-server/configuration/schema.json", 3 | "language": "ru", 4 | "diagnostics": { 5 | "parameters": { 6 | "LineLength": { 7 | "maxLineLength": 150 8 | }, 9 | "MissingSpace": { 10 | "allowMultipleCommas": true 11 | }, 12 | "Typo": { 13 | "minWordLength": 3, 14 | "userWordsToIgnore": "Закоммитить,Коммитом,Коммита,Коммите,тэг,Тэг,Инкрементально," 15 | } 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | edtExport 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.xtext.ui.shared.xtextBuilder 10 | 11 | 12 | 13 | 14 | 15 | com._1c.g5.v8.dt.core.V8ConfigurationNature 16 | org.eclipse.xtext.ui.shared.xtextNature 17 | 18 | 19 | -------------------------------------------------------------------------------- /sonar-project.properties: -------------------------------------------------------------------------------- 1 | # must be unique in a given SonarQube instance 2 | sonar.projectKey=gitsync-plugins 3 | 4 | # this is the name displayed in the SonarQube UI 5 | sonar.projectName=gitsync-plugins 6 | 7 | # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. 8 | # Since SonarQube 4.2, this property is optional if sonar.modules is set. 9 | # If not set, SonarQube starts looking for source code from the directory containing 10 | # the sonar-project.properties file. 11 | 12 | sonar.sources=./src 13 | 14 | # Encoding of the source code. Default is default system encoding 15 | sonar.sourceEncoding=UTF-8 16 | 17 | sonar.coverageReportPaths=coverage/genericCoverage.xml 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Aleksey Khorev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Руководство контрибьютора 2 | 3 | Доработка проводится по github-flow, основная ветка - master. Жду ваших PR. 4 | 5 | Для удобства доработки в каталог ./tests/fixtures сохранены выгрузки отчетов по версиям хранилища в формате mxl. Можно ориентироваться на них при написании тестов. Обратите внимание, что комментарий к версии хранилища может неточно описывать изменения в этой версии. 6 | 7 | ## Требования к окружению 8 | 9 | - Установленная Платформа 1С 10 | - Установленная EDT 11 | 12 | ## Запуск тестов 13 | 14 | - Установить значение переменной GITSYNC_V8VERSION, например: 15 | - `set GITSYNC_V8VERSION=8.3.21` # Windows 16 | - `export GITSYNC_V8VERSION=8.3.21` # Linux 17 | 18 | Если переменная не указана, то версию платформы выберет установленная у вас библиотека v8find. 19 | 20 | - Установить значение переменной EDT_VERSION, например: 21 | - `set EDT_VERSION=2023.3.6` # Windows 22 | - `export EDT_VERSION=2023.3.6` # Linux 23 | 24 | По умолчанию используется версия 2022.2.5 25 | 26 | - Выполнить команду, которая устанавливает gitsync в каталог bin_gitsync 27 | - `opm run install-gitsync` 28 | - Запустить тесты 29 | - `opm test` 30 | -------------------------------------------------------------------------------- /src/Классы/internal/tool1cd/Модули/Загрузчик_tool1CD.os: -------------------------------------------------------------------------------- 1 | #Использовать "../../bindata" 2 | 3 | Перем ПутьКИсполняемомуФайлу; 4 | 5 | // Возвращает путь к файлу cTool_1CD 6 | // 7 | // Возвращаемое значение: 8 | // Строка - путь к исполняемому файлу cTool_1CD 9 | // 10 | Функция ПутьКФайлу() Экспорт 11 | 12 | Если Не ФайлСуществует() Тогда 13 | ВыполнитьЗагрузку(); 14 | КонецЕсли; 15 | 16 | Возврат ПутьКИсполняемомуФайлу; 17 | 18 | КонецФункции 19 | 20 | Функция ФайлСуществует() 21 | 22 | Если ПутьКИсполняемомуФайлу = Неопределено Тогда 23 | Возврат Ложь; 24 | КонецЕсли; 25 | 26 | ПроверяемыйФайл = Новый Файл(ПутьКИсполняемомуФайлу); 27 | 28 | Если ПроверяемыйФайл.Существует() Тогда 29 | Возврат Истина; 30 | КонецЕсли; 31 | 32 | Возврат Ложь; 33 | 34 | КонецФункции 35 | 36 | // Выполняет подключение внешней библиотеки 37 | // 38 | Процедура ВыполнитьЗагрузку() 39 | 40 | ЗагрузчикДвоичныхДанных = Новый ЗагрузчикЗапакованныхФайловGitsyncPlugins; 41 | ПутьКИсполняемомуФайлу = ЗагрузчикДвоичныхДанных.ПолучитьПутьКФайлу("cTool_1CD.exe"); 42 | 43 | Если НЕ ФайлСуществует() Тогда 44 | ВызватьИсключение "Не удалось выполнить загрузку файла из запакованных данных"; 45 | КонецЕсли; 46 | 47 | КонецПроцедуры 48 | -------------------------------------------------------------------------------- /features/step_definitions/smart-tags.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | 3 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd 4 | 5 | Перем БДД; //контекст фреймворка 1bdd 6 | 7 | // Метод выдает список шагов, реализованных в данном файле-шагов 8 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт 9 | БДД = КонтекстФреймворкаBDD; 10 | 11 | ВсеШаги = Новый Массив; 12 | 13 | ВсеШаги.Добавить("ТегДолженПрисутствоватьВРепозитории"); 14 | 15 | Возврат ВсеШаги; 16 | КонецФункции 17 | 18 | // Реализация шагов 19 | 20 | // Процедура выполняется перед запуском каждого сценария 21 | Процедура ПередЗапускомСценария(Знач Узел) Экспорт 22 | 23 | КонецПроцедуры 24 | 25 | // Процедура выполняется после завершения каждого сценария 26 | Процедура ПослеЗапускаСценария(Знач Узел) Экспорт 27 | 28 | КонецПроцедуры 29 | 30 | //Тег "1.0" должен присутствовать в репозитории 31 | Процедура ТегДолженПрисутствоватьВРепозитории(Знач ОжидаемыйВыводКоманды) Экспорт 32 | 33 | 34 | ГитРепозиторий = БДД.ПолучитьИзКонтекста("ГитРепозиторий"); 35 | ПутьКаталогаИсходников = БДД.ПолучитьИзКонтекста("ПутьКаталогаИсходников"); 36 | ГитРепозиторий.УстановитьРабочийКаталог(ПутьКаталогаИсходников); 37 | 38 | ПараметрыКоманды = Новый Массив; 39 | ПараметрыКоманды.Добавить("tag"); 40 | ПараметрыКоманды.Добавить("-l"); 41 | ГитРепозиторий.ВыполнитьКоманду(ПараметрыКоманды); 42 | Вывод = ГитРепозиторий.ПолучитьВыводКоманды(); 43 | 44 | Ожидаем.Что(Вывод).Содержит(ОжидаемыйВыводКоманды); 45 | 46 | КонецПроцедуры 47 | 48 | -------------------------------------------------------------------------------- /features/step_definitions/limit.os: -------------------------------------------------------------------------------- 1 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd 2 | #Использовать tempfiles 3 | #Использовать asserts 4 | 5 | Перем БДД; //контекст фреймворка 1bdd 6 | 7 | // Метод выдает список шагов, реализованных в данном файле-шагов 8 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт 9 | БДД = КонтекстФреймворкаBDD; 10 | 11 | ВсеШаги = Новый Массив; 12 | 13 | ВсеШаги.Добавить("КоличествоКоммитовДолжноБыть"); 14 | 15 | Возврат ВсеШаги; 16 | КонецФункции 17 | 18 | // Реализация шагов 19 | 20 | // Процедура выполняется перед запуском каждого сценария 21 | Процедура ПередЗапускомСценария(Знач Узел) Экспорт 22 | 23 | КонецПроцедуры 24 | 25 | // Процедура выполняется после завершения каждого сценария 26 | Процедура ПослеЗапускаСценария(Знач Узел) Экспорт 27 | ВременныеФайлы.Удалить(); 28 | КонецПроцедуры 29 | 30 | //Количество коммитов должно быть "5" 31 | Процедура КоличествоКоммитовДолжноБыть(Знач ЧислоПроверки) Экспорт 32 | 33 | ГитРепозиторий = БДД.ПолучитьИзКонтекста("ГитРепозиторий"); 34 | ПутьКаталогаИсходников = БДД.ПолучитьИзКонтекста("ПутьКаталогаИсходников"); 35 | ГитРепозиторий.УстановитьРабочийКаталог(ПутьКаталогаИсходников); 36 | 37 | ПараметрыКоманды = Новый Массив; 38 | ПараметрыКоманды.Добавить("log"); 39 | ПараметрыКоманды.Добавить("--pretty=oneline"); 40 | ГитРепозиторий.ВыполнитьКоманду(ПараметрыКоманды); 41 | Вывод = ГитРепозиторий.ПолучитьВыводКоманды(); 42 | 43 | МассивСтрок = СтрРазделить(Вывод, Символы.ПС, Ложь); 44 | 45 | КоличествоКоммитов = МассивСтрок.Количество(); 46 | 47 | Утверждения.ПроверитьРавенство(Число(ЧислоПроверки), КоличествоКоммитов, "Количество коммитов должно быть равно"); 48 | 49 | КонецПроцедуры 50 | -------------------------------------------------------------------------------- /features/step_definitions/edtExport.os: -------------------------------------------------------------------------------- 1 | // BSLLS:LatinAndCyrillicSymbolInWord-off 2 | // BSLLS:MissingReturnedValueDescription-off 3 | // BSLLS:MissingParameterDescription-off 4 | 5 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd 6 | 7 | #Использовать fs 8 | 9 | Перем БДД; //контекст фреймворка 1bdd 10 | 11 | // Метод выдает список шагов, реализованных в данном файле-шагов 12 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт 13 | БДД = КонтекстФреймворкаBDD; 14 | 15 | ВсеШаги = Новый Массив; 16 | 17 | ВсеШаги.Добавить("ЯСкопировалКаталогРабочегоОкруженияEDTВКаталогИзПеременной"); 18 | Возврат ВсеШаги; 19 | КонецФункции 20 | 21 | // Реализация шагов 22 | 23 | // Процедура выполняется перед запуском каждого сценария 24 | Процедура ПередЗапускомСценария(Знач Узел) Экспорт 25 | 26 | КонецПроцедуры 27 | 28 | // Процедура выполняется после завершения каждого сценария 29 | Процедура ПослеЗапускаСценария(Знач Узел) Экспорт 30 | 31 | КонецПроцедуры 32 | 33 | 34 | //я скопировал каталог рабочего окружения EDT в каталог из переменной "РабочееОкружениеEDT" 35 | Процедура ЯСкопировалКаталогРабочегоОкруженияEDTВКаталогИзПеременной(Знач ИмяПеременной) Экспорт 36 | РабочееОкружениеEDT = БДД.ПолучитьИзКонтекста(ИмяПеременной); 37 | ФС.ОбеспечитьПустойКаталог(РабочееОкружениеEDT); 38 | ФС.КопироватьСодержимоеКаталога(ПутьКРабочемуОкружениюEDT(), РабочееОкружениеEDT); 39 | КонецПроцедуры 40 | 41 | Функция ПутьКРабочемуОкружениюEDT() 42 | 43 | Возврат ОбъединитьПути(КаталогFixtures(), "edtWorkspace"); 44 | 45 | КонецФункции 46 | 47 | Функция КаталогFixtures() 48 | Возврат ОбъединитьПути(КореньПроекта(), "tests", "fixtures"); 49 | КонецФункции 50 | 51 | Функция КореньПроекта() 52 | Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."); 53 | КонецФункции 54 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | # MIT License 2 | # Copyright (C) 2020 Tymko Oleg and contributors 3 | # All rights reserved. 4 | 5 | name: Подготовка релиза и публикация в хабе 6 | # Только события создания и изменения релиза 7 | on: 8 | release: 9 | types: [published, edited] 10 | 11 | jobs: 12 | build: 13 | runs-on: ${{ matrix.os }} 14 | strategy: 15 | fail-fast: false 16 | matrix: 17 | os: [ubuntu-latest] 18 | oscript_version: ['1.9.2'] 19 | package_mask: ["gitsync-plugins-*.ospx"] 20 | 21 | steps: 22 | # Загрузка проекта 23 | - name: Актуализация 24 | uses: actions/checkout@v4.2.2 25 | 26 | # Установка OneScript конкретной версии 27 | - name: Установка OneScript 28 | env: 29 | ACTIONS_ALLOW_UNSECURE_COMMANDS: true 30 | uses: otymko/setup-onescript@v1.5 31 | with: 32 | version: ${{ matrix.oscript_version }} 33 | 34 | # Установка зависимостей пакета 35 | - name: Установка зависимостей 36 | run: | 37 | opm install opm 38 | opm install 39 | 40 | - name: Сборка пакета 41 | run: opm build 42 | 43 | - name: Заливка артифактов 44 | uses: actions/upload-artifact@v6.0.0 45 | with: 46 | name: package.zip 47 | path: ./${{ matrix.package_mask }} 48 | 49 | - name: Заливка в релиз 50 | uses: AButler/upload-release-assets@v3.0 51 | with: 52 | files: ./${{ matrix.package_mask }} 53 | repo-token: ${{ secrets.GITHUB_TOKEN }} 54 | 55 | - name: Публикация в hub.oscript.io 56 | shell: bash 57 | run: opm push -f ./${{ matrix.package_mask }} --token ${{ env.TOKEN }} -c stable 58 | env: 59 | TOKEN: ${{ secrets.ACCESS_TOKEN }} 60 | -------------------------------------------------------------------------------- /features/step_definitions/increment.os: -------------------------------------------------------------------------------- 1 | // BSLLS:MissingParameterDescription-off 2 | // BSLLS:MissingReturnedValueDescription-off 3 | 4 | #Использовать fs 5 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd 6 | 7 | Перем БДД; //контекст фреймворка 1bdd 8 | 9 | // Метод выдает список шагов, реализованных в данном файле-шагов 10 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт 11 | БДД = КонтекстФреймворкаBDD; 12 | 13 | ВсеШаги = Новый Массив; 14 | 15 | ВсеШаги.Добавить("ЯСкопировалКаталогТестовогоХранилищаКонфигурацииРасширенияВКаталогИзПеременной"); 16 | 17 | Возврат ВсеШаги; 18 | КонецФункции 19 | 20 | // Реализация шагов 21 | 22 | // Процедура выполняется перед запуском каждого сценария 23 | Процедура ПередЗапускомСценария(Знач Узел) Экспорт 24 | 25 | КонецПроцедуры 26 | 27 | // Процедура выполняется после завершения каждого сценария 28 | Процедура ПослеЗапускаСценария(Знач Узел) Экспорт 29 | 30 | КонецПроцедуры 31 | 32 | 33 | //я скопировал каталог тестового хранилища конфигурации расширения в каталог из переменной "КаталогХранилища1С" 34 | Процедура ЯСкопировалКаталогТестовогоХранилищаКонфигурацииРасширенияВКаталогИзПеременной(Знач ИмяПеременной) Экспорт 35 | КаталогХранилища1С = БДД.ПолучитьИзКонтекста(ИмяПеременной); 36 | ФС.ОбеспечитьПустойКаталог(КаталогХранилища1С); 37 | ФС.КопироватьСодержимоеКаталога(ПутьКВременномуФайлуХранилища1С(), КаталогХранилища1С); 38 | КонецПроцедуры 39 | 40 | Функция ПутьКВременномуФайлуХранилища1С() 41 | 42 | Возврат ОбъединитьПути(КаталогFixtures(), "extension_storage"); 43 | 44 | КонецФункции 45 | 46 | Функция КаталогFixtures() 47 | Возврат ОбъединитьПути(КореньПроекта(), "tests", "fixtures"); 48 | КонецФункции 49 | 50 | Функция КореньПроекта() 51 | Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."); 52 | КонецФункции 53 | -------------------------------------------------------------------------------- /tasks/install-plugins.os: -------------------------------------------------------------------------------- 1 | #Использовать gitrunner 2 | 3 | Перем Лог; 4 | 5 | Процедура УстановитьТекущиеПлагины(Знач Каталог) 6 | 7 | Лог.Информация("=== Собираю пакет с плагинами из текущего каталога ==="); 8 | 9 | КомандаOpm = Новый Команда; 10 | КомандаOpm.УстановитьРабочийКаталог(Каталог); 11 | КомандаOpm.УстановитьКоманду("opm"); 12 | КомандаOpm.ДобавитьПараметр("build"); 13 | КомандаOpm.ДобавитьЛогВыводаКоманды("task.install-opm"); 14 | 15 | КодВозврата = КомандаOpm.Исполнить(); 16 | 17 | МассивФайлов = НайтиФайлы(Каталог, "gitsync-plugins*.ospx"); 18 | 19 | Если МассивФайлов.Количество() = 0 Тогда 20 | Сообщение = СтрШаблон("В каталоге %1 найден собранный файл пакета gitsync-plugins", Каталог); 21 | ВызватьИсключение Новый ИнформацияОбОшибке("Не найден собранный пакет gitsync-plugins", Сообщение); 22 | КонецЕсли; 23 | 24 | ФайлПлагина = МассивФайлов[0].ПолноеИмя; 25 | 26 | ИсполнительGitSync = ОбъединитьПути(Каталог, "bin_gitsync/gitsync/src/cmd/gitsync.os"); 27 | 28 | Лог.Информация("=== Установка плагинов из файла <%1> ===", ФайлПлагина); 29 | 30 | КомандаOpm = Новый Команда; 31 | КомандаOpm.УстановитьРабочийКаталог(Каталог); 32 | КомандаOpm.УстановитьКоманду("oscript"); 33 | КомандаOpm.ДобавитьПараметр(ИсполнительGitSync); 34 | КомандаOpm.ДобавитьПараметр("p i"); 35 | КомандаOpm.ДобавитьПараметр("-f"); 36 | КомандаOpm.ДобавитьПараметр(ФайлПлагина); 37 | КомандаOpm.ДобавитьЛогВыводаКоманды("task.install-opm"); 38 | 39 | КодВозврата = КомандаOpm.Исполнить(); 40 | 41 | Если КодВозврата <> 0 Тогда 42 | ВызватьИсключение СтрШаблон("Ошибка установки плагинов из <%1> по причине <%2>", ФайлПлагина, КомандаOpm.ПолучитьВывод()); 43 | КонецЕсли; 44 | 45 | КонецПроцедуры 46 | 47 | Лог = Логирование.ПолучитьЛог("task.install-opm"); 48 | 49 | УстановитьТекущиеПлагины(ОбъединитьПути(ТекущийСценарий().Каталог, "..")); 50 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Встроенные плагины в gitsync 2 | 3 | ## Плагины для gitsync 4 | 5 | 1. `increment` - обеспечивает инкрементальную выгрузку конфигурации в исходники 6 | 1. `sync-remote` - добавляет функциональность синхронизации с удаленным репозиторием git (команды `git pull` и `git push`) 7 | 1. `limit` - добавляет возможность ограничения на минимальный, максимальный номер версии хранилища, а так же на лимит на количество выгружаемых версий за один запуск 8 | 1. `check-authors` - добавляет функциональность проверки автора версии в хранилище на наличие соответствия в файле `AUTHORS` 9 | 1. `check-comments` - добавляет функциональность проверки на заполненность комментариев в хранилище 10 | 1. `smart-tags` - добавляет функциональность автоматической расстановки меток в git (команда `git tag`) при изменении версии конфигурации или при нумерации версий хранилища 11 | 1. `unpackForm` - добавляет функциональность распаковки обычных форм на исходники 12 | 1. `tool1CD` - заменяет использование штатных механизмов 1С на приложение `tool1CD` при синхронизации 13 | 1. `disable-support` - снимает конфигурацию с поддержки перед выгрузкой в исходники 14 | 1. `edtExport` - добавляет функциональность выгрузки в формате `1C:EDT` 15 | 1. `use-ibcmd` - включает использование утилиты управления автономным сервером `ibcmd` для выгрузки конфигурации/расширения в файлы 16 | 1. `drop-config-dump` - удаляет файл дампа состояний объектов конфигурации `ConfigDumpInfo.xml` перед/после выгрузки в исходники 17 | 1. `drop-support` - снимает конфигурацию с поддержки после выгрузки конфигурации в исходники (удаляет файлы конфигураций поставщика `./Ext/ParentConfigurations/*.cf` и очищает информацию о поддержке в файле `./Ext/ParentConfigurations.bin`)конфигуратора. 18 | 19 | ## Доработка 20 | 21 | Доработка проводится по git-flow. Жду ваших PR. 22 | 23 | Более подробное описание в [руководстве контрибьютора](./CONTRIBUTING.md) 24 | 25 | ## Лицензия 26 | 27 | Смотри файл [`LICENSE`](./LICENSE). -------------------------------------------------------------------------------- /features/dropConfigDump.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Работа плагина отключения версионирования файла дампа версий объектов конфигурации (ConfigDumpInfo.xml) 4 | Как Пользователь 5 | Я хочу выполнять автоматическую синхронизацию и не версионировать при этом ConfigDumpInfo.xml 6 | Чтобы в репозитории не было лишних изменений 7 | 8 | Контекст: Тестовый контекст drop-config-dump 9 | Когда Я очищаю параметры команды "gitsync" в контексте 10 | И Я устанавливаю рабочий каталог во временный каталог 11 | И Я создаю новый объект ГитРепозиторий 12 | И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 13 | И Я устанавливаю текущие плагины 14 | И Я создаю временный каталог и сохраняю его в переменной "КаталогХранилища1С" 15 | И я скопировал каталог тестового хранилища конфигурации в каталог из переменной "КаталогХранилища1С" 16 | И Я создаю временный каталог и сохраняю его в переменной "ПутьКаталогаИсходников" 17 | И Я инициализирую репозиторий в каталоге из переменной "ПутьКаталогаИсходников" 18 | И я включаю отладку лога с именем "oscript.app.gitsync" 19 | И Я создаю временный каталог и сохраняю его в переменной "ВременнаяДиректория" 20 | И Я добавляю параметр "--tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" 21 | # И Я добавляю параметр "-v" для команды "gitsync" 22 | И Я добавляю параметр "sync" для команды "gitsync" 23 | И Я выключаю все плагины 24 | И Я включаю плагин "drop-config-dump" 25 | 26 | Сценарий: Cинхронизация с использованием плагина drop-config-dump 27 | Допустим Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 28 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 29 | И Я записываю "9" в файл VERSION 30 | Когда Я выполняю команду "gitsync" 31 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 32 | И Код возврата команды "gitsync" равен 0 33 | И Каталог из переменной "ПутьКаталогаИсходников" не содержит файл "ConfigDumpInfo.xml" 34 | -------------------------------------------------------------------------------- /features/check-authors.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Работа плагина проверки пользователей хранилища 4 | Как Пользователь 5 | Я хочу выполнять автоматическую синхронизацию конфигурации из хранилища 6 | Чтобы автоматизировать свою работы с хранилищем с git 7 | 8 | Контекст: Тестовый контекст check-authors 9 | Когда Я очищаю параметры команды "gitsync" в контексте 10 | И Я устанавливаю рабочий каталог во временный каталог 11 | И Я создаю новый объект ГитРепозиторий 12 | И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 13 | И Я устанавливаю текущие плагины 14 | И Я создаю временный каталог и сохраняю его в переменной "КаталогХранилища1С" 15 | И я скопировал каталог тестового хранилища конфигурации в каталог из переменной "КаталогХранилища1С" 16 | И Я создаю временный каталог и сохраняю его в переменной "ПутьКаталогаИсходников" 17 | И Я инициализирую репозиторий в каталоге из переменной "ПутьКаталогаИсходников" 18 | И Я создаю тестовый файл AUTHORS 19 | И я включаю отладку лога с именем "oscript.app.gitsync" 20 | И Я создаю временный каталог и сохраняю его в переменной "ВременнаяДиректория" 21 | И Я добавляю параметр "--tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" 22 | # И Я добавляю параметр "-v" для команды "gitsync" 23 | И Я добавляю параметр "sync" для команды "gitsync" 24 | И Я выключаю все плагины 25 | И Я включаю плагин "check-authors" 26 | 27 | Сценарий: Cинхронизация с простым использованием 28 | Допустим Я создаю неполный тестовый файл AUTHORS 29 | И Я записываю "8" в файл VERSION 30 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 31 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 32 | Когда Я выполняю команду "gitsync" 33 | Тогда Вывод команды "gitsync" содержит "В таблице истории версий найдены авторы (количество 3), которые не сопоставлены в AUTHORS" 34 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 35 | И Код возврата команды "gitsync" равен 1 36 | -------------------------------------------------------------------------------- /src/Классы/disableSupport.os: -------------------------------------------------------------------------------- 1 | 2 | #Использовать logos 3 | 4 | Перем Лог; 5 | Перем КомандыПлагина; 6 | Перем Описание; 7 | Перем Обработчик; 8 | 9 | #Область Интерфейс_плагина 10 | 11 | // Возвращает версию плагина 12 | // 13 | // Возвращаемое значение: 14 | // Строка - текущая версия плагина 15 | // 16 | Функция Версия() Экспорт 17 | Возврат "1.6.0"; 18 | КонецФункции 19 | 20 | // Возвращает приоритет выполнения плагина 21 | // 22 | // Возвращаемое значение: 23 | // Число - приоритет выполнения плагина 24 | // 25 | Функция Приоритет() Экспорт 26 | Возврат 0; 27 | КонецФункции 28 | 29 | // Возвращает описание плагина 30 | // 31 | // Возвращаемое значение: 32 | // Строка - описание функциональности плагина 33 | // 34 | Функция Описание() Экспорт 35 | Возврат "Плагин снимает конфигурацию с поддержки перед выгрузкой в исходники"; 36 | КонецФункции 37 | 38 | // Возвращает подробную справку к плагину 39 | // 40 | // Возвращаемое значение: 41 | // Строка - подробная справка для плагина 42 | // 43 | Функция Справка() Экспорт 44 | Возврат "Справка плагина"; 45 | КонецФункции 46 | 47 | // Возвращает имя плагина 48 | // 49 | // Возвращаемое значение: 50 | // Строка - имя плагина при подключении 51 | // 52 | Функция Имя() Экспорт 53 | Возврат "disable-support"; 54 | КонецФункции 55 | 56 | // Возвращает имя лога плагина 57 | // 58 | // Возвращаемое значение: 59 | // Строка - имя лога плагина 60 | // 61 | Функция ИмяЛога() Экспорт 62 | Возврат "oscript.lib.gitsync.plugins.disable-support"; 63 | КонецФункции 64 | 65 | #КонецОбласти 66 | 67 | Процедура ПриАктивизации(СтандартныйОбработчик) Экспорт 68 | 69 | Обработчик = СтандартныйОбработчик; 70 | 71 | КонецПроцедуры 72 | 73 | Процедура ПередВыгрузкойКонфигурациюВИсходники(Конфигуратор, 74 | КаталогРабочейКопии, 75 | КаталогВыгрузки, 76 | ПутьКХранилищу, 77 | НомерВерсииФормат) Экспорт 78 | 79 | Конфигуратор.СнятьКонфигурациюСПоддержки(Истина); 80 | 81 | КонецПроцедуры 82 | 83 | Процедура Инициализация() 84 | 85 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 86 | 87 | КонецПроцедуры 88 | 89 | Инициализация(); 90 | -------------------------------------------------------------------------------- /features/tool1CD.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Работа плагина использования механизма tool1CD для получения версии из хранилища конфигурации 4 | Как Пользователь 5 | Я хочу выполнять автоматическую синхронизацию конфигурации из хранилища 6 | Чтобы автоматизировать свою работы с хранилищем с git 7 | 8 | Контекст: Тестовый контекст 9 | Когда Я очищаю параметры команды "gitsync" в контексте 10 | И Я устанавливаю рабочий каталог во временный каталог 11 | И Я создаю новый объект ГитРепозиторий 12 | И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 13 | И Я устанавливаю текущие плагины 14 | И Я создаю временный каталог и сохраняю его в переменной "КаталогХранилища1С" 15 | И я скопировал каталог тестового хранилища конфигурации в каталог из переменной "КаталогХранилища1С" 16 | И Я создаю временный каталог и сохраняю его в переменной "ПутьКаталогаИсходников" 17 | И Я инициализирую репозиторий в каталоге из переменной "ПутьКаталогаИсходников" 18 | И Я создаю тестовый файл AUTHORS 19 | И я включаю отладку лога с именем "oscript.app.gitsync" 20 | И Я создаю временный каталог и сохраняю его в переменной "ВременнаяДиректория" 21 | И Я добавляю параметр "--tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" 22 | # И Я добавляю параметр "-v" для команды "gitsync" 23 | И Я добавляю параметр "sync" для команды "gitsync" 24 | И Я выключаю все плагины 25 | И Я включаю плагин "tool1CD" 26 | 27 | Сценарий: Успешная синхронизация с tool1CD 28 | Допустим Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 29 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 30 | И Я записываю "9" в файл VERSION 31 | Когда Я выполняю команду "gitsync" 32 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 33 | И Вывод команды "gitsync" содержит "ИНФОРМАЦИЯ - Использую tool1CD для работы с хранилищем" 34 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 35 | И Код возврата команды "gitsync" равен 0 36 | И Количество коммитов должно быть "1" 37 | -------------------------------------------------------------------------------- /src/Классы/internal/bindata/Классы/ЗагрузчикЗапакованныхФайловGitsyncPlugins.os: -------------------------------------------------------------------------------- 1 | #Область ПрограммныйИнтерфейс 2 | 3 | Функция ПолучитьПутьКФайлу(Знач ИмяФайла) Экспорт 4 | 5 | МенеджерЗапакованныхФайлов = Новый МенеджерЗапакованныхФайловGitsyncPlugins; 6 | ИндексФайлов = МенеджерЗапакованныхФайлов.ПолучитьИндексФайлов(); 7 | 8 | ИмяКлассаФайла = ИндексФайлов[ИмяФайла]; 9 | 10 | Если ИмяКлассаФайла = Неопределено Тогда 11 | ВызватьИсключение СтрШаблон("Не удалось найти двоичные данные для файла <%1>", ИмяФайла); 12 | КонецЕсли; 13 | 14 | КлассФайла = Новый (ИмяКлассаФайла); 15 | 16 | ПутьКФайлу = ""; 17 | 18 | НайтиФайлИлиРаспаковать(КлассФайла, ПутьКФайлу); 19 | 20 | Возврат ПутьКФайлу; 21 | 22 | КонецФункции 23 | 24 | #КонецОбласти 25 | 26 | #Область Упакованные_файлы 27 | 28 | Процедура РаспаковатьДанные(Знач ПутьКФайлу, КлассФайла) 29 | 30 | ДвоичныеДанные = Base64Значение(КлассФайла.ДвоичныеДанные()); 31 | 32 | ОбеспечитьКаталог(ПутьКФайлу); 33 | 34 | ДвоичныеДанные.Записать(ПутьКФайлу); 35 | 36 | КонецПроцедуры 37 | 38 | Функция ВычислитьХешФайла(Знач ПутьКФайлу) 39 | 40 | ХешФайла = Новый ХешированиеДанных(ХешФункция.MD5); 41 | ХешФайла.ДобавитьФайл(ПутьКФайлу); 42 | 43 | Возврат ХешФайла.ХешСуммаСтрокой; 44 | 45 | КонецФункции 46 | 47 | Процедура НайтиФайлИлиРаспаковать(КлассФайла, ПутьКФайлу) 48 | 49 | ИмяФайла = КлассФайла.ИмяФайла(); 50 | 51 | ПутьКФайлу = ПолучитьПутьКВременномуФайлу(ИмяФайла); 52 | 53 | ВременныйФайл = Новый Файл(ПутьКФайлу); 54 | 55 | Если Не ВременныйФайл.Существует() 56 | Тогда// ИЛИ Не ВычислитьХешФайла(ПутьКФайлу) = ДанныеDll.Хеш() Тогда 57 | РаспаковатьДанные(ПутьКФайлу, КлассФайла); 58 | КонецЕсли; 59 | 60 | КонецПроцедуры 61 | 62 | Функция ПолучитьПутьКВременномуФайлу(Знач ИмяФайла) 63 | ПутьКФайлу = ОбъединитьПути(КаталогВременныхФайлов(), ".gitsync-plugins", ИмяФайла); 64 | Возврат ПутьКФайлу; 65 | КонецФункции 66 | 67 | Процедура ОбеспечитьКаталог(ПутьККаталогу) 68 | 69 | ВременныйКаталог = Новый Файл(ПутьККаталогу); 70 | 71 | Если ВременныйКаталог.Существует() Тогда 72 | Возврат; 73 | КонецЕсли; 74 | 75 | СоздатьКаталог(ВременныйКаталог.Путь); 76 | 77 | КонецПроцедуры 78 | 79 | #КонецОбласти 80 | -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/src/Configuration/Configuration.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | Конфигурация 4 | 5 | 6 | 7 | 8 | 9 | 10 | 8.3.14 11 | OrdinaryApplication 12 | PersonalComputer 13 | Russian 14 | 1.1.0.1 15 | Language.Русский 16 | Managed 17 | NotAutoFree 18 | Version8_2 19 | 8.2.16 20 | 21 | Русский 22 | 23 | ru 24 | Русский 25 | 26 | ru 27 | 28 | SessionParameter.РежимТестированияВключен 29 | SessionParameter.ПараметрыТестирования 30 | Role.ПолныеПрава 31 | CommonModule.Тестирование 32 | CommonModule.ОбщийМодуль1 33 | Catalog.Справочник1 34 | 35 | -------------------------------------------------------------------------------- /src/Классы/internal/tool1cd/Классы/ЧтениеХранилищаКонфигурации.os: -------------------------------------------------------------------------------- 1 | #Использовать 1commands 2 | #Использовать tempfiles 3 | #Использовать logos 4 | #Использовать "../../bindata" 5 | 6 | Перем мКаталогВнешнихПрограмм; 7 | Перем Лог; 8 | Перем ЭтоWindows; 9 | 10 | ////////////////////////////////////////////////////////////////////////////////////////////////// 11 | // ПРОГРАММНЫЙ ИНТЕРФЕЙС 12 | 13 | Процедура ВыгрузитьВерсиюКонфигурации(Знач ФайлХранилища, Знач ВыходнойФайл, Знач НомерВерсии = 0) Экспорт 14 | 15 | ЛогTool1CD = ВременныеФайлы.НовоеИмяФайла("txt"); 16 | ПрефиксПути = ?(ЭтоWindows = Ложь, "Z:", ""); 17 | СтрокаЗапуска = """" + ПутьTool1CD() + """ """ + ПрефиксПути + ФайлХранилища 18 | + """ -l """ + ПрефиксПути + ЛогTool1CD 19 | + """ -q -ne -drc " 20 | + Строка(НомерВерсии) 21 | +" """ + ПрефиксПути + ВыходнойФайл +""""; 22 | 23 | ФайлИсходника = Новый Файл(ВыходнойФайл); 24 | ФайлЛога = Новый Файл(ЛогTool1CD); 25 | 26 | КодВозврата = ""; 27 | Если НЕ ЭтоWindows Тогда 28 | СтрокаЗапуска = "wine "+СтрокаЗапуска; 29 | КонецЕсли; 30 | Лог.Отладка(СтрокаЗапуска); 31 | 32 | Команда = Новый Команда; 33 | 34 | Команда.УстановитьСтрокуЗапуска(СтрокаЗапуска); 35 | Команда.УстановитьКодировкуВывода(КодировкаТекста.OEM); 36 | Команда.ПоказыватьВыводНемедленно(Истина); 37 | КодВозврата = Команда.Исполнить(); 38 | ВыводКоманды = Команда.ПолучитьВывод(); 39 | 40 | Если ФайлЛога.Существует() Тогда 41 | ТекстЛогаTool1CD = (ПрочитатьФайл(ЛогTool1CD)); 42 | УдалитьФайлы(ФайлЛога.ПолноеИмя); 43 | Иначе 44 | ВызватьИсключение "Tool_1CD не выгрузил файл конфигурации." + ВыводКоманды; 45 | КонецЕсли; 46 | 47 | Если КодВозврата <> 0 Тогда 48 | Лог.Ошибка(ТекстЛогаTool1CD); 49 | ВызватьИсключение "Tool_1CD вернул код возврата " + КодВозврата; 50 | КонецЕсли; 51 | 52 | КонецПроцедуры 53 | 54 | ////////////////////////////////////////////////////////////////////////////////////////////////// 55 | // 56 | 57 | Функция ПутьTool1CD() 58 | Если мКаталогВнешнихПрограмм = Неопределено Тогда 59 | мКаталогВнешнихПрограмм = Загрузчик_tool1CD.ПутьКФайлу(); 60 | КонецЕсли; 61 | 62 | Возврат мКаталогВнешнихПрограмм; 63 | 64 | КонецФункции 65 | 66 | Функция ПрочитатьФайл(Знач ИмяФайла) 67 | ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла); 68 | Текст = ЧтениеТекста.Прочитать(); 69 | ЧтениеТекста.Закрыть(); 70 | 71 | Возврат Текст; 72 | КонецФункции 73 | 74 | СистемнаяИнформация = Новый СистемнаяИнформация; 75 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; 76 | 77 | Лог = Логирование.ПолучитьЛог("oscript.lib.tool1cd"); 78 | -------------------------------------------------------------------------------- /features/smart-tags.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Работа плагина расстановки меток при коммите 4 | Как Пользователь 5 | Я хочу выполнять автоматическую синхронизацию конфигурации из хранилища 6 | Чтобы автоматизировать свою работы с хранилищем с git 7 | 8 | Контекст: Тестовый контекст smart-tags 9 | Когда Я очищаю параметры команды "gitsync" в контексте 10 | И Я устанавливаю рабочий каталог во временный каталог 11 | И Я создаю новый объект ГитРепозиторий 12 | И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 13 | И Я устанавливаю текущие плагины 14 | И Я создаю временный каталог и сохраняю его в переменной "КаталогХранилища1С" 15 | И я скопировал каталог тестового хранилища конфигурации в каталог из переменной "КаталогХранилища1С" 16 | И Я создаю временный каталог и сохраняю его в переменной "ПутьКаталогаИсходников" 17 | И Я инициализирую репозиторий в каталоге из переменной "ПутьКаталогаИсходников" 18 | И Я создаю тестовый файл AUTHORS 19 | И я включаю отладку лога с именем "oscript.app.gitsync" 20 | И Я создаю временный каталог и сохраняю его в переменной "ВременнаяДиректория" 21 | И Я добавляю параметр "--tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" 22 | # И Я добавляю параметр "-v" для команды "gitsync" 23 | И Я добавляю параметр "sync" для команды "gitsync" 24 | И Я выключаю все плагины 25 | И Я включаю плагин "smart-tags" 26 | 27 | Сценарий: Cинхронизация c установкой тэгов 28 | Допустим Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 29 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 30 | И Я записываю "9" в файл VERSION 31 | Когда Я выполняю команду "gitsync" 32 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 33 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 34 | И Код возврата команды "gitsync" равен 0 35 | И Тег "1.1.0.1" должен присутствовать в репозитории 36 | 37 | Сценарий: Пропуск ошибки уже существующих тэгов 38 | Допустим Я добавляю параметр "--skip-exists-tags" для команды "gitsync" 39 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 40 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 41 | И Я записываю "8" в файл VERSION 42 | Когда Я выполняю команду "gitsync" 43 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 44 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 45 | И Код возврата команды "gitsync" равен 0 46 | И Тег "1.1.0.1" должен присутствовать в репозитории -------------------------------------------------------------------------------- /features/check-comments.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Работа плагина проверки комментариев в хранилище 4 | Как Пользователь 5 | Я хочу выполнять автоматическую синхронизацию конфигурации из хранилища 6 | Чтобы автоматизировать свою работы с хранилищем с git 7 | 8 | Контекст: Тестовый контекст check-comments 9 | Когда Я очищаю параметры команды "gitsync" в контексте 10 | И Я устанавливаю рабочий каталог во временный каталог 11 | И Я создаю новый объект ГитРепозиторий 12 | И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 13 | И Я устанавливаю текущие плагины 14 | И Я создаю временный каталог и сохраняю его в переменной "КаталогХранилища1С" 15 | И я скопировал каталог тестового хранилища конфигурации в каталог из переменной "КаталогХранилища1С" 16 | И Я создаю временный каталог и сохраняю его в переменной "ПутьКаталогаИсходников" 17 | И Я инициализирую репозиторий в каталоге из переменной "ПутьКаталогаИсходников" 18 | И Я создаю тестовый файл AUTHORS 19 | И я включаю отладку лога с именем "oscript.app.gitsync" 20 | И Я создаю временный каталог и сохраняю его в переменной "ВременнаяДиректория" 21 | И Я добавляю параметр "--tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" 22 | # И Я добавляю параметр "-v" для команды "gitsync" 23 | И Я добавляю параметр "sync" для команды "gitsync" 24 | И Я выключаю все плагины 25 | И Я включаю плагин "check-comments" 26 | 27 | Сценарий: Cинхронизация с использованием просто check-comments 28 | Допустим Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 29 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 30 | И Я записываю "7" в файл VERSION 31 | Когда Я выполняю команду "gitsync" 32 | Тогда Вывод команды "gitsync" содержит "КРИТИЧНАЯОШИБКА - Версия <8> от автора <Администратор>: комментарий не задан" 33 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 34 | И Код возврата команды "gitsync" равен 0 35 | 36 | Сценарий: Cинхронизация c использованием --error-comment 37 | Допустим Я добавляю параметр "--error-comment" для команды "gitsync" 38 | И Я записываю "2" в файл VERSION 39 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 40 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 41 | Когда Я выполняю команду "gitsync" 42 | Тогда Вывод команды "gitsync" содержит "КРИТИЧНАЯОШИБКА - Версия <4> от автора <Администратор>: комментарий не задан" 43 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 44 | И Код возврата команды "gitsync" равен 1 45 | И Количество коммитов должно быть "1" 46 | -------------------------------------------------------------------------------- /tasks/test.os: -------------------------------------------------------------------------------- 1 | #Использовать 1bdd 2 | #Использовать 1testrunner 3 | #Использовать fs 4 | 5 | Функция ПрогнатьФичи(Знач КаталогФайловПокрытия, Знач ПутьФич = "features") 6 | 7 | ПутьКОтчетам = ОбъединитьПути("build", "reports"); 8 | ФС.ОбеспечитьКаталог(ПутьКОтчетам); 9 | 10 | ПутьОтчетаJUnit = ОбъединитьПути(ПутьКОтчетам, "bdd-log.xml"); 11 | 12 | КаталогФич = ОбъединитьПути(".", ПутьФич); 13 | 14 | Файл_КаталогФич = Новый Файл(КаталогФич); 15 | 16 | ИсполнительБДД = Новый ИсполнительБДД; 17 | 18 | Если ЗначениеЗаполнено(КаталогФайловПокрытия) Тогда 19 | ИсполнительБДД.СохранитьВКонтекст("ПризнакСтатистикиСкриптовOnescript", Новый Файл(КаталогФайловПокрытия)); 20 | КонецЕсли; 21 | 22 | РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, Файл_КаталогФич); 23 | ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); 24 | 25 | СтатусыВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения(); 26 | 27 | СтатусВыполнения = СтатусыВыполнения.НеВыполнялся; 28 | Если РезультатыВыполнения.Строки.Количество() > 0 Тогда 29 | 30 | СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); 31 | ИсполнительБДД.ПоказатьПроблемныеСценарии(РезультатыВыполнения); 32 | 33 | ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, Файл_КаталогФич.ЭтоКаталог()); 34 | КонецЕсли; 35 | 36 | ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit; 37 | ГенераторОтчетаJUnit.Сформировать(РезультатыВыполнения, СтатусВыполнения, ПутьОтчетаJUnit); 38 | 39 | Сообщить(СтрШаблон("Результат прогона фич <%1>. Путь %2 40 | |", ИтоговыйРезультатВыполнения, ПутьФич)); 41 | 42 | Возврат ИтоговыйРезультатВыполнения <> СтатусыВыполнения.Сломался; 43 | КонецФункции 44 | 45 | ИмяКаталогаФайловПокрытия = "coverage"; 46 | 47 | // основной код 48 | 49 | ТекКаталог = ТекущийКаталог(); 50 | 51 | КаталогФайловПокрытия = ""; 52 | 53 | ИспользуетсяПокрытиеКода = Ложь; 54 | Для каждого Элемент Из АргументыКоманднойСтроки Цикл 55 | Если Элемент = "coverage" Тогда 56 | 57 | КаталогФайловПокрытия = ОбъединитьПути(ТекущийКаталог(), ".", ИмяКаталогаФайловПокрытия); 58 | ФС.ОбеспечитьПустойКаталог(КаталогФайловПокрытия); 59 | 60 | Прервать; 61 | КонецЕсли; 62 | КонецЦикла; 63 | 64 | УстановитьТекущийКаталог(ТекКаталог); 65 | 66 | Попытка 67 | ФичиПрошли = ПрогнатьФичи(КаталогФайловПокрытия, "features"); 68 | Исключение 69 | ФичиПрошли = Ложь; 70 | Сообщить(СтрШаблон("Тесты поведения через 1bdd выполнены неудачно 71 | |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); 72 | КонецПопытки; 73 | 74 | Сообщить(СтрШаблон("Результат прогона основных фич <%1> 75 | |", ФичиПрошли)); 76 | 77 | Если Не ФичиПрошли Тогда 78 | ВызватьИсключение "Тестирование завершилось неудачно!"; 79 | КонецЕсли; 80 | -------------------------------------------------------------------------------- /features/increment.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Работа плагина инекрементальной выгрузки конфигурации 4 | Как Пользователь 5 | Я хочу выполнять автоматическую синхронизацию конфигурации из хранилища 6 | Чтобы автоматизировать свою работы с хранилищем с git 7 | 8 | Контекст: Тестовый контекст increment 9 | Когда Я очищаю параметры команды "gitsync" в контексте 10 | И Я устанавливаю рабочий каталог во временный каталог 11 | И Я создаю новый объект ГитРепозиторий 12 | И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 13 | И Я устанавливаю текущие плагины 14 | И Я создаю временный каталог и сохраняю его в переменной "КаталогХранилища1С" 15 | И я скопировал каталог тестового хранилища конфигурации в каталог из переменной "КаталогХранилища1С" 16 | И Я создаю временный каталог и сохраняю его в переменной "ПутьКаталогаИсходников" 17 | И Я инициализирую репозиторий в каталоге из переменной "ПутьКаталогаИсходников" 18 | И Я создаю тестовый файл AUTHORS 19 | И Я создаю временный каталог и сохраняю его в переменной "ВременнаяДиректория" 20 | И Я добавляю параметр "--tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" 21 | # И Я добавляю параметр "-v" для команды "gitsync" 22 | И Я добавляю параметр "sync" для команды "gitsync" 23 | И Я выключаю все плагины 24 | И Я включаю плагин "increment" 25 | 26 | Сценарий: Cинхронизация с использованием increment 27 | Допустим Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 28 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 29 | И Я записываю "9" в файл VERSION 30 | Когда Я выполняю команду "gitsync" 31 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 32 | И Вывод команды "gitsync" содержит "ИНФОРМАЦИЯ - Тип выгрузки конфигурации в файлы:" 33 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 34 | И Код возврата команды "gitsync" равен 0 35 | 36 | Сценарий: Cинхронизация хранилища расширения с использованием increment 37 | Допустим Я скопировал каталог тестового хранилища конфигурации расширения в каталог из переменной "КаталогХранилища1С" 38 | И Я добавляю параметр "-e test" для команды "gitsync" 39 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 40 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 41 | И Я записываю "3" в файл VERSION 42 | Когда Я выполняю команду "gitsync" 43 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 44 | И Вывод команды "gitsync" содержит "ИНФОРМАЦИЯ - Тип выгрузки конфигурации в файлы:" 45 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 46 | И Код возврата команды "gitsync" равен 0 -------------------------------------------------------------------------------- /tasks/coverage.os: -------------------------------------------------------------------------------- 1 | #Использовать 1commands 2 | #Использовать fs 3 | #Использовать coverage 4 | 5 | ИмяПакета = "gitsync-plugins"; 6 | 7 | ИмяКаталогаФайловПокрытия = "coverage"; 8 | ИмяОбщегоФайлаПокрытия = "stat.json"; 9 | ШаблонИменФайловПокрытия = "*.json"; 10 | 11 | ФС.ОбеспечитьПустойКаталог(ИмяКаталогаФайловПокрытия); 12 | ПутьКСтат = ОбъединитьПути(ИмяКаталогаФайловПокрытия, ИмяОбщегоФайлаПокрытия); 13 | 14 | СистемнаяИнформация = Новый СистемнаяИнформация; 15 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; 16 | 17 | Команда = Новый Команда; 18 | Команда.УстановитьКоманду("oscript"); 19 | Если НЕ ЭтоWindows Тогда 20 | Команда.ДобавитьПараметр("-encoding=utf-8"); 21 | КонецЕсли; 22 | Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); 23 | Команда.ДобавитьПараметр("tasks/test.os coverage"); 24 | Команда.ПоказыватьВыводНемедленно(Истина); 25 | 26 | КодВозврата = Команда.Исполнить(); 27 | 28 | Файл_Стат = Новый Файл(ПутьКСтат); 29 | 30 | // Заменяем пути в файлах на ./src 31 | ПутьКИсходникам = ОбъединитьПути(ТекущийСценарий(), "..", "src"); 32 | КаталогИсходников = Новый Файл(ПутьКИсходникам).ПолноеИмя; 33 | КаталогИсходников = СтрЗаменить(КаталогИсходников, "\", "\\"); 34 | 35 | // взято из gitsync 36 | СистемнаяИнформация = Новый СистемнаяИнформация; 37 | ОбщийКаталогДанныхПриложений = СистемнаяИнформация.ПолучитьПутьПапки(СпециальнаяПапка.ЛокальныйКаталогДанныхПриложений); 38 | ПутьУстановкиПлагинов = ОбъединитьПути(ОбщийКаталогДанныхПриложений, "gitsync", "plugins"); 39 | ПутьИсходниковУстановленныхПлагинов = ОбъединитьПути(ПутьУстановкиПлагинов, "gitsync-plugins", "src"); 40 | ПолноеИмяКаталогаИсходниковУстановленныхПлагинов = Новый Файл(ПутьИсходниковУстановленныхПлагинов).ПолноеИмя; 41 | 42 | ПолноеИмяКаталогаИсходниковУстановленныхПлагинов = СтрЗаменить(ПолноеИмяКаталогаИсходниковУстановленныхПлагинов, "\", "\\"); 43 | 44 | ФайлыСтатистики = НайтиФайлы(ИмяКаталогаФайловПокрытия, ШаблонИменФайловПокрытия); 45 | Для Каждого ФайлСтатистики Из ФайлыСтатистики Цикл 46 | 47 | ЧтениеТекста = Новый ЧтениеТекста(ФайлСтатистики.ПолноеИмя, КодировкаТекста.UTF8NoBOM); 48 | Содержимое = ЧтениеТекста.Прочитать(); 49 | ЧтениеТекста.Закрыть(); 50 | 51 | Содержимое = СтрЗаменить(Содержимое, ПолноеИмяКаталогаИсходниковУстановленныхПлагинов, КаталогИсходников); 52 | 53 | ЗаписьТекста = Новый ЗаписьТекста(ФайлСтатистики.ПолноеИмя, КодировкаТекста.UTF8NoBOM); 54 | ЗаписьТекста.Записать(Содержимое); 55 | ЗаписьТекста.Закрыть(); 56 | 57 | КонецЦикла; 58 | 59 | ПроцессорГенерации = Новый ГенераторОтчетаПокрытия(); 60 | 61 | ПроцессорГенерации.ОтносительныеПути() 62 | .РабочийКаталог(ИмяКаталогаФайловПокрытия) 63 | .ИмяФайлаСтатистики(ШаблонИменФайловПокрытия) 64 | .ФайлСтатистики(Файл_Стат.ПолноеИмя) 65 | .GenericCoverage() 66 | .Cobertura() 67 | .Clover(ИмяПакета) 68 | .Сформировать(); 69 | 70 | ЗавершитьРаботу(0); // TODO КодВозврата 71 | -------------------------------------------------------------------------------- /src/Классы/internal/v8unpack/Классы/РаспаковкаФорм.os: -------------------------------------------------------------------------------- 1 | // BSLLS:LatinAndCyrillicSymbolInWord-off 2 | 3 | #Использовать "../../bindata" 4 | #Использовать logos 5 | 6 | Перем КомпонентаГотова; 7 | Перем Лог; 8 | Перем ПутьКФайлу; 9 | Перем ЭтоСборкаEXE; 10 | Перем ЭтоWindows; 11 | 12 | // Производит распаковку формы .bin 13 | // 14 | // Параметры: 15 | // ПутьКФайлуФормы - Строка - Путь к файлу form.bin 16 | // ПутьККаталогуФормы - Строка - Путь к каталогу распаковки 17 | // 18 | Процедура Распаковать(Знач ПутьКФайлуФормы, Знач ПутьККаталогуФормы) Экспорт 19 | 20 | Если Не КомпонентаГотова Тогда 21 | ПодготовитьКомпоненту(); 22 | КонецЕсли; 23 | 24 | dllРаспаковать(ПутьКФайлуФормы, ПутьККаталогуФормы); 25 | 26 | КонецПроцедуры 27 | 28 | Процедура ПриСозданииОбъекта() 29 | 30 | Лог = Логирование.ПолучитьЛог("oscript.lib.gitsync.plugins.unpackForm"); 31 | 32 | КомпонентаГотова = Ложь; 33 | ЭтоСборкаEXE = ВРег(Прав(ТекущийСценарий().Источник, 3)) = "EXE"; // BSLLS:MagicNumber-off 34 | 35 | СистемнаяИнформация = Новый СистемнаяИнформация; 36 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; 37 | 38 | КонецПроцедуры 39 | 40 | Процедура dllРаспаковать(Знач ФайлРаспаковки, Знач КаталогРаспаковки) 41 | 42 | Если ЭтоСборкаEXE Тогда 43 | 44 | ВыполнитьРаспаковку(ФайлРаспаковки, КаталогРаспаковки); 45 | 46 | Иначе 47 | 48 | Распаковщик = Новый ЧтениеФайла8(ФайлРаспаковки); 49 | Распаковщик.ИзвлечьВсе(КаталогРаспаковки, Истина); 50 | ОсвободитьОбъект(Распаковщик); 51 | 52 | КонецЕсли; 53 | 54 | 55 | КонецПроцедуры 56 | 57 | Процедура ВыполнитьРаспаковку(Знач ФайлРаспаковки, Знач КаталогРаспаковки) 58 | 59 | Лог.Отладка("Распаковываю файла <%1> в каталог <%2>", ФайлРаспаковки, КаталогРаспаковки); 60 | 61 | КомандаUnpack = Новый Команда; 62 | КомандаUnpack.УстановитьРабочийКаталог(КаталогРаспаковки); 63 | КомандаUnpack.УстановитьКоманду(ПутьКФайлу); 64 | КомандаUnpack.ДобавитьПараметр("-P"); 65 | КомандаUnpack.ДобавитьПараметр(ФайлРаспаковки); 66 | КомандаUnpack.ДобавитьПараметр(КаталогРаспаковки); 67 | 68 | КодВозврата = КомандаUnpack.Исполнить(); 69 | 70 | Если КодВозврата <> 0 Тогда 71 | ВызватьИсключение КомандаUnpack.ПолучитьВыводКоманды(); 72 | КонецЕсли; 73 | 74 | КонецПроцедуры 75 | 76 | Процедура ПодготовитьКомпоненту() 77 | 78 | ЗагрузчикДвоичныхДанных = Новый ЗагрузчикЗапакованныхФайловGitsyncPlugins; 79 | 80 | Если ЭтоСборкаEXE Тогда 81 | 82 | Если ЭтоWindows Тогда 83 | ПутьКФайлу = ЗагрузчикДвоичныхДанных.ПолучитьПутьКФайлу("v8unpack_d.exe"); 84 | Иначе 85 | ПутьКФайлу = "v8unpack"; 86 | КонецЕсли; 87 | 88 | Иначе 89 | 90 | ПутьКФайлу = ЗагрузчикДвоичныхДанных.ПолучитьПутьКФайлу("v8unpack.dll"); 91 | Лог.Отладка("Выполняю подключение из файла <%1>", ПутьКФайлу); 92 | ПодключитьВнешнююКомпоненту(ПутьКФайлу); 93 | 94 | КонецЕсли; 95 | 96 | КомпонентаГотова = Истина; 97 | 98 | КонецПроцедуры 99 | 100 | -------------------------------------------------------------------------------- /features/useIbcmd.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Работа плагина use-ibcmd 4 | Как Пользователь 5 | Я хочу выполнять автоматическую синхронизацию конфигурации из хранилища с использованием ibcmd 6 | Чтобы ускорить операции выгрузки и загрузки 7 | 8 | Контекст: Тестовый контекст use-ibcmd 9 | Когда Я очищаю параметры команды "gitsync" в контексте 10 | И Я устанавливаю рабочий каталог во временный каталог 11 | И Я создаю новый объект ГитРепозиторий 12 | И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 13 | И Я устанавливаю текущие плагины 14 | И Я создаю временный каталог и сохраняю его в переменной "КаталогХранилища1С" 15 | И Я создаю временный каталог и сохраняю его в переменной "РабочееОкружениеEDT" 16 | И я скопировал каталог тестового хранилища конфигурации в каталог из переменной "КаталогХранилища1С" 17 | И Я создаю временный каталог и сохраняю его в переменной "ПутьКаталогаИсходников" 18 | И Я инициализирую репозиторий в каталоге из переменной "ПутьКаталогаИсходников" 19 | И Я создаю тестовый файл AUTHORS 20 | И Я создаю временный каталог и сохраняю его в переменной "ВременнаяДиректория" 21 | И Я добавляю параметр "--tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" 22 | # И Я добавляю параметр "-v" для команды "gitsync" 23 | И Я добавляю параметр "sync" для команды "gitsync" 24 | И Я создаю временный каталог и сохраняю его в переменной "РабочийКаталогАвтономногоСервера" 25 | И Я добавляю параметр "--ibcmd-data" для команды "gitsync" из переменной "РабочийКаталогАвтономногоСервера" 26 | И Я выключаю все плагины 27 | И Я включаю плагин "use-ibcmd" 28 | 29 | Сценарий: Cинхронизация с использованием use-ibcmd (успешная) 30 | Допустим Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 31 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 32 | И Я записываю "9" в файл VERSION 33 | Когда Я выполняю команду "gitsync" 34 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 35 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 36 | И Вывод команды "gitsync" содержит "Используем утилиту ibcmd для выгрузки конфигурации в файлы" 37 | И Код возврата команды "gitsync" равен 0 38 | 39 | Сценарий: Cинхронизация с использованием use-ibcmd (инкрементальная) 40 | Допустим Я добавляю параметр "--increment" для команды "gitsync" 41 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 42 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 43 | И Я записываю "8" в файл VERSION 44 | Когда Я выполняю команду "gitsync" 45 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 46 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 47 | И Вывод команды "gitsync" содержит "Используем утилиту ibcmd для выгрузки конфигурации в файлы" 48 | И Вывод команды "gitsync" содержит "ИНФОРМАЦИЯ - Тип выгрузки конфигурации в файлы: ИНКРЕМЕНТАЛЬНАЯ ВЫГРУЗКА" 49 | И Код возврата команды "gitsync" равен 0 50 | -------------------------------------------------------------------------------- /src/Классы/plugin.os.template: -------------------------------------------------------------------------------- 1 | 2 | #Использовать logos 3 | #Использовать tempfiles 4 | 5 | Перем Лог; 6 | Перем КомандыПлагина; 7 | 8 | 9 | #Область Интерфейс_плагина 10 | 11 | // Возвращает версию плагина 12 | // 13 | // Возвращаемое значение: 14 | // Строка - текущая версия плагина 15 | // 16 | Функция Версия() Экспорт 17 | Возврат "1.0.0"; 18 | КонецФункции 19 | 20 | // Возвращает приоритет выполнения плагина 21 | // 22 | // Возвращаемое значение: 23 | // Число - приоритет выполнения плагина 24 | // 25 | Функция Приоритет() Экспорт 26 | Возврат 0; 27 | КонецФункции 28 | 29 | // Возвращает описание плагина 30 | // 31 | // Возвращаемое значение: 32 | // Строка - описание функциональности плагина 33 | // 34 | Функция Описание() Экспорт 35 | Возврат "Шаблон плагина"; 36 | КонецФункции 37 | 38 | // Возвращает подробную справку к плагину 39 | // 40 | // Возвращаемое значение: 41 | // Строка - подробная справка для плагина 42 | // 43 | Функция Справка() Экспорт 44 | Возврат "Справка плагина"; 45 | КонецФункции 46 | 47 | // Возвращает имя плагина 48 | // 49 | // Возвращаемое значение: 50 | // Строка - имя плагина при подключении 51 | // 52 | Функция Имя() Экспорт 53 | Возврат "template_plugin"; 54 | КонецФункции 55 | 56 | // Возвращает имя лога плагина 57 | // 58 | // Возвращаемое значение: 59 | // Строка - имя лога плагина 60 | // 61 | Функция ИмяЛога() Экспорт 62 | Возврат "oscript.lib.gitsync.plugins.templatePlugin"; 63 | КонецФункции 64 | 65 | #КонецОбласти 66 | 67 | #Область Подписки_на_события 68 | 69 | Процедура ПриРегистрацииКомандыПриложения(ИмяКоманды, КлассРеализации, Парсер) Экспорт 70 | 71 | Лог.Отладка("Ищю команду <%1> в списке поддерживаемых", ИмяКоманды); 72 | Сообщить("Я тут! ПриРегистрацииКомандыПриложения: " + ИмяКоманды); 73 | 74 | Если КомандыПлагина.Найти(ИмяКоманды) = Неопределено Тогда 75 | Возврат; 76 | КонецЕсли; 77 | 78 | Лог.Отладка("Устанавливаю дополнительные параметры для команды %1", ИмяКоманды); 79 | 80 | ВызватьОшибку = КлассРеализации.Опция("MP MyParam", Ложь, "[*extension] Флаг плагина").Флаговый(); 81 | 82 | КонецПроцедуры 83 | 84 | Процедура ПриПолученииПараметров(ПараметрыКоманды, ДополнительныеПараметры) Экспорт 85 | 86 | ЭтоРасширение = ПараметрыКоманды["--MyParam"]; 87 | 88 | Если ЭтоРасширение = Неопределено Тогда 89 | ЭтоРасширение = Ложь; 90 | КонецЕсли; 91 | 92 | КонецПроцедуры 93 | 94 | Процедура ПередВыгрузкойКонфигурациюВИсходники(Конфигуратор, КаталогРабочейКопии, КаталогВыгрузки, ПутьКХранилищу, НомерВерсии, Формат) Экспорт 95 | 96 | Сообщить("Я тут! ПередВыгрузкойКонфигурациюВИсходники"); 97 | 98 | КонецПроцедуры 99 | 100 | Процедура ПриВыгрузкеКонфигурациюВИсходники(Конфигуратор, КаталогВыгрузки, Формат, СтандартнаяОбработка) Экспорт 101 | СтандартнаяОбработка = ложь; 102 | 103 | Сообщить("Я тут! ПриВыгрузкеКонфигурациюВИсходники"); 104 | 105 | КонецПроцедуры 106 | 107 | #КонецОбласти 108 | 109 | Процедура Инициализация() 110 | 111 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 112 | КомандыПлагина = Новый Массив; 113 | КомандыПлагина.Добавить("sync"); 114 | 115 | КонецПроцедуры 116 | 117 | Инициализация(); 118 | -------------------------------------------------------------------------------- /features/compatibility.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Работа комбинаций плагинов 4 | Как Пользователь 5 | Я хочу выполнять автоматическую синхронизацию даже если активированы несовместимые плагины 6 | Чтобы синхронизация выполнялась корректно всегда 7 | 8 | Контекст: Тестовый контекст 9 | Когда Я очищаю параметры команды "gitsync" в контексте 10 | И Я устанавливаю рабочий каталог во временный каталог 11 | И Я создаю новый объект ГитРепозиторий 12 | И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 13 | И Я устанавливаю текущие плагины 14 | И Я создаю временный каталог и сохраняю его в переменной "КаталогХранилища1С" 15 | И я скопировал каталог тестового хранилища конфигурации в каталог из переменной "КаталогХранилища1С" 16 | И Я создаю временный каталог и сохраняю его в переменной "ПутьКаталогаИсходников" 17 | И Я инициализирую репозиторий в каталоге из переменной "ПутьКаталогаИсходников" 18 | И я включаю отладку лога с именем "oscript.app.gitsync" 19 | И Я создаю временный каталог и сохраняю его в переменной "ВременнаяДиректория" 20 | И Я добавляю параметр "--tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" 21 | # И Я добавляю параметр "-v" для команды "gitsync" 22 | И Я добавляю параметр "sync" для команды "gitsync" 23 | И Я выключаю все плагины 24 | 25 | Сценарий: Cинхронизация с использованием плагинов increment и use-ibcmd 26 | Допустим Я включаю плагин "increment" 27 | И Я включаю плагин "use-ibcmd" 28 | И Я создаю временный каталог и сохраняю его в переменной "РабочийКаталогАвтономногоСервера" 29 | И Я добавляю параметр "--ibcmd-data" для команды "gitsync" из переменной "РабочийКаталогАвтономногоСервера" 30 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 31 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 32 | И Я записываю "9" в файл VERSION 33 | Когда Я выполняю команду "gitsync" 34 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 35 | Тогда Вывод команды "gitsync" содержит 36 | | Плагин "increment" не совместим с плагином "use-ibcmd" и будет отключен на время выполнения синхронизации | 37 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 38 | И Код возврата команды "gitsync" равен 0 39 | 40 | Сценарий: Cинхронизация с использованием плагинов increment и drop-config-dump 41 | Допустим Я включаю плагин "increment" 42 | И Я включаю плагин "drop-config-dump" 43 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 44 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 45 | И Я записываю "9" в файл VERSION 46 | Когда Я выполняю команду "gitsync" 47 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 48 | Тогда Вывод команды "gitsync" содержит 49 | | Плагин "increment" не совместим с плагином "drop-config-dump" и будет отключен на время выполнения синхронизации | 50 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 51 | И Код возврата команды "gitsync" равен 0 52 | -------------------------------------------------------------------------------- /packagedef: -------------------------------------------------------------------------------- 1 | //////////////////////////////////////////////////////////// 2 | // Описание пакета для сборки и установки 3 | // Полную документацию см. на hub.oscript.io/packaging 4 | // 5 | Процедура ПередСборкой(Знач РабочийКаталог) Экспорт 6 | 7 | ФС.ОбеспечитьПустойКаталог(ОбъединитьПути(РабочийКаталог, "oscript_modules")); 8 | 9 | Сообщить("Запаковка бинарных данных библиотек"); 10 | КомандаOpm = Новый Команда; 11 | 12 | КомандаOpm.УстановитьКоманду("opm"); 13 | КомандаOpm.ДобавитьПараметр("run pack"); 14 | КомандаOpm.ДобавитьЛогВыводаКоманды("task.build"); 15 | 16 | КодВозврата = КомандаOpm.Исполнить(); 17 | 18 | Если КодВозврата <> 0 Тогда 19 | ВызватьИсключение КомандаOpm.ПолучитьВывод(); 20 | КонецЕсли; 21 | 22 | Сообщить("Установка локальных зависимостей библиотек"); 23 | КомандаOpm = Новый Команда; 24 | 25 | КомандаOpm.УстановитьКоманду("opm"); 26 | КомандаOpm.ДобавитьПараметр("install -l"); 27 | КомандаOpm.ДобавитьЛогВыводаКоманды("task.build"); 28 | 29 | КодВозврата = КомандаOpm.Исполнить(); 30 | 31 | Если КодВозврата <> 0 Тогда 32 | ВызватьИсключение КомандаOpm.ПолучитьВывод(); 33 | КонецЕсли; 34 | 35 | КонецПроцедуры 36 | 37 | Описание.Имя("gitsync-plugins") 38 | .Версия("2.0.0") 39 | .Автор("Khorev A.A. and SilverBulleters") 40 | .АдресАвтора("khorevaa@gmail.com,help@silverbulleters.org") 41 | .Описание("Набор предустановленных плагинов для gitsync") 42 | .ВерсияСреды("1.9.2") 43 | .ВключитьФайл("src") 44 | .ВключитьФайл("docs") 45 | .ВключитьФайл("oscript_modules") 46 | .ЗависитОт("strings", "0.4.1") 47 | .РазработкаЗависитОт("1testrunner", "1.9.2") 48 | .РазработкаЗависитОт("1bdd", "1.15.1") 49 | .РазработкаЗависитОт("notify", "0.2.0") 50 | .РазработкаЗависитОт("coverage", "0.7.0") 51 | .ОпределяетКласс("Плагин_ИнкрементальнаяВыгрузка", "src/Классы/increment.os") 52 | .ОпределяетКласс("Плагин_УстановкиЛимитов", "src/Классы/limit.os") 53 | .ОпределяетКласс("Плагин_ПроверкиАвторов", "src/Классы/checkAuthors.os") 54 | .ОпределяетКласс("Плагин_ПроверкиКомментариев", "src/Классы/checkComments.os") 55 | .ОпределяетКласс("Плагин_УстановкиТеговВерсий", "src/Классы/smartTags.os") 56 | .ОпределяетКласс("Плагин_Tool1CD", "src/Классы/tool1CD.os") 57 | .ОпределяетКласс("Плагин_РаспаковкиОбычныхФорм", "src/Классы/unpackForm.os") 58 | .ОпределяетКласс("Плагин_СнятияСПоддержки", "src/Классы/disableSupport.os") 59 | .ОпределяетКласс("Плагин_СинхронизацииСУдаленнымРепозиторием", "src/Классы/syncRemote.os") 60 | .ОпределяетКласс("Плагин_ВыгрузкаВФорматеEDT", "src/Классы/edtExport.os") 61 | .ОпределяетКласс("Плагин_ЗаменаАвторов", "src/Классы/replaceAuthors.os") 62 | .ОпределяетКласс("Плагин_Ibcmd", "src/Классы/useIbcmd.os") 63 | .ОпределяетКласс("Плагин_DropConfigDump", "src/Классы/dropConfigDump.os") 64 | .ОпределяетКласс("Плагин_DropSupport", "src/Классы/dropSupport.os") 65 | .ОпределяетКласс("Плагин_RoboCopy", "src/Классы/roboCopy.os") 66 | ; -------------------------------------------------------------------------------- /features/unpackForm.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Работа плагина конвертации файлов форм module > module.bsl 4 | Как Пользователь 5 | Я хочу выполнять автоматическую синхронизацию конфигурации из хранилища 6 | Чтобы автоматизировать свою работы с хранилищем с git 7 | 8 | Контекст: Тестовый контекст unpackForm 9 | Когда Я очищаю параметры команды "gitsync" в контексте 10 | И Я устанавливаю рабочий каталог во временный каталог 11 | И Я создаю новый объект ГитРепозиторий 12 | И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 13 | И Я устанавливаю текущие плагины 14 | И Я создаю временный каталог и сохраняю его в переменной "КаталогХранилища1С" 15 | И я скопировал каталог тестового хранилища конфигурации в каталог из переменной "КаталогХранилища1С" 16 | И Я создаю временный каталог и сохраняю его в переменной "ПутьКаталогаИсходников" 17 | И Я инициализирую репозиторий в каталоге из переменной "ПутьКаталогаИсходников" 18 | И Я создаю тестовый файл AUTHORS 19 | И Я записываю "0" в файл VERSION 20 | И я включаю отладку лога с именем "oscript.app.gitsync" 21 | И Я создаю временный каталог и сохраняю его в переменной "ВременнаяДиректория" 22 | И Я добавляю параметр "--tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" 23 | # И Я добавляю параметр "-v" для команды "gitsync" 24 | И Я добавляю параметр "sync" для команды "gitsync" 25 | И Я выключаю все плагины 26 | И Я включаю плагин "unpackForm" 27 | 28 | Сценарий: Распаковка форм без переименования 29 | Допустим Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 30 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 31 | И Я записываю "9" в файл VERSION 32 | Когда Я выполняю команду "gitsync" 33 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 34 | И Код возврата команды "gitsync" равен 0 35 | И Каталог из переменной "ПутьКаталогаИсходников" содержит файл "Catalogs/Справочник1/Forms/ФормаСписка/Ext/Form/module" 36 | 37 | Сценарий: Распаковка форм с Переименованием модулей module в Module.bsl 38 | Допустим Я добавляю параметр "-R" для команды "gitsync" 39 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 40 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 41 | И Я записываю "9" в файл VERSION 42 | Когда Я выполняю команду "gitsync" 43 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 44 | И Код возврата команды "gitsync" равен 0 45 | И Каталог из переменной "ПутьКаталогаИсходников" содержит файл "Catalogs/Справочник1/Forms/ФормаСписка/Ext/Form/Module.bsl" 46 | 47 | Сценарий: Распаковка форм с переименованием модулей form в form.txt 48 | Допустим Я добавляю параметр "-F" для команды "gitsync" 49 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 50 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 51 | И Я записываю "9" в файл VERSION 52 | Когда Я выполняю команду "gitsync" 53 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 54 | И Код возврата команды "gitsync" равен 0 55 | И Каталог из переменной "ПутьКаталогаИсходников" содержит файл "Catalogs/Справочник1/Forms/ФормаСписка/Ext/Form/form.txt" 56 | -------------------------------------------------------------------------------- /src/Классы/checkAuthors.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | 3 | Перем Лог; 4 | Перем Обработчик; 5 | Перем ТаблицаАвторовГит; 6 | Перем МассивНомеровВерсий; 7 | Перем КаталогРабочейКопии; 8 | 9 | #Область Интерфейс_плагина 10 | 11 | // Возвращает версию плагина 12 | // 13 | // Возвращаемое значение: 14 | // Строка - текущая версия плагина 15 | // 16 | Функция Версия() Экспорт 17 | Возврат "1.6.0"; 18 | КонецФункции 19 | 20 | // Возвращает приоритет выполнения плагина 21 | // 22 | // Возвращаемое значение: 23 | // Число - приоритет выполнения плагина 24 | // 25 | Функция Приоритет() Экспорт 26 | Возврат 0; 27 | КонецФункции 28 | 29 | // Возвращает описание плагина 30 | // 31 | // Возвращаемое значение: 32 | // Строка - описание функциональности плагина 33 | // 34 | Функция Описание() Экспорт 35 | Возврат "Плагин добавляет функциональность проверки автора версии в хранилище и файла AUTHORS"; 36 | КонецФункции 37 | 38 | // Возвращает подробную справку к плагину 39 | // 40 | // Возвращаемое значение: 41 | // Строка - подробная справка для плагина 42 | // 43 | Функция Справка() Экспорт 44 | Возврат "Справка плагина"; 45 | КонецФункции 46 | 47 | // Возвращает имя плагина 48 | // 49 | // Возвращаемое значение: 50 | // Строка - имя плагина при подключении 51 | // 52 | Функция Имя() Экспорт 53 | Возврат "check-authors"; 54 | КонецФункции 55 | 56 | // Возвращает имя лога плагина 57 | // 58 | // Возвращаемое значение: 59 | // Строка - имя лога плагина 60 | // 61 | Функция ИмяЛога() Экспорт 62 | Возврат "oscript.lib.gitsync.plugins.check-authors"; 63 | КонецФункции 64 | 65 | #КонецОбласти 66 | 67 | #Область Подписки_на_события 68 | 69 | Процедура ПриАктивизации(СтандартныйОбработчик) Экспорт 70 | 71 | Лог.Отладка("Активизация плагина <%1>", Имя()); 72 | Обработчик = СтандартныйОбработчик; 73 | МассивНомеровВерсий = Неопределено; 74 | 75 | КонецПроцедуры 76 | 77 | Процедура ПередНачаломВыполнения(ПутьКХранилищу, ВходящийКаталогРабочейКопии) Экспорт 78 | 79 | Лог.Отладка("Начата работа плагина <%1>", Имя()); 80 | КаталогРабочейКопии = ВходящийКаталогРабочейКопии; 81 | 82 | КонецПроцедуры 83 | 84 | Процедура ПослеПолученияТаблицыАвторов(ПутьКФайлуАвторов, ТаблицаАвторов) Экспорт 85 | 86 | ТаблицаАвторовГит = ТаблицаАвторов.Скопировать(); 87 | 88 | КонецПроцедуры 89 | 90 | Процедура ПередНачаломЦиклаОбработкиВерсий(ТаблицаИсторииХранилища, ТекущаяВерсия, СледующаяВерсия, МаксимальнаяВерсияДляРазбора) Экспорт 91 | 92 | КоличествоВерсий = 0; 93 | 94 | Для Каждого СтрокаВерсии Из ТаблицаИсторииХранилища Цикл 95 | 96 | Если СтрокаВерсии.НомерВерсии < ТекущаяВерсия Тогда 97 | Продолжить; 98 | КонецЕсли; 99 | 100 | СтрокаПользователя = ТаблицаАвторовГит.Найти(СтрокаВерсии.Автор, "Автор"); 101 | 102 | Если СтрокаПользователя = Неопределено Тогда 103 | 104 | Лог.Отладка("Проверяю строку: "+ СтрокаВерсии.НомерВерсии); 105 | СтрокаОшибки = СтрШаблон("Нашли версию <%1>, а автор <%2> не сопоставлен пользователь git.", 106 | СтрокаВерсии.НомерВерсии, 107 | СтрокаВерсии.Автор); 108 | Лог.КритичнаяОшибка(СтрокаОшибки); 109 | КоличествоВерсий = КоличествоВерсий + 1; 110 | 111 | КонецЕсли; 112 | 113 | КонецЦикла; 114 | 115 | Если КоличествоВерсий > 0 Тогда 116 | 117 | СтрокаОшибки = СтрШаблон("В таблице истории версий найдены авторы (количество %1), которые не сопоставлены в AUTHORS", 118 | КоличествоВерсий); 119 | 120 | ВызватьИсключение СтрокаОшибки; 121 | 122 | КонецЕсли; 123 | 124 | КонецПроцедуры 125 | 126 | #КонецОбласти 127 | 128 | Процедура Инициализация() 129 | 130 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 131 | КомандыПлагина = Новый Массив; 132 | КомандыПлагина.Добавить("sync"); 133 | 134 | КонецПроцедуры 135 | 136 | Инициализация(); 137 | -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/src/Roles/ПолныеПрава/Rights.rights: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | true 5 | false 6 | 7 | Configuration.Конфигурация 8 | 9 | Administration 10 | true 11 | 12 | 13 | DataAdministration 14 | true 15 | 16 | 17 | UpdateDataBaseConfiguration 18 | true 19 | 20 | 21 | ExclusiveMode 22 | true 23 | 24 | 25 | ActiveUsers 26 | true 27 | 28 | 29 | EventLog 30 | true 31 | 32 | 33 | ThinClient 34 | true 35 | 36 | 37 | WebClient 38 | true 39 | 40 | 41 | ThickClient 42 | true 43 | 44 | 45 | ExternalConnection 46 | true 47 | 48 | 49 | Automation 50 | true 51 | 52 | 53 | AllFunctionsMode 54 | true 55 | 56 | 57 | SaveUserData 58 | true 59 | 60 | 61 | InteractiveOpenExtDataProcessors 62 | true 63 | 64 | 65 | InteractiveOpenExtReports 66 | true 67 | 68 | 69 | Output 70 | true 71 | 72 | 73 | 74 | Catalog.Справочник1 75 | 76 | Read 77 | true 78 | 79 | 80 | Insert 81 | true 82 | 83 | 84 | Update 85 | true 86 | 87 | 88 | Delete 89 | true 90 | 91 | 92 | View 93 | true 94 | 95 | 96 | InteractiveInsert 97 | true 98 | 99 | 100 | Edit 101 | true 102 | 103 | 104 | InteractiveDelete 105 | true 106 | 107 | 108 | InteractiveSetDeletionMark 109 | true 110 | 111 | 112 | InteractiveClearDeletionMark 113 | true 114 | 115 | 116 | InteractiveDeleteMarked 117 | true 118 | 119 | 120 | InputByString 121 | true 122 | 123 | 124 | 125 | SessionParameter.РежимТестированияВключен 126 | 127 | Get 128 | true 129 | 130 | 131 | Set 132 | true 133 | 134 | 135 | 136 | SessionParameter.ПараметрыТестирования 137 | 138 | Get 139 | true 140 | 141 | 142 | Set 143 | true 144 | 145 | 146 | 147 | -------------------------------------------------------------------------------- /src/Классы/roboCopy.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | #Использовать tempfiles 3 | 4 | Перем Лог; 5 | Перем КомандыПлагина; 6 | 7 | #Область Интерфейс_плагина 8 | 9 | // Возвращает версию плагина 10 | // 11 | // Возвращаемое значение: 12 | // Строка - текущая версия плагина 13 | // 14 | Функция Версия() Экспорт 15 | Возврат "1.6.0"; 16 | КонецФункции 17 | 18 | // Возвращает приоритет выполнения плагина 19 | // 20 | // Возвращаемое значение: 21 | // Число - приоритет выполнения плагина 22 | // 23 | Функция Приоритет() Экспорт 24 | Возврат 0; 25 | КонецФункции 26 | 27 | // Возвращает описание плагина 28 | // 29 | // Возвращаемое значение: 30 | // Строка - описание функциональности плагина 31 | // 32 | Функция Описание() Экспорт 33 | Возврат "(Windows-only) Плагин заменяет механизм переноса исходников из временного каталога в рабочий на robocopy, чтобы избежать ошибок с длиной пути к файлу"; 34 | КонецФункции 35 | 36 | // Возвращает подробную справку к плагину 37 | // 38 | // Возвращаемое значение: 39 | // Строка - подробная справка для плагина 40 | // 41 | Функция Справка() Экспорт 42 | Возврат "Справка плагина"; 43 | КонецФункции 44 | 45 | // Возвращает имя плагина 46 | // 47 | // Возвращаемое значение: 48 | // Строка - имя плагина при подключении 49 | // 50 | Функция Имя() Экспорт 51 | Возврат "roboCopy"; 52 | КонецФункции 53 | 54 | // Возвращает имя лога плагина 55 | // 56 | // Возвращаемое значение: 57 | // Строка - имя лога плагина 58 | // 59 | Функция ИмяЛога() Экспорт 60 | Возврат "oscript.lib.gitsync.plugins.roboCopy"; 61 | КонецФункции 62 | 63 | #КонецОбласти 64 | 65 | #Область Подписки_на_события 66 | 67 | Процедура ПриРегистрацииКомандыПриложения(ИмяКоманды, КлассРеализации, Парсер) Экспорт 68 | 69 | Лог.Отладка("Ищу команду <%1> в списке поддерживаемых", ИмяКоманды); 70 | 71 | Если КомандыПлагина.Найти(ИмяКоманды) = Неопределено Тогда 72 | Возврат; 73 | КонецЕсли; 74 | 75 | КонецПроцедуры 76 | 77 | Процедура ПриПолученииПараметров(ПараметрыКоманды, ДополнительныеПараметры) Экспорт 78 | 79 | КонецПроцедуры 80 | 81 | Процедура ПриОчисткеКаталогаРабочейКопии(КаталогРабочейКопии, СоответствиеИменФайловДляПропуска, СтандартнаяОбработка) Экспорт 82 | 83 | СтандартнаяОбработка = Ложь; 84 | Лог.Отладка("Удаляем файлы из каталога рабочей копии"); 85 | ВременныйКаталог = ПолучитьИмяВременногоФайла(); 86 | СоздатьКаталог(ВременныйКаталог); 87 | Для Каждого ИмяФайлаДляПропуска Из СоответствиеИменФайловДляПропуска Цикл 88 | Файл = Новый Файл(ОбъединитьПути(КаталогРабочейКопии, ИмяФайлаДляПропуска.Ключ)); 89 | НовыйФайл = Новый Файл(ОбъединитьПути(ВременныйКаталог, ИмяФайлаДляПропуска.Ключ)); 90 | Если Файл.Существует() Тогда 91 | КопироватьФайл(Файл.ПолноеИмя, НовыйФайл.ПолноеИмя); 92 | КонецЕсли; 93 | КонецЦикла; 94 | Команда = Новый Команда(); 95 | Команда.УстановитьКоманду("robocopy"); 96 | Команда.ДобавитьПараметр(ВременныйКаталог); 97 | Команда.ДобавитьПараметр(КаталогРабочейКопии); 98 | Команда.ДобавитьПараметр("/PURGE"); 99 | Команда.Исполнить(); 100 | Попытка 101 | УдалитьФайлы(ВременныйКаталог); 102 | Исключение 103 | КонецПопытки; 104 | КонецПроцедуры 105 | 106 | Процедура ПриПеремещенииВКаталогРабочейКопии(КаталогРабочейКопии, КаталогВыгрузки, СтандартнаяОбработка) Экспорт 107 | 108 | Лог.Отладка("Переношу исходники из %1 в %2", КаталогВыгрузки, КаталогРабочейКопии); 109 | 110 | СтандартнаяОбработка = Ложь; 111 | 112 | Команда = Новый Команда(); 113 | Команда.УстановитьКоманду("robocopy"); 114 | Команда.ДобавитьПараметр(КаталогВыгрузки); 115 | Команда.ДобавитьПараметр(КаталогРабочейКопии); 116 | Команда.ДобавитьПараметр("/E"); 117 | Команда.Исполнить(); 118 | 119 | КонецПроцедуры 120 | 121 | #КонецОбласти 122 | 123 | Процедура Инициализация() 124 | 125 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 126 | КомандыПлагина = Новый Массив; 127 | КомандыПлагина.Добавить("sync"); 128 | 129 | КонецПроцедуры 130 | 131 | Инициализация(); 132 | -------------------------------------------------------------------------------- /tasks/install-gitsync.os: -------------------------------------------------------------------------------- 1 | #Использовать gitrunner 2 | #Использовать tempfiles 3 | #Использовать fs 4 | 5 | Перем Лог; 6 | 7 | Процедура ПолучитьИсходники(Знач URLРепозитория, Знач Ветка, Знач Каталог) 8 | 9 | ГитРепозиторий = Новый ГитРепозиторий; 10 | 11 | ГитРепозиторий.УстановитьРабочийКаталог(Каталог); 12 | 13 | ГитРепозиторий.КлонироватьРепозиторий(URLРепозитория, Каталог); 14 | Лог.Информация("Извлекаю изменения с удаленного сервера"); 15 | ГитРепозиторий.Извлечь(); 16 | 17 | Лог.Информация("Доступные ветки"); 18 | СписокВеток = ГитРепозиторий.ПолучитьСписокВеток(Истина); 19 | 20 | Для каждого СтрокаТЧ Из СписокВеток Цикл 21 | 22 | Лог.Информация("Ветка <%1>", СтрокаТЧ.Имя); 23 | 24 | КонецЦикла; 25 | 26 | ГитРепозиторий.ПерейтиВВетку(Ветка, , Истина); 27 | 28 | КонецПроцедуры 29 | 30 | Процедура УстановитьПакет(Знач Каталог, ПутьКМанифестуСборки) 31 | 32 | Лог.Информация("Каталог сборки <%1>", Каталог); 33 | 34 | Лог.Информация("Сборка пакета библиотеки"); 35 | 36 | КомандаOpm = Новый Команда; 37 | КомандаOpm.УстановитьРабочийКаталог(Каталог); 38 | КомандаOpm.УстановитьКоманду("opm"); 39 | КомандаOpm.ДобавитьПараметр("install"); 40 | КомандаOpm.ДобавитьПараметр("-l"); 41 | КомандаOpm.ДобавитьЛогВыводаКоманды("task.install-opm"); 42 | 43 | КодВозврата = КомандаOpm.Исполнить(); 44 | 45 | КомандаOpm = Новый Команда; 46 | КомандаOpm.УстановитьРабочийКаталог(Каталог); 47 | КомандаOpm.УстановитьКоманду("opm"); 48 | КомандаOpm.ДобавитьПараметр("build"); 49 | КомандаOpm.ДобавитьПараметр("--mf"); 50 | КомандаOpm.ДобавитьПараметр(ПутьКМанифестуСборки); 51 | КомандаOpm.ДобавитьПараметр(Каталог); 52 | КомандаOpm.ДобавитьЛогВыводаКоманды("task.install-opm"); 53 | 54 | КодВозврата = КомандаOpm.Исполнить(); 55 | 56 | Если КодВозврата <> 0 Тогда 57 | ВызватьИсключение КомандаOpm.ПолучитьВывод(); 58 | КонецЕсли; 59 | 60 | МассивФайлов = НайтиФайлы(Каталог, "gitsync*.ospx"); 61 | 62 | Если МассивФайлов.Количество() = 0 Тогда 63 | ВызватьИсключение Новый ИнформацияОбОшибке("Ошибка создания пакета gitsync", "Не найден собранный файл пакета gitsync"); 64 | КонецЕсли; 65 | 66 | ФайлПакетаGitsync = МассивФайлов[0].ПолноеИмя; 67 | 68 | КореньПроекта = ОбъединитьПути(ТекущийСценарий().Каталог, ".."); 69 | 70 | // устанавливать gitsync из файла с параметром --dest 71 | // необходимо в каталог, отличный от ./bin, потому что 72 | // на Linux имя каталога установки ./bin/gitsync 73 | // и имя исполняемого файла ./bin/gitsync совпадут 74 | КаталогУстановкиGitsync = ОбъединитьПути(КореньПроекта, "bin_gitsync"); 75 | 76 | ФС.ОбеспечитьКаталог(КаталогУстановкиGitsync); 77 | 78 | Лог.Информация("Установка в каталог проекта <%1>", КаталогУстановкиGitsync); 79 | 80 | Лог.Информация("Установка пакета из файла <%1>", ФайлПакетаGitsync); 81 | 82 | КомандаOpm = Новый Команда; 83 | КомандаOpm.УстановитьРабочийКаталог(КореньПроекта); 84 | КомандаOpm.УстановитьКоманду("opm"); 85 | КомандаOpm.ДобавитьПараметр("install"); 86 | КомандаOpm.ДобавитьПараметр("-f"); 87 | КомандаOpm.ДобавитьПараметр(ФайлПакетаGitsync); 88 | КомандаOpm.ДобавитьПараметр("--dest"); 89 | КомандаOpm.ДобавитьПараметр(КаталогУстановкиGitsync); 90 | КомандаOpm.ДобавитьЛогВыводаКоманды("task.install-opm"); 91 | 92 | КодВозврата = КомандаOpm.Исполнить(); 93 | 94 | Если КодВозврата <> 0 Тогда 95 | ВызватьИсключение СтрШаблон("Ошибка установки opm из <%1> по причине <%2>", ФайлПакетаGitsync, КомандаOpm.ПолучитьВывод()); 96 | КонецЕсли; 97 | 98 | КонецПроцедуры 99 | 100 | Процедура ПолезнаяРабота() 101 | 102 | URLРепозитория = "https://github.com/oscript-library/gitsync.git"; 103 | КаталогСборки = ВременныеФайлы.СоздатьКаталог(); 104 | Ветка = "master"; 105 | 106 | ПутьКМанифестуСборки = "build_packagedef"; 107 | 108 | ПолучитьИсходники(URLРепозитория, Ветка, КаталогСборки); 109 | УстановитьПакет(КаталогСборки, ПутьКМанифестуСборки); 110 | 111 | ВременныеФайлы.УдалитьФайл(КаталогСборки); 112 | 113 | КонецПроцедуры 114 | 115 | Лог = Логирование.ПолучитьЛог("task.install-opm"); 116 | 117 | ПолезнаяРабота(); 118 | -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/src/Catalogs/Справочник1/Справочник1.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Справочник1 11 | true 12 | Catalog.Справочник1.StandardAttribute.Description 13 | Catalog.Справочник1.StandardAttribute.Code 14 | DontUse 15 | Use 16 | Managed 17 | Use 18 | 2 19 | true 20 | 9 21 | 25 22 | String 23 | Variable 24 | true 25 | true 26 | AsDescription 27 | InDialog 28 | BothWays 29 | Catalog.Справочник1.Form.ФормаЭлемента 30 | Catalog.Справочник1.Form.ФормаСписка 31 | 32 | Реквизит1 33 | 34 | String 35 | 36 | 10 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | Use 45 | Use 46 | 47 | 48 | 49 | 50 | 51 | 52 | ТабличнаяЧасть1 53 | 54 | Реквизит1 55 | 56 | String 57 | 58 | 10 59 | 60 | 61 | 62 | 63 | Use 64 | Use 65 | 66 | 67 | 68 | ФормаЭлемента 69 | 70 | ru 71 | Форма элемента 72 | 73 | PersonalComputer 74 | MobileDevice 75 | 76 | 77 | ФормаСписка 78 | 79 | ru 80 | Форма списка 81 | 82 | Ordinary 83 | PersonalComputer 84 | MobileDevice 85 | 86 | 87 | -------------------------------------------------------------------------------- /features/limit.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Работа плагина ограничений выгрузки 4 | Как Пользователь 5 | Я хочу выполнять автоматическую синхронизацию конфигурации из хранилища 6 | Чтобы автоматизировать свою работы с хранилищем с git 7 | 8 | Контекст: Тестовый контекст limit 9 | Когда Я очищаю параметры команды "gitsync" в контексте 10 | И Я устанавливаю рабочий каталог во временный каталог 11 | И Я создаю новый объект ГитРепозиторий 12 | И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 13 | И Я устанавливаю текущие плагины 14 | И Я создаю временный каталог и сохраняю его в переменной "КаталогХранилища1С" 15 | И я скопировал каталог тестового хранилища конфигурации в каталог из переменной "КаталогХранилища1С" 16 | И Я создаю временный каталог и сохраняю его в переменной "ПутьКаталогаИсходников" 17 | И Я инициализирую репозиторий в каталоге из переменной "ПутьКаталогаИсходников" 18 | И Я создаю тестовый файл AUTHORS 19 | И я включаю отладку лога с именем "oscript.app.gitsync" 20 | И Я создаю временный каталог и сохраняю его в переменной "ВременнаяДиректория" 21 | И Я добавляю параметр "--tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" 22 | # И Я добавляю параметр "-v" для команды "gitsync" 23 | И Я добавляю параметр "sync" для команды "gitsync" 24 | И Я выключаю все плагины 25 | И Я включаю плагин "limit" 26 | 27 | Сценарий: Cинхронизация с использованием limit 28 | Допустим Я добавляю параметр "-l 1" для команды "gitsync" 29 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 30 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 31 | И Я записываю "9" в файл VERSION 32 | Когда Я выполняю команду "gitsync" 33 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 34 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 35 | И Код возврата команды "gitsync" равен 0 36 | И Количество коммитов должно быть "1" 37 | 38 | Сценарий: Cинхронизация c использованием maxversion 39 | Допустим Я добавляю параметр "--maxversion 2" для команды "gitsync" 40 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 41 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 42 | И Я записываю "0" в файл VERSION 43 | Когда Я выполняю команду "gitsync" 44 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 45 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 46 | И Код возврата команды "gitsync" равен 0 47 | И Количество коммитов должно быть "2" 48 | 49 | Сценарий: Cинхронизация c использованием minversion 50 | Допустим Я добавляю параметр "--minversion 5" для команды "gitsync" 51 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 52 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 53 | И Я записываю "0" в файл VERSION 54 | Когда Я выполняю команду "gitsync" 55 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 56 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 57 | И Код возврата команды "gitsync" равен 0 58 | И Количество коммитов должно быть "6" 59 | 60 | Сценарий: Cинхронизация хранилища все вместе 61 | Допустим Я добавляю параметр "--limit 3" для команды "gitsync" 62 | И Я добавляю параметр "--minversion 2" для команды "gitsync" 63 | И Я добавляю параметр "--maxversion 4" для команды "gitsync" 64 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 65 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 66 | И Я записываю "0" в файл VERSION 67 | Когда Я выполняю команду "gitsync" 68 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 69 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 70 | И Код возврата команды "gitsync" равен 0 71 | И Количество коммитов должно быть "3" -------------------------------------------------------------------------------- /tests/fixtures/edtWorkspace/edtExport/src/CommonModules/Тестирование/Module.bsl: -------------------------------------------------------------------------------- 1 | // Реализация MOCK-поведения для тестирования. Автор - Артур Аюханов (c) artbear 2 | 3 | Функция РежимТестированияВключен() Экспорт 4 | Возврат ПараметрыСеанса.свзРежимТестированияВключен; 5 | КонецФункции 6 | 7 | Функция ВключитьРежимТестирования(структураПараметрыТестирования = Неопределено) Экспорт 8 | //Возврат свзТестирование.ВключитьРежимТестирования(структураПараметрыТестирования); 9 | 10 | Если НЕ РольДоступна("ПолныеПрава") И Метаданные.Роли.Количество() > 0 Тогда 11 | ВызватьИсключение "Не прав на включение режима тестирования"; 12 | КонецЕсли; 13 | 14 | ИнициализироватьПеременныеТеста(); 15 | 16 | Попытка 17 | Если Не РежимТестированияВключен() Тогда 18 | ПараметрыСеанса.свзРежимТестированияВключен = Истина; 19 | 20 | ЗаписьЖурналаРегистрации("РежимТестированияВключен.Установка",УровеньЖурналаРегистрации.Информация,,,"Установлен режим тестирования"); 21 | КонецЕсли; 22 | Исключение 23 | ТекстОшибки = ОписаниеОшибки(); 24 | ЗаписьЖурналаРегистрации("РежимТестированияВключен.Установка",УровеньЖурналаРегистрации.Ошибка,,,"Не удалось установить режим тестирования: "+ТекстОшибки); 25 | 26 | ВызватьИсключение "Не удалось установить режим тестирования: "+ТекстОшибки; 27 | КонецПопытки; 28 | 29 | Если структураПараметрыТестирования <> Неопределено Тогда 30 | ПараметрыСеанса.свзПараметрыТестирования = Новый ХранилищеЗначения(структураПараметрыТестирования, Новый СжатиеДанных(0)); //ФиксированнаяСтруктура(структураПараметрыТестирования); 31 | //глПараметрыТестирования = Новый Структура("МокОбъект", МокОбъект); 32 | КонецЕсли; 33 | Возврат Истина; 34 | КонецФункции 35 | 36 | Функция ОтключитьРежимТестирования() Экспорт 37 | //Возврат свзТестирование.ОтключитьРежимТестирования(); 38 | 39 | Если НЕ РольДоступна("ПолныеПрава") И Метаданные.Роли.Количество() > 0 Тогда 40 | ВызватьИсключение "Не прав на включение/отключение режима тестирования"; 41 | КонецЕсли; 42 | 43 | ИнициализироватьПеременныеТеста(); 44 | 45 | Попытка 46 | Если РежимТестированияВключен() Тогда 47 | ПараметрыСеанса.свзРежимТестированияВключен = Ложь; 48 | ЗаписьЖурналаРегистрации("РежимТестированияВключен.Отмена",УровеньЖурналаРегистрации.Информация,,,"Отключен режим тестирования"); 49 | КонецЕсли; 50 | Исключение 51 | ТекстОшибки = ОписаниеОшибки(); 52 | ЗаписьЖурналаРегистрации("РежимТестированияВключен.Отмена",УровеньЖурналаРегистрации.Ошибка,,,"Не удалось отключить режим тестирования: "+ТекстОшибки); 53 | 54 | ВызватьИсключение "Не удалось отключить режим тестирования: "+ТекстОшибки; 55 | КонецПопытки; 56 | 57 | Возврат Истина; 58 | КонецФункции 59 | 60 | 61 | Функция ПолучитьПараметрыТестирования() Экспорт 62 | Если НЕ РежимТестированияВключен() Тогда 63 | ВызватьИсключение "Не включен режим тестирования"; 64 | КонецЕсли; 65 | Если ПараметрыСеанса.свзПараметрыТестирования = Неопределено Тогда 66 | ВызватьИсключение "Не заданы параметры тестирования"; 67 | КонецЕсли; 68 | 69 | параметрыТестирования = ПараметрыСеанса.свзПараметрыТестирования.Получить(); 70 | Если параметрыТестирования = Неопределено Тогда 71 | ВызватьИсключение "Не заданы параметры тестирования 2"; 72 | КонецЕсли; 73 | 74 | Возврат параметрыТестирования; 75 | КонецФункции 76 | 77 | Процедура ИнициализироватьПеременныеТеста() //Экспорт 78 | Попытка 79 | л = РежимТестированияВключен(); 80 | Исключение 81 | ПараметрыСеанса.свзРежимТестированияВключен = Ложь; 82 | ПараметрыСеанса.свзПараметрыТестирования = Новый ХранилищеЗначения(Неопределено); //ФиксированнаяСтруктура(); //"МокОбъект", Неопределено); 83 | //глПараметрыТестирования = Неопределено; 84 | КонецПопытки; 85 | 86 | КонецПроцедуры 87 | 88 | // код написан для юнит-теста 89 | &НаСервере 90 | Функция ТестовыйВызов_ВстроенныйМетодБезПараметров() Экспорт 91 | Если свзТестирование.РежимТестированияВключен() Тогда 92 | параметрыТестирования = ПолучитьПараметрыТестирования(); 93 | Возврат параметрыТестирования.Параметр; 94 | КонецЕсли; 95 | //Если свзТестирование.РежимТестированияВключен() И ПараметрыСеанса.свзПараметрыТестирования <> Неопределено Тогда 96 | // параметрыТестирования = ПараметрыСеанса.свзПараметрыТестирования.Получить(); 97 | // Возврат параметрыТестирования.Параметр; 98 | //КонецЕсли; 99 | 100 | Возврат 2; 101 | КонецФункции 102 | -------------------------------------------------------------------------------- /src/Классы/replaceAuthors.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | 3 | Перем Лог; 4 | Перем Обработчик; 5 | Перем МеткаЗамены; 6 | Перем АвторыДляДополнения; 7 | 8 | #Область Интерфейс_плагина 9 | 10 | // Возвращает версию плагина 11 | // 12 | // Возвращаемое значение: 13 | // Строка - текущая версия плагина 14 | // 15 | Функция Версия() Экспорт 16 | Возврат "1.6.0"; 17 | КонецФункции 18 | 19 | // Возвращает приоритет выполнения плагина 20 | // 21 | // Возвращаемое значение: 22 | // Число - приоритет выполнения плагина 23 | // 24 | Функция Приоритет() Экспорт 25 | Возврат 0; 26 | КонецФункции 27 | 28 | // Возвращает описание плагина 29 | // Возвращает описание плагина 30 | // 31 | // Возвращаемое значение: 32 | // Строка - описание функциональности плагина 33 | // 34 | Функция Описание() Экспорт 35 | Возврат "Плагин добавляет функциональность замены автора коммита"; 36 | КонецФункции 37 | 38 | // Возвращает подробную справку к плагину 39 | // 40 | // Возвращаемое значение: 41 | // Строка - подробная справка для плагина 42 | // 43 | Функция Справка() Экспорт 44 | 45 | ТекстСправки = 46 | "Плагин позволяет заменить автора коммита в git. 47 | | 48 | |Для замены необходимо при помещении версии хранилища добавить в комментарий к версии строку: 49 | | 50 | | --GitSyncAuthor НовыйАвтор 51 | | 52 | |НовыйАвтор должен быть указан в файле AUTHORS, наличие в хранилище не обязательно. 53 | | 54 | |При коммите изменений в git будет выполнена замена автора версии хранилища. 55 | | 56 | |Также будет удалена строка с командой замены из комментария коммита."; 57 | 58 | Возврат ТекстСправки; 59 | 60 | КонецФункции 61 | 62 | // Возвращает имя плагина 63 | // 64 | // Возвращаемое значение: 65 | // Строка - имя плагина при подключении 66 | // 67 | Функция Имя() Экспорт 68 | Возврат "replace-authors"; 69 | КонецФункции 70 | 71 | // Возвращает имя лога плагина 72 | // 73 | // Возвращаемое значение: 74 | // Строка - имя лога плагина 75 | // 76 | Функция ИмяЛога() Экспорт 77 | Возврат "oscript.lib.gitsync.plugins.replace-authors"; 78 | КонецФункции 79 | 80 | #КонецОбласти 81 | 82 | #Область Подписки_на_события 83 | 84 | Процедура ПриАктивизации(СтандартныйОбработчик) Экспорт 85 | 86 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 87 | 88 | Лог.Отладка("Активизация плагина <%1>", Имя()); 89 | Обработчик = СтандартныйОбработчик; 90 | 91 | МеткаЗамены = "--GitSyncAuthor "; 92 | 93 | АвторыДляДополнения = Новый Массив; 94 | 95 | КонецПроцедуры 96 | 97 | Процедура ПередНачаломВыполнения(ПутьКХранилищу, ВходящийКаталогРабочейКопии) Экспорт 98 | 99 | Лог.Отладка("Начата работа плагина <%1>", Имя()); 100 | 101 | КонецПроцедуры 102 | 103 | Процедура ПослеПолученияТаблицыВерсий(ТаблицаВерсий, ПутьКХранилищу) Экспорт 104 | 105 | Для Каждого СтрокаВерсии Из ТаблицаВерсий Цикл 106 | 107 | СтрокВКомментарии = СтрЧислоСтрок(СтрокаВерсии.Комментарий); 108 | 109 | Для Счетчик = 1 По СтрокВКомментарии Цикл 110 | 111 | СтрокаКомментария = СтрПолучитьСтроку(СтрокаВерсии.Комментарий, Счетчик); 112 | 113 | НужноЗаменитьАвтора = СтрНайти(СтрокаКомментария, МеткаЗамены) > 0; 114 | 115 | Если НужноЗаменитьАвтора Тогда 116 | 117 | НовыйАвтор = СтрЗаменить(СтрокаКомментария, МеткаЗамены, ""); 118 | НовыйАвтор = СокрЛП(НовыйАвтор); 119 | 120 | СтарыйАвтор = СтрокаВерсии.Автор; 121 | 122 | СтрокаВерсии.Автор = НовыйАвтор; 123 | СтрокаВерсии.ГУИД_Автора = НовыйАвтор; 124 | 125 | СтрокаВерсии.Комментарий = СтрЗаменить(СтрокаВерсии.Комментарий, СтрокаКомментария, ""); 126 | 127 | Лог.Информация( 128 | "Для версии хранилища <%1> заменен автор с <%2> на <%3>", 129 | СтрокаВерсии.НомерВерсии, 130 | СтарыйАвтор, 131 | НовыйАвтор); 132 | 133 | АвторыДляДополнения.Добавить(НовыйАвтор); 134 | 135 | КонецЕсли; 136 | 137 | КонецЦикла; 138 | 139 | КонецЦикла; 140 | 141 | КонецПроцедуры 142 | 143 | Процедура ПослеПолученияТаблицыПользователей(ТаблицаПользователей, ПутьКХранилищу) Экспорт 144 | 145 | Для каждого Автор Из АвторыДляДополнения Цикл 146 | 147 | НужноДобавитьВТаблицуПользователей = ТаблицаПользователей.Найти(Автор, "ГУИД_Автора") = Неопределено; 148 | 149 | Если НужноДобавитьВТаблицуПользователей Тогда 150 | 151 | НовыйПользователь = ТаблицаПользователей.Добавить(); 152 | НовыйПользователь.Автор = Автор; 153 | НовыйПользователь.ГУИД_Автора = Автор; 154 | 155 | КонецЕсли; 156 | 157 | КонецЦикла; 158 | 159 | КонецПроцедуры 160 | 161 | #КонецОбласти 162 | -------------------------------------------------------------------------------- /tasks/pack.os: -------------------------------------------------------------------------------- 1 | Перем ИндексКлассов; 2 | Перем КаталогBin; 3 | Перем КаталогКлассов; 4 | Перем ПрефиксКлассов; 5 | Перем ИмяМенеджераФайлов; 6 | 7 | Процедура ВыполнитьЗапаковку() 8 | 9 | ТекущийКаталогЗадачи = ТекущийСценарий().Каталог; 10 | 11 | КаталогПроекта = Новый Файл(ОбъединитьПути(ТекущийКаталогЗадачи, "..")).ПолноеИмя; 12 | 13 | ПрефиксКлассов = "gitsync_plugins"; 14 | 15 | КаталогКлассов = ОбъединитьПути(КаталогПроекта, "src/Классы/internal/bindata/Классы"); 16 | КаталогBin = ОбъединитьПути(КаталогПроекта, "bin"); 17 | 18 | Каталогv8unpack = ОбъединитьПути(КаталогBin, "v8unpack"); 19 | КаталогcTool_1CD = ОбъединитьПути(КаталогBin, "cTool_1CD"); 20 | 21 | ИмяМенеджераФайлов = "МенеджерЗапакованныхФайловGitsyncPlugins.os"; 22 | 23 | ИндексКлассов = Новый Соответствие; 24 | ОбработатьКаталог(Каталогv8unpack, "*.dll"); 25 | ОбработатьКаталог(Каталогv8unpack, "*.exe"); 26 | ОбработатьКаталог(КаталогcTool_1CD, "*.exe"); 27 | 28 | ЗаписатьКлассИндексаЗапаковки(ИндексКлассов); 29 | 30 | КонецПроцедуры 31 | 32 | Процедура ЗаписатьКлассИндексаЗапаковки(ИндексКлассов) 33 | 34 | ТекстБлока = "Функция ПолучитьИндексФайлов() Экспорт 35 | | 36 | | ИндексФайлов = Новый Соответствие; 37 | |"; 38 | 39 | ШаблонДобавленияВИндекс = " ИндексФайлов.Вставить(""%1"", ""%2"");"; 40 | 41 | Для каждого ДанныеКласса Из ИндексКлассов Цикл 42 | 43 | ТекстБлока = ТекстБлока + СтрШаблон(ШаблонДобавленияВИндекс, ДанныеКласса.Ключ, ДанныеКласса.Значение) + Символы.ПС; 44 | 45 | КонецЦикла; 46 | 47 | ТекстБлока = ТекстБлока + " 48 | | Возврат ИндексФайлов; 49 | | 50 | |КонецФункции"; 51 | 52 | ФайлКлассаМенеджерЗапакованныхФайлов = ОбъединитьПути(КаталогКлассов, ИмяМенеджераФайлов); 53 | 54 | ЗаписьТекста = Новый ЗаписьТекста(ФайлКлассаМенеджерЗапакованныхФайлов); 55 | ЗаписьТекста.ЗаписатьСтроку(ТекстБлока); 56 | ЗаписьТекста.Закрыть(); 57 | 58 | Сообщить("Обработки запакованы в классы"); 59 | 60 | КонецПроцедуры 61 | 62 | Процедура ОбработатьКаталог(Знач КаталогОбработки, Знач МаскаПоискаФайлов) 63 | 64 | МассивНайденныхФайлов = НайтиФайлы(КаталогОбработки, МаскаПоискаФайлов); 65 | 66 | Для каждого НайденныйФайл Из МассивНайденныхФайлов Цикл 67 | 68 | Если НайденныйФайл.ЭтоКаталог() Тогда 69 | Продолжить; 70 | КонецЕсли; 71 | 72 | ИмяФайла = СтрЗаменить(НайденныйФайл.ИмяБезРасширения, ".", "_"); 73 | ПолныйПутьКФайлу = НайденныйФайл.ПолноеИмя; 74 | 75 | ИмяКлассаФайла = СтрШаблон("%1_%2", ИмяФайла, ПрефиксКлассов); 76 | 77 | ПутьКФайлуКласса = ОбъединитьПути(КаталогКлассов, ИмяКлассаФайла + ".os"); 78 | ДанныеФайла = ПолучитBase64Строка(ПолныйПутьКФайлу); 79 | ХешСтрока = ПолучитьХешСтроку(ПолныйПутьКФайлу); 80 | 81 | ЗаписатьКласс(ПутьКФайлуКласса, НайденныйФайл.Имя, "1.0.0", ХешСтрока, ДанныеФайла); 82 | 83 | ИндексКлассов.Вставить(НайденныйФайл.Имя, ИмяКлассаФайла); 84 | 85 | КонецЦикла; 86 | 87 | 88 | КонецПроцедуры 89 | 90 | Функция ПолучитьХешСтроку(ПутьКФайлу) 91 | 92 | ХешФайла = Новый ХешированиеДанных(ХешФункция.MD5); 93 | ХешФайла.ДобавитьФайл(ПутьКФайлу); 94 | 95 | Возврат ХешФайла.ХешСуммаСтрокой; 96 | 97 | КонецФункции 98 | 99 | Процедура ЗаписатьКласс(ПутьКФайлуКласса, ИмяФайла, ВерсияФайла, ХешСтрока, ДанныеФайла) 100 | 101 | ШаблонТекст = " 102 | |/////////////////////////////////////////// 103 | |// ФАЙЛ СОЗДАН АВТОМАТИЧЕСКИ // 104 | |/////////////////////////////////////////// 105 | |// 106 | |// ФАЙЛ: <%1> 107 | |// 108 | | 109 | |// Возвращает версию запакованного файла 110 | |// 111 | |Функция Версия() Экспорт 112 | | Возврат ""%2""; 113 | |КонецФункции 114 | | 115 | |// Возвращает имя запакованного файла 116 | |// 117 | |Функция ИмяФайла() Экспорт 118 | | Возврат ""%1""; 119 | |КонецФункции 120 | | 121 | |// Возвращает хеш строку запакованного файла 122 | |// 123 | |Функция Хеш() Экспорт 124 | | Возврат ""%3""; 125 | |КонецФункции 126 | | 127 | |// Возвращает запакованные данные файла 128 | |// 129 | |Функция ДвоичныеДанные() Экспорт 130 | | ЗапакованныеДанные = ""%4""; 131 | | Возврат ЗапакованныеДанные; 132 | |КонецФункции 133 | | 134 | |"; 135 | 136 | ТекстКласса = СтрШаблон(ШаблонТекст, ИмяФайла, ВерсияФайла, ХешСтрока, ДанныеФайла); 137 | 138 | ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлуКласса); 139 | ЗаписьТекста.ЗаписатьСтроку(ТекстКласса); 140 | ЗаписьТекста.Закрыть(); 141 | 142 | КонецПроцедуры 143 | 144 | Функция ПолучитBase64Строка(ПутьКФайлу) 145 | 146 | ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу); 147 | Строка = Base64Строка(ДвоичныеДанныеФайла); 148 | Возврат Строка; 149 | 150 | КонецФункции 151 | 152 | ВыполнитьЗапаковку(); -------------------------------------------------------------------------------- /tasks/make.os: -------------------------------------------------------------------------------- 1 | #Использовать gitrunner 2 | #Использовать tempfiles 3 | 4 | Перем Лог; 5 | Перем КаталогПроекта; 6 | 7 | Процедура ВыполнитьСборкуEXE(КаталогУстановки) 8 | 9 | Лог.Информация("Выполнение создания exe в <%1>", КаталогУстановки); 10 | 11 | ФайлПриложения = ОбъединитьПути(КаталогУстановки, "gitsync", "src/cmd", "gitsync.os"); 12 | ВыходнойФайл = ОбъединитьПути(КаталогПроекта, "bin", "gitsync.exe"); 13 | 14 | КомандаOpm = Новый Команда; 15 | КомандаOpm.УстановитьРабочийКаталог(КаталогУстановки); 16 | КомандаOpm.УстановитьКоманду("oscript"); 17 | КомандаOpm.ДобавитьПараметр("-make"); 18 | КомандаOpm.ДобавитьПараметр(ФайлПриложения); 19 | КомандаOpm.ДобавитьПараметр(ВыходнойФайл); 20 | КомандаOpm.ПоказыватьВыводНемедленно(Истина); 21 | 22 | КодВозврата = КомандаOpm.Исполнить(); 23 | 24 | Если КодВозврата <> 0 Тогда 25 | ВызватьИсключение ""; 26 | КонецЕсли; 27 | 28 | КонецПроцедуры 29 | 30 | Процедура ПодготовитьПлагины(Знач КаталогУстановки, КаталогПлагинов) 31 | 32 | КаталогВнутреннихКлассов = ОбъединитьПути(КаталогУстановки, "gitsync", "src/core/Классы/internal/Классы"); 33 | 34 | ПодготовитьФайлИндексПлагиновEXE(КаталогВнутреннихКлассов, КаталогПлагинов); 35 | 36 | КонецПроцедуры 37 | 38 | Процедура ПодготовитьФайлИндексПлагиновEXE(Знач КаталогВнутреннихКлассов, Знач КаталогПлагинов) 39 | 40 | МассивПлагинов = ПолучитьМассивПлагинов(КаталогПлагинов); 41 | 42 | ФайлИндексПлагиновEXE = ОбъединитьПути(КаталогВнутреннихКлассов, "ПодключениеЗапакованныхПлагинов.os"); 43 | 44 | ЗаписьТекста = Новый ЗаписьТекста(ФайлИндексПлагиновEXE); 45 | 46 | КаталогиПлагинов = НайтиФайлы(КаталогПлагинов, ПолучитьМаскуВсеФайлы(), Ложь); 47 | 48 | ЗаписьТекста.ЗаписатьСтроку(СтрШаблон("#Использовать ""%1""", КаталогПлагинов)); 49 | 50 | ЗаписьТекста.ЗаписатьСтроку("Функция ИндексПлагинов() Экспорт"); 51 | ЗаписьТекста.ЗаписатьСтроку(" ИндексПлагинов = Новый Массив;"); 52 | 53 | Для каждого ИмяПлагина Из МассивПлагинов Цикл 54 | ЗаписьТекста.ЗаписатьСтроку(СтрШаблон(" ИндексПлагинов.Добавить(""%1"");", ИмяПлагина)); 55 | КонецЦикла; 56 | 57 | ЗаписьТекста.ЗаписатьСтроку(" Возврат ИндексПлагинов;"); 58 | ЗаписьТекста.ЗаписатьСтроку("КонецФункции"); 59 | 60 | ЗаписьТекста.Закрыть(); 61 | 62 | КонецПроцедуры 63 | 64 | Функция ПолучитьМассивПлагинов(Знач КаталогПлагинов) 65 | 66 | Лог.Отладка("Обновление индекса плагина из каталога <%1>", КаталогПлагинов); 67 | МассивПлагинов = Новый Массив; 68 | 69 | КаталогиПлагинов = НайтиФайлы(КаталогПлагинов, ПолучитьМаскуВсеФайлы(), Ложь); 70 | 71 | ПрочитатьПлагин(ОбъединитьПути(КаталогПроекта, "src"), МассивПлагинов); 72 | 73 | Лог.Отладка("В индекс плагинов добавлено <%1> плагинов", МассивПлагинов.Количество()); 74 | 75 | Возврат МассивПлагинов; 76 | 77 | КонецФункции 78 | 79 | Процедура ПрочитатьПлагин(Знач Путь, МассивПлагинов) 80 | 81 | Лог.Отладка("Загружаю плагины из каталога <%1>", Путь); 82 | 83 | ОбработатьСтруктуруКаталоговПоСоглашению(Путь, МассивПлагинов); 84 | 85 | КонецПроцедуры 86 | 87 | Процедура ОбработатьСтруктуруКаталоговПоСоглашению(Путь, МассивПлагинов) 88 | 89 | КаталогиКлассов = Новый Массив; 90 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "Классы")); 91 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "Classes")); 92 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "src", "Классы")); 93 | КаталогиКлассов.Добавить(ОбъединитьПути(Путь, "src", "Classes")); 94 | 95 | Для Каждого мКаталог Из КаталогиКлассов Цикл 96 | 97 | ОбработатьКаталогКлассов(мКаталог, МассивПлагинов); 98 | 99 | КонецЦикла; 100 | 101 | КонецПроцедуры 102 | 103 | Процедура ОбработатьКаталогКлассов(Знач Путь, МассивПлагинов) 104 | 105 | КаталогКлассов = Новый Файл(Путь); 106 | 107 | Если КаталогКлассов.Существует() Тогда 108 | Файлы = НайтиФайлы(КаталогКлассов.ПолноеИмя, "*.os"); 109 | Для Каждого Файл Из Файлы Цикл 110 | Сообщить(СтрШаблон(" класс (по соглашению) %1, файл %2", Файл.ИмяБезРасширения, Файл.ПолноеИмя)); 111 | СтандартнаяОбработка = Ложь; 112 | 113 | МассивПлагинов.Добавить(Файл.ИмяБезРасширения); 114 | 115 | КонецЦикла; 116 | КонецЕсли; 117 | 118 | КонецПроцедуры 119 | 120 | Процедура ПолезнаяРабота() 121 | 122 | КаталогСборки = ВременныеФайлы.СоздатьКаталог(); 123 | КаталогУстановки = ОбъединитьПути(КаталогПроекта, "bin"); 124 | 125 | ПодготовитьПлагины(КаталогУстановки, КаталогПроекта); 126 | ВыполнитьСборкуEXE(КаталогУстановки); 127 | 128 | ВременныеФайлы.УдалитьФайл(КаталогСборки); 129 | 130 | КонецПроцедуры 131 | 132 | ФайлКаталогПроекта = Новый Файл(ОбъединитьПути(ТекущийСценарий().Каталог, "..")); 133 | КаталогПроекта = ФайлКаталогПроекта.ПолноеИмя; 134 | 135 | Лог = Логирование.ПолучитьЛог("task.install-opm"); 136 | 137 | ПолезнаяРабота(); 138 | -------------------------------------------------------------------------------- /features/edtExport.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Работа плагина выгрузки конфигурации в формат EDT 4 | Как Пользователь 5 | Я хочу выполнять автоматическую синхронизацию конфигурации из хранилища в формат EDT 6 | Чтобы не использовать ГитКонвертер 7 | 8 | Контекст: Тестовый контекст edtExport 9 | Когда Я очищаю параметры команды "gitsync" в контексте 10 | И Я устанавливаю рабочий каталог во временный каталог 11 | И Я создаю новый объект ГитРепозиторий 12 | И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 13 | И Я устанавливаю текущие плагины 14 | И Я создаю временный каталог и сохраняю его в переменной "КаталогХранилища1С" 15 | И Я создаю временный каталог и сохраняю его в переменной "РабочееОкружениеEDT" 16 | И я скопировал каталог тестового хранилища конфигурации в каталог из переменной "КаталогХранилища1С" 17 | И Я создаю временный каталог и сохраняю его в переменной "ПутьКаталогаИсходников" 18 | И Я инициализирую репозиторий в каталоге из переменной "ПутьКаталогаИсходников" 19 | И Я создаю тестовый файл AUTHORS 20 | И Я создаю временный каталог и сохраняю его в переменной "ВременнаяДиректория" 21 | И Я добавляю параметр "--tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" 22 | # И Я добавляю параметр "-v" для команды "gitsync" 23 | И Я добавляю параметр "sync" для команды "gitsync" 24 | И Я добавляю параметр "--PN test" для команды "gitsync" 25 | И Я выключаю все плагины 26 | И Я включаю плагин "edtExport" 27 | 28 | Сценарий: Cинхронизация с использованием edtExport без явного указания версии EDT 29 | Допустим Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 30 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 31 | И Я записываю "8" в файл VERSION 32 | Когда Я выполняю команду "gitsync" 33 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 34 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 35 | И Вывод команды "gitsync" содержит "Версия EDT не передана через параметры, выполняется поиск максимальной установленной версии." 36 | И Код возврата команды "gitsync" равен 0 37 | 38 | Сценарий: Cинхронизация с использованием edtExport с явным указанием версии EDT 39 | Дано Я получаю переменную окружения "EDT_VERSION" в переменную "ВерсияEDT" 40 | Дано Я добавляю параметр "--edt-version" для команды "gitsync" из переменной "ВерсияEDT" 41 | Допустим Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 42 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 43 | И Я записываю "8" в файл VERSION 44 | Когда Я выполняю команду "gitsync" 45 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 46 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 47 | И Вывод команды "gitsync" не содержит "Версия EDT не передана через параметры, выполняется поиск максимальной установленной версии." 48 | И Код возврата команды "gitsync" равен 0 49 | 50 | Сценарий: Cинхронизация хранилища расширения с использованием edtExport без указания базового проекта 51 | Допустим Я скопировал каталог тестового хранилища конфигурации расширения в каталог из переменной "КаталогХранилища1С" 52 | И я скопировал каталог рабочего окружения EDT в каталог из переменной "РабочееОкружениеEDT" 53 | И Я добавляю параметр "-e test" для команды "gitsync" 54 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 55 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 56 | И Я записываю "2" в файл VERSION 57 | Когда Я выполняю команду "gitsync" 58 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 59 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 60 | И Код возврата команды "gitsync" равен 0 61 | 62 | Сценарий: Cинхронизация хранилища расширения с использованием edtExport с указанием базового проекта 63 | Допустим Я скопировал каталог тестового хранилища конфигурации расширения в каталог из переменной "КаталогХранилища1С" 64 | И я скопировал каталог рабочего окружения EDT в каталог из переменной "РабочееОкружениеEDT" 65 | И Я добавляю параметр "-e test" для команды "gitsync" 66 | И Я добавляю параметр "-W" для команды "gitsync" из переменной "РабочееОкружениеEDT" 67 | И Я добавляю параметр "--BP edtExport" для команды "gitsync" 68 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 69 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 70 | И Я записываю "2" в файл VERSION 71 | Когда Я выполняю команду "gitsync" 72 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 73 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 74 | И Код возврата команды "gitsync" равен 0 75 | -------------------------------------------------------------------------------- /features/sync-remote.feature: -------------------------------------------------------------------------------- 1 | # language: ru 2 | 3 | Функционал: Работа плагина отправки изменений на удаленный узел 4 | Как Пользователь 5 | Я хочу выполнять автоматическую синхронизацию конфигурации из хранилища 6 | Чтобы автоматизировать свою работы с хранилищем с git 7 | 8 | Контекст: Тестовый контекст 9 | Когда Я очищаю параметры команды "gitsync" в контексте 10 | И Я устанавливаю рабочий каталог во временный каталог 11 | И Я создаю новый объект ГитРепозиторий 12 | И Я устанавливаю путь выполнения команды "gitsync" к текущей библиотеке 13 | И Я устанавливаю текущие плагины 14 | И Я создаю временный каталог и сохраняю его в переменной "КаталогХранилища1С" 15 | И я скопировал каталог тестового хранилища конфигурации в каталог из переменной "КаталогХранилища1С" 16 | И Я создаю временный каталог и сохраняю его в переменной "ПутьКаталогаИсходников" 17 | И Я инициализирую репозиторий в каталоге из переменной "ПутьКаталогаИсходников" 18 | И Я создаю тестовый файл AUTHORS 19 | И я включаю отладку лога с именем "oscript.app.gitsync" 20 | И Я создаю временный каталог и сохраняю его в переменной "ВременнаяДиректория" 21 | И Я создаю временный каталог и сохраняю его в контекст 22 | И Я инициализирую bare репозиторий во временном каталоге 23 | И Я сохраняю значение временного каталога в переменной "URLРепозитория" 24 | И я инициализирую связь "ПутьКаталогаИсходников" с внешним репозиторием "URLРепозитория" 25 | И Я добавляю параметр "--tempdir" для команды "gitsync" из переменной "ВременнаяДиректория" 26 | # И Я добавляю параметр "-v" для команды "gitsync" 27 | И Я добавляю параметр "sync" для команды "gitsync" 28 | И Я выключаю все плагины 29 | И Я включаю плагин "sync-remote" 30 | 31 | Сценарий: Cинхронизация с использованием push 32 | Допустим Я добавляю параметр "--PS" для команды "gitsync" 33 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 34 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 35 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "URLРепозитория" 36 | И Я записываю "9" в файл VERSION 37 | Когда Я выполняю команду "gitsync" 38 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 39 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 40 | И Код возврата команды "gitsync" равен 0 41 | 42 | Сценарий: Cинхронизация с использованием pull и push 43 | Допустим Я добавляю параметр "--PS" для команды "gitsync" 44 | И Я добавляю параметр "-G" для команды "gitsync" 45 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 46 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 47 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "URLРепозитория" 48 | И Я записываю "9" в файл VERSION 49 | Когда Я выполняю команду "gitsync" 50 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 51 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 52 | И Код возврата команды "gitsync" равен 0 53 | 54 | Сценарий: Cинхронизация c использованием push-tags 55 | Допустим Я добавляю параметр "--PS" для команды "gitsync" 56 | И Я добавляю параметр "--push-tags" для команды "gitsync" 57 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 58 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 59 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "URLРепозитория" 60 | И Я записываю "9" в файл VERSION 61 | Когда Я выполняю команду "gitsync" 62 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 63 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 64 | И Код возврата команды "gitsync" равен 0 65 | 66 | Сценарий: Cинхронизация c использованием push-every-n-commits 67 | Допустим Я добавляю параметр "--PS" для команды "gitsync" 68 | И Я добавляю параметр "--push-n-commits 1" для команды "gitsync" 69 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 70 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 71 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "URLРепозитория" 72 | И Я записываю "9" в файл VERSION 73 | Когда Я выполняю команду "gitsync" 74 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 75 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 76 | И Код возврата команды "gitsync" равен 0 77 | 78 | Сценарий: Cинхронизация хранилища все вместе 79 | Допустим Я добавляю параметр "--PS" для команды "gitsync" 80 | И Я добавляю параметр "-GTn=2" для команды "gitsync" 81 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "КаталогХранилища1С" 82 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "ПутьКаталогаИсходников" 83 | И Я добавляю позиционный параметр для команды "gitsync" из переменной "URLРепозитория" 84 | И Я записываю "6" в файл VERSION 85 | Когда Я выполняю команду "gitsync" 86 | Тогда Вывод команды "gitsync" содержит "Завершена синхронизации с git" 87 | И Вывод команды "gitsync" не содержит "Внешнее исключение" 88 | И Код возврата команды "gitsync" равен 0 89 | -------------------------------------------------------------------------------- /src/Классы/unpackForm.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | #Использовать "./internal/v8unpack" 3 | 4 | Перем Лог; 5 | Перем Обработчик; 6 | Перем КомандыПлагина; 7 | 8 | Перем ВыполнятьПереименованиеModule; 9 | Перем ВыполнятьПереименованиеForm; 10 | Перем Распаковщик; 11 | 12 | 13 | #Область Интерфейс_плагина 14 | 15 | // Возвращает версию плагина 16 | // 17 | // Возвращаемое значение: 18 | // Строка - текущая версия плагина 19 | // 20 | Функция Версия() Экспорт 21 | Возврат "1.6.0"; 22 | КонецФункции 23 | 24 | // Возвращает приоритет выполнения плагина 25 | // 26 | // Возвращаемое значение: 27 | // Число - приоритет выполнения плагина 28 | // 29 | Функция Приоритет() Экспорт 30 | Возврат 0; 31 | КонецФункции 32 | 33 | // Возвращает описание плагина 34 | // 35 | // Возвращаемое значение: 36 | // Строка - описание функциональности плагина 37 | // 38 | Функция Описание() Экспорт 39 | Возврат "Плагин добавляет функциональность распаковки обычных форм на исходники"; 40 | КонецФункции 41 | 42 | // Возвращает подробную справку к плагину 43 | // 44 | // Возвращаемое значение: 45 | // Строка - подробная справка для плагина 46 | // 47 | Функция Справка() Экспорт 48 | Возврат "Справка плагина"; 49 | КонецФункции 50 | 51 | // Возвращает имя плагина 52 | // 53 | // Возвращаемое значение: 54 | // Строка - имя плагина при подключении 55 | // 56 | Функция Имя() Экспорт 57 | Возврат "unpackForm"; 58 | КонецФункции 59 | 60 | // Возвращает имя лога плагина 61 | // 62 | // Возвращаемое значение: 63 | // Строка - имя лога плагина 64 | // 65 | Функция ИмяЛога() Экспорт 66 | Возврат "oscript.lib.gitsync.plugins.unpackForm"; 67 | КонецФункции 68 | 69 | #КонецОбласти 70 | 71 | #Область Подписки_на_события 72 | 73 | Процедура ПриАктивизации(СтандартныйОбработчик) Экспорт 74 | 75 | Обработчик = СтандартныйОбработчик; 76 | ВыполнятьПереименованиеModule = Ложь; 77 | ВыполнятьПереименованиеForm = Ложь; 78 | 79 | КонецПроцедуры 80 | 81 | Процедура ПриРегистрацииКомандыПриложения(ИмяКоманды, КлассРеализации) Экспорт 82 | 83 | Лог.Отладка("Ищу команду <%1> в списке поддерживаемых", ИмяКоманды); 84 | Если КомандыПлагина.Найти(ИмяКоманды) = Неопределено Тогда 85 | Возврат; 86 | КонецЕсли; 87 | 88 | Лог.Отладка("Устанавливаю дополнительные параметры для команды %1", ИмяКоманды); 89 | 90 | КлассРеализации.Опция("R rename-module", Ложь, "[*unpackForm] переименование module -> module.bsl") 91 | .Флаг() 92 | .ВОкружении("GITSYNC_RENAME_MODULE"); 93 | 94 | КлассРеализации.Опция("F rename-form", Ложь, "[*unpackForm] переименование form -> form.txt") 95 | .Флаг() 96 | .ВОкружении("GITSYNC_RENAME_FORM"); 97 | 98 | КонецПроцедуры 99 | 100 | Процедура ПриПолученииПараметров(ПараметрыКоманды) Экспорт 101 | 102 | ВыполнятьПереименованиеModule = ПараметрыКоманды.Параметр("rename-module", Ложь); 103 | ВыполнятьПереименованиеForm = ПараметрыКоманды.Параметр("rename-form", Ложь); 104 | 105 | КонецПроцедуры 106 | 107 | Процедура ПередПеремещениемВКаталогРабочейКопии(Конфигуратор, КаталогРабочейКопии, КаталогВыгрузки, ПутьКХранилищу, НомерВерсии) Экспорт 108 | 109 | СписокФайлов = НайтиФайлы(КаталогВыгрузки, "Form.bin", Истина); 110 | Лог.Отладка("Найдено файлов form.bin: <%1> шт.", СписокФайлов.Количество()); 111 | 112 | Если СписокФайлов.Количество() > 0 Тогда 113 | 114 | Распаковщик = Новый РаспаковкаФорм; 115 | 116 | КонецЕсли; 117 | 118 | Для Каждого ФайлФормы Из СписокФайлов Цикл 119 | 120 | НовыйКаталог = Новый Файл(ФайлФормы.Путь); 121 | 122 | КаталогФормы = ОбъединитьПути(НовыйКаталог.ПолноеИмя, ФайлФормы.ИмяБезРасширения); 123 | СоздатьКаталог(КаталогФормы); 124 | 125 | РаспаковатьКонтейнерМетаданных(ФайлФормы.ПолноеИмя, КаталогФормы); 126 | 127 | КонецЦикла; 128 | 129 | КонецПроцедуры 130 | 131 | #КонецОбласти 132 | 133 | Процедура РаспаковатьКонтейнерМетаданных(Знач ФайлРаспаковки, Знач КаталогРаспаковки) 134 | 135 | Распаковщик.Распаковать(ФайлРаспаковки, КаталогРаспаковки); 136 | 137 | Если ВыполнятьПереименованиеModule Тогда 138 | ПереименованиеModule(КаталогРаспаковки); 139 | КонецЕсли; 140 | 141 | Если ВыполнятьПереименованиеForm Тогда 142 | ПереименованиеForm(КаталогРаспаковки); 143 | КонецЕсли; 144 | 145 | КонецПроцедуры 146 | 147 | Процедура ПереименованиеModule(КаталогРаспаковки) 148 | 149 | Для Каждого ФайлМодуля Из НайтиФайлы(КаталогРаспаковки, "module", Истина) Цикл 150 | 151 | СтароеИмяФайла = ФайлМодуля.ПолноеИмя; 152 | НовоеИмяФайла = ОбъединитьПути(ФайлМодуля.Путь, "Module.bsl"); 153 | 154 | Лог.Отладка("Конвертирую наименование файла <%1> --> <%2>", СтароеИмяФайла, НовоеИмяФайла); 155 | КопироватьФайл(СтароеИмяФайла, НовоеИмяФайла); 156 | УдалитьФайлы(СтароеИмяФайла); 157 | 158 | КонецЦикла; 159 | 160 | КонецПроцедуры 161 | 162 | Процедура ПереименованиеForm(КаталогРаспаковки) 163 | 164 | Для Каждого ФайлФормы Из НайтиФайлы(КаталогРаспаковки, "form", Истина) Цикл 165 | 166 | СтароеИмяФайла = ФайлФормы.ПолноеИмя; 167 | НовоеИмяФайла = ОбъединитьПути(ФайлФормы.Путь, "form.txt"); 168 | 169 | Лог.Отладка("Конвертирую наименование файла <%1> --> <%2>", СтароеИмяФайла, НовоеИмяФайла); 170 | КопироватьФайл(СтароеИмяФайла, НовоеИмяФайла); 171 | УдалитьФайлы(СтароеИмяФайла); 172 | 173 | КонецЦикла; 174 | 175 | КонецПроцедуры 176 | 177 | Процедура Инициализация() 178 | 179 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 180 | КомандыПлагина = Новый Массив; 181 | КомандыПлагина.Добавить("sync"); 182 | 183 | КонецПроцедуры 184 | 185 | Инициализация(); 186 | -------------------------------------------------------------------------------- /.github/workflows/qa.yml: -------------------------------------------------------------------------------- 1 | # MIT License 2 | # Copyright (C) 2020 Tymko Oleg and contributors 3 | # All rights reserved. 4 | 5 | name: Контроль качества 6 | 7 | on: 8 | push: 9 | pull_request_target: 10 | workflow_dispatch: 11 | 12 | jobs: 13 | sonar: 14 | if: github.repository == 'oscript-library/gitsync-plugins' 15 | runs-on: ${{ matrix.os }} 16 | strategy: 17 | fail-fast: false 18 | matrix: 19 | os: [ubuntu-22.04] 20 | oscript_version: ['1.9.2'] 21 | v8_version: ['8.3.24.1691'] 22 | edt_version: ['2024.2.5'] 23 | locale: ['ru_RU'] 24 | 25 | steps: 26 | - name: Освобождение места 27 | if: startsWith(matrix.os, 'ubuntu') 28 | uses: easimon/maximize-build-space@master 29 | with: 30 | root-reserve-mb: 20480 31 | swap-size-mb: 1024 32 | remove-android: 'true' 33 | remove-haskell: 'true' 34 | remove-codeql: 'true' 35 | remove-docker-images: 'true' 36 | 37 | - name: Актуализация 38 | uses: actions/checkout@v4.2.2 39 | with: 40 | repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} 41 | ref: ${{ github.event.pull_request.head.ref || github.ref_name }} 42 | fetch-depth: 0 43 | 44 | # https://stackoverflow.com/questions/58033366/how-to-get-current-branch-within-github-actions 45 | - name: Извлечение имени текущей ветки 46 | shell: bash 47 | run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})" 48 | id: extract_branch 49 | 50 | - name: Установка OneScript 51 | uses: otymko/setup-onescript@v1.5 52 | with: 53 | version: ${{ matrix.oscript_version }} 54 | 55 | - name: Установка зависимостей 56 | run: | 57 | opm install opm 58 | opm install --dev 59 | opm install gitsync # TODO: должно быть необязательно 60 | 61 | - name: Подготовка окружения (Linux) 62 | if: startsWith(matrix.os, 'ubuntu') 63 | run: | 64 | sudo apt-get update 65 | sudo DEBIAN_FRONTEND=noninteractive apt-get install -y locales libwebkit2gtk-4.0-37 66 | sudo localedef -i ${{ matrix.locale }} -c -f UTF-8 -A /usr/share/locale/locale.alias ${{ matrix.locale }}.UTF-8 67 | 68 | - name: Установка wine для Tool1CD (Linux) 69 | if: startsWith(matrix.os, 'ubuntu') 70 | run: | 71 | sudo dpkg --add-architecture i386 72 | sudo apt update 73 | sudo apt install wine -y 74 | 75 | - name: Установка платформы 1С 76 | uses: 1CDevFlow/onec-setup-action@main 77 | with: 78 | type: onec # Тип устанавливаемого приложения 79 | onec_version: ${{ matrix.v8_version }} 80 | cache: true 81 | cache_distr: true 82 | env: 83 | ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }} 84 | ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }} 85 | 86 | - name: Установка Java 17 87 | uses: actions/setup-java@v4 88 | with: 89 | distribution: 'temurin' 90 | java-version: '17' 91 | 92 | - name: Установка EDT 93 | uses: 1CDevFlow/onec-setup-action@main 94 | with: 95 | type: edt 96 | edt_version: ${{ matrix.edt_version }} 97 | cache: true 98 | cache_distr: true 99 | env: 100 | ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }} 101 | ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }} 102 | 103 | - name: Установка лицензии (Linux) 104 | if: startsWith(matrix.os, 'ubuntu') 105 | run: | 106 | # Создание каталога 107 | sudo mkdir -p /var/1C/licenses 108 | 109 | # Запись лицензии в файл 110 | echo "${{ secrets.ONEC_LICENSE }}" | sudo tee /var/1C/licenses/licence.lic > /dev/null 111 | 112 | # Назначение прав 113 | sudo chmod 777 -R /var/1C/licenses 114 | shell: bash 115 | env: 116 | ONEC_LICENSE: ${{ secrets.ONEC_LICENSE }} 117 | 118 | - name: Установка gitsync локально 119 | run: opm run install-gitsync 120 | 121 | - name: Покрытие кода 122 | uses: coactions/setup-xvfb@v1 123 | env: 124 | EDT_VERSION: ${{ matrix.edt_version }} 125 | GITSYNC_V8VERSION: ${{ matrix.v8_version }} 126 | with: 127 | run: opm run coverage 128 | 129 | - name: Извлечение версии пакета 130 | shell: bash 131 | run: echo "##[set-output name=version;]`cat packagedef | grep ".Версия(" | sed 's|[^"]*"||' | sed -r 's/".+//'`" 132 | id: extract_version 133 | 134 | - name: Установка Sonar-scanner 135 | uses: warchant/setup-sonar-scanner@v8 136 | 137 | - name: Анализ в SonarQube (branch) 138 | if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' 139 | env: 140 | SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} 141 | run: sonar-scanner 142 | -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} 143 | -Dsonar.branch.name=${{ steps.extract_branch.outputs.branch }} 144 | -Dsonar.projectVersion=${{ steps.extract_version.outputs.version }} 145 | 146 | # https://docs.sonarqube.org/latest/analysis/pull-request/ 147 | - name: Анализ в SonarQube (pull-request) 148 | if: github.event_name == 'pull_request' || github.event_name == 'pull_request_target' 149 | env: 150 | SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }} 151 | run: sonar-scanner 152 | -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} 153 | -Dsonar.pullrequest.key=${{ github.event.pull_request.number }} 154 | -Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} 155 | -Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }} 156 | -Dsonar.scm.revision=${{ github.event.pull_request.head.sha }} 157 | -------------------------------------------------------------------------------- /.github/workflows/testing.yml: -------------------------------------------------------------------------------- 1 | # MIT License 2 | # Copyright (C) 2020 Tymko Oleg and contributors 3 | # All rights reserved. 4 | 5 | name: Тестирование 6 | 7 | on: 8 | push: 9 | pull_request_target: 10 | workflow_dispatch: 11 | 12 | permissions: 13 | checks: write 14 | pull-requests: write 15 | 16 | jobs: 17 | test: 18 | runs-on: ${{ matrix.os }} 19 | strategy: 20 | matrix: 21 | oscript_version: ['1.9.2'] 22 | v8_version: ['8.3.21.1624', '8.3.24.1691'] 23 | edt_version: ['2023.3.6', '2024.2.5'] 24 | os: [windows-latest, ubuntu-22.04] 25 | locale: ['ru_RU'] 26 | fail-fast: false 27 | steps: 28 | - name: Освобождение места 29 | if: startsWith(matrix.os, 'ubuntu') 30 | uses: easimon/maximize-build-space@master 31 | with: 32 | root-reserve-mb: 20480 33 | swap-size-mb: 1024 34 | remove-android: 'true' 35 | remove-haskell: 'true' 36 | remove-codeql: 'true' 37 | remove-docker-images: 'true' 38 | 39 | - name: Установка локали 40 | if: matrix.os == startsWith(matrix.os, 'windows') 41 | run: | 42 | powershell -Command "Set-WinUILanguageOverride -Language ru-RU" 43 | powershell -Command "Set-WinUserLanguageList ru-RU -Force" 44 | powershell -Command "Set-Culture ru-RU" 45 | powershell -Command "Set-WinSystemLocale ru-RU" 46 | 47 | - name: Актуализация 48 | uses: actions/checkout@v4.2.2 49 | with: 50 | repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} 51 | ref: ${{ github.event.pull_request.head.ref || github.ref_name }} 52 | 53 | - name: Установка OneScript 54 | uses: otymko/setup-onescript@v1.5 55 | with: 56 | version: ${{ matrix.oscript_version }} 57 | 58 | - name: Установка зависимостей 59 | run: | 60 | opm install opm 61 | opm install --dev 62 | opm install gitsync # TODO: должно быть необязательно 63 | 64 | - name: Подготовка окружения (Linux) 65 | if: startsWith(matrix.os, 'ubuntu') 66 | run: | 67 | sudo apt-get update 68 | sudo DEBIAN_FRONTEND=noninteractive apt-get install -y locales libwebkit2gtk-4.0-37 69 | sudo localedef -i ${{ matrix.locale }} -c -f UTF-8 -A /usr/share/locale/locale.alias ${{ matrix.locale }}.UTF-8 70 | 71 | - name: Установка libenchant1c2a для 8.3.21 (Linux) 72 | if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.v8_version, '8.3.21') 73 | run: | 74 | sudo echo "deb http://cz.archive.ubuntu.com/ubuntu focal main universe" | sudo tee -a /etc/apt/sources.list 75 | sudo apt-get update 76 | sudo DEBIAN_FRONTEND=noninteractive apt-get install -y libenchant1c2a 77 | 78 | - name: Установка wine для Tool1CD (Linux) 79 | if: startsWith(matrix.os, 'ubuntu') 80 | run: | 81 | sudo dpkg --add-architecture i386 82 | sudo apt update 83 | sudo apt install wine -y 84 | 85 | - name: Установка платформы 1С 86 | uses: 1CDevFlow/onec-setup-action@main 87 | with: 88 | type: onec # Тип устанавливаемого приложения 89 | onec_version: ${{ matrix.v8_version }} 90 | cache: true 91 | cache_distr: true 92 | env: 93 | ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }} 94 | ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }} 95 | 96 | - name: Установка Java 11 97 | if: startsWith(matrix.edt_version, '2023') 98 | uses: actions/setup-java@v4 99 | with: 100 | distribution: 'temurin' 101 | java-version: '11' 102 | 103 | - name: Установка Java 17 104 | if: startsWith(matrix.edt_version, '2024') 105 | uses: actions/setup-java@v4 106 | with: 107 | distribution: 'temurin' 108 | java-version: '17' 109 | 110 | - name: Установка EDT 111 | uses: 1CDevFlow/onec-setup-action@main 112 | with: 113 | type: edt 114 | edt_version: ${{ matrix.edt_version }} 115 | cache: true 116 | cache_distr: true 117 | env: 118 | ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }} 119 | ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }} 120 | 121 | - name: Установка лицензии (Linux) 122 | if: startsWith(matrix.os, 'ubuntu') 123 | run: | 124 | # Создание каталога 125 | sudo mkdir -p /var/1C/licenses 126 | 127 | # Запись лицензии в файл 128 | echo "${{ secrets.ONEC_LICENSE }}" | sudo tee /var/1C/licenses/licence.lic > /dev/null 129 | 130 | # Назначение прав 131 | sudo chmod 777 -R /var/1C/licenses 132 | shell: bash 133 | env: 134 | ONEC_LICENSE: ${{ secrets.ONEC_LICENSE }} 135 | 136 | - name: Установка лицензии (Windows) 137 | if: startsWith(matrix.os, 'windows') 138 | run: | 139 | mkdir "C:\ProgramData\1C\licenses" -Force 140 | echo $Env:ONEC_LICENSE | Out-File -FilePath "C:\ProgramData\1C\licenses\licence.lic" -Encoding ascii 141 | shell: pwsh 142 | env: 143 | ONEC_LICENSE: ${{ secrets.ONEC_LICENSE }} 144 | 145 | - name: Установка gitsync локально 146 | run: opm run install-gitsync 147 | 148 | - name: Тестирование 149 | uses: coactions/setup-xvfb@v1 150 | env: 151 | EDT_VERSION: ${{ matrix.edt_version }} 152 | GITSYNC_V8VERSION: ${{ matrix.v8_version }} 153 | with: 154 | run: oscript ./tasks/test.os 155 | 156 | - name: Публикация отчета 157 | if: success() || failure() 158 | uses: mikepenz/action-junit-report@v5 159 | with: 160 | report_paths: '**/build/reports/*.xml' 161 | fail_on_failure: true 162 | comment: true 163 | check_name: 'Результаты тестов. ОС: ${{ matrix.os }}. Версия 1С: ${{ matrix.v8_version }}. Версия OneScript: ${{ matrix.oscript_version }}. Версия EDT: ${{ matrix.edt_version }}' 164 | -------------------------------------------------------------------------------- /src/Классы/limit.os: -------------------------------------------------------------------------------- 1 | 2 | #Использовать logos 3 | 4 | Перем Лог; 5 | Перем КомандыПлагина; 6 | Перем Лимит; 7 | Перем Обработчик; 8 | Перем НачальнаяВерсия; 9 | Перем КонечнаяВерсия; 10 | 11 | #Область Интерфейс_плагина 12 | 13 | // Возвращает версию плагина 14 | // 15 | // Возвращаемое значение: 16 | // Строка - текущая версия плагина 17 | // 18 | Функция Версия() Экспорт 19 | Возврат "1.6.0"; 20 | КонецФункции 21 | 22 | // Возвращает приоритет выполнения плагина 23 | // 24 | // Возвращаемое значение: 25 | // Число - приоритет выполнения плагина 26 | // 27 | Функция Приоритет() Экспорт 28 | Возврат 0; 29 | КонецФункции 30 | 31 | // Возвращает описание плагина 32 | // 33 | // Возвращаемое значение: 34 | // Строка - описание функциональности плагина 35 | // 36 | Функция Описание() Экспорт 37 | Возврат "Плагин добавляет возможность ограничения на минимальный, максимальный номер версии хранилища, а так же на лимит на количество выгружаемых версий за один запуск"; 38 | КонецФункции 39 | 40 | // Возвращает подробную справку к плагину 41 | // 42 | // Возвращаемое значение: 43 | // Строка - подробная справка для плагина 44 | // 45 | Функция Справка() Экспорт 46 | Возврат "Справка плагина"; 47 | КонецФункции 48 | 49 | // Возвращает имя плагина 50 | // 51 | // Возвращаемое значение: 52 | // Строка - имя плагина при подключении 53 | // 54 | Функция Имя() Экспорт 55 | Возврат "limit"; 56 | КонецФункции 57 | 58 | // Возвращает имя лога плагина 59 | // 60 | // Возвращаемое значение: 61 | // Строка - имя лога плагина 62 | // 63 | Функция ИмяЛога() Экспорт 64 | Возврат "oscript.lib.gitsync.plugins.limit"; 65 | КонецФункции 66 | 67 | #КонецОбласти 68 | 69 | #Область Подписки_на_события 70 | 71 | Процедура ПриАктивизации(СтандартныйОбработчик) Экспорт 72 | 73 | Обработчик = СтандартныйОбработчик; 74 | 75 | КонецПроцедуры 76 | 77 | Процедура ПриРегистрацииКомандыПриложения(ИмяКоманды, КлассРеализации) Экспорт 78 | 79 | Лог.Отладка("Ищу команду <%1> в списке поддерживаемых", ИмяКоманды); 80 | Если КомандыПлагина.Найти(ИмяКоманды) = Неопределено Тогда 81 | Возврат; 82 | КонецЕсли; 83 | 84 | Лог.Отладка("Устанавливаю дополнительные параметры для команды %1", ИмяКоманды); 85 | 86 | КлассРеализации.Опция("l limit", 0, СтрШаблон("[*limit] выгрузить не более <Количества> версий от текущей выгруженной")) 87 | .ТЧисло() 88 | .ВОкружении("GITSYNC_LIMIT"); 89 | КлассРеализации.Опция("minversion", 0, СтрШаблон("[*limit] <номер> минимальной версии для выгрузки")) 90 | .ТЧисло(); 91 | КлассРеализации.Опция("maxversion", 0, СтрШаблон("[*limit] <номер> максимальной версии для выгрузки")) 92 | .ТЧисло(); 93 | 94 | КонецПроцедуры 95 | 96 | Процедура ПриПолученииПараметров(ПараметрыКоманды) Экспорт 97 | 98 | Лимит = ПараметрыКоманды.Параметр("limit", 0); 99 | НачальнаяВерсия = ПараметрыКоманды.Параметр("minversion", 0); 100 | КонечнаяВерсия = ПараметрыКоманды.Параметр("maxversion", 0); 101 | 102 | Если Лимит > 0 Тогда 103 | Лог.Информация("Установлен лимит <%1> для количества версий, при выгрузке", Лимит); 104 | КонецЕсли; 105 | 106 | Если НачальнаяВерсия > 0 Тогда 107 | Лог.Информация("Установлена начальная версия <%1> при выгрузке версий", НачальнаяВерсия); 108 | КонецЕсли; 109 | Если КонечнаяВерсия > 0 Тогда 110 | Лог.Информация("Установлена конечная версия <%1> при выгрузке версий", КонечнаяВерсия); 111 | КонецЕсли; 112 | 113 | КонецПроцедуры 114 | 115 | Процедура ПередНачаломЦиклаОбработкиВерсий(ТаблицаИсторииХранилища, ТекущаяВерсия, СледующаяВерсия, МаксимальнаяВерсияДляРазбора) Экспорт 116 | 117 | Если НачальнаяВерсия > 0 Тогда 118 | СледующаяВерсия = Макс(НачальнаяВерсия, СледующаяВерсия); 119 | КонецЕсли; 120 | 121 | Если Лимит > 0 Тогда 122 | 123 | СтрокаТекущейВерсии = ТаблицаИсторииХранилища.Найти(ТекущаяВерсия, "НомерВерсии"); 124 | ИндексСтрокиТекущейВерсии = ТаблицаИсторииХранилища.Индекс(СтрокаТекущейВерсии); 125 | ИндексСтрокиСОграничением = Мин(ТаблицаИсторииХранилища.Количество() - 1, ИндексСтрокиТекущейВерсии + Лимит); 126 | НомерВерсииСогласноЛимита = ТаблицаИсторииХранилища[ИндексСтрокиСОграничением].НомерВерсии; 127 | 128 | Если КонечнаяВерсия = 0 Тогда 129 | КонечнаяВерсия = НомерВерсииСогласноЛимита; 130 | Иначе 131 | КонечнаяВерсия = ?(КонечнаяВерсия >= НомерВерсииСогласноЛимита, КонечнаяВерсия, НомерВерсииСогласноЛимита); 132 | КонецЕсли; 133 | 134 | КонецЕсли; 135 | 136 | МаксимальнаяВерсияДляРазбора = ОпределитьМаксимальнуюВерсиюСУчетомОграниченияСверху(ТаблицаИсторииХранилища, ТекущаяВерсия, КонечнаяВерсия); 137 | 138 | КонецПроцедуры 139 | 140 | #КонецОбласти 141 | 142 | Функция ОпределитьМаксимальнуюВерсиюСУчетомОграниченияСверху(Знач ТаблицаИсторииХранилища, Знач ТекущаяВерсия, Знач МаксимальнаяВерсия) 143 | 144 | МаксимальнаяВерсияДляРазбора = 0; 145 | 146 | Если МаксимальнаяВерсия <> 0 Тогда 147 | Попытка 148 | МаксимальнаяВерсия = Число(МаксимальнаяВерсия); 149 | Исключение 150 | МаксимальнаяВерсия = 0; 151 | КонецПопытки; 152 | КонецЕсли; 153 | 154 | МаксВерсияВХранилище = ОпределитьМаксимальнуюВерсиюВХранилище(ТаблицаИсторииХранилища); 155 | 156 | Если МаксимальнаяВерсия > 0 Тогда 157 | МаксимальнаяВерсияДляРазбора = Мин(МаксВерсияВХранилище, МаксимальнаяВерсия) ; 158 | Иначе 159 | МаксимальнаяВерсияДляРазбора = МаксВерсияВХранилище; 160 | КонецЕсли; 161 | 162 | Возврат МаксимальнаяВерсияДляРазбора; 163 | 164 | КонецФункции 165 | 166 | Функция ОпределитьМаксимальнуюВерсиюВХранилище(Знач ТаблицаИсторииХранилища) 167 | 168 | Если ТаблицаИсторииХранилища.Количество() = 0 Тогда 169 | Возврат 0; 170 | КонецЕсли; 171 | 172 | МаксимальнаяВерсия = Число(ТаблицаИсторииХранилища[0].НомерВерсии); 173 | Для Сч = 1 По ТаблицаИсторииХранилища.Количество()-1 Цикл 174 | ЧислоВерсии = Число(ТаблицаИсторииХранилища[Сч].НомерВерсии); 175 | Если ЧислоВерсии > МаксимальнаяВерсия Тогда 176 | МаксимальнаяВерсия = ЧислоВерсии; 177 | КонецЕсли; 178 | КонецЦикла; 179 | 180 | Возврат МаксимальнаяВерсия; 181 | 182 | КонецФункции 183 | 184 | Процедура Инициализация() 185 | 186 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 187 | КомандыПлагина = Новый Массив; 188 | КомандыПлагина.Добавить("sync"); 189 | Лимит = 0; 190 | КонечнаяВерсия = 0; 191 | НачальнаяВерсия = 0; 192 | 193 | КонецПроцедуры 194 | 195 | Инициализация(); 196 | -------------------------------------------------------------------------------- /src/Классы/internal/tool1cd/Классы/ЧтениеТаблицФайловойБазыДанных.os: -------------------------------------------------------------------------------- 1 | #Использовать 1commands 2 | #Использовать tempfiles 3 | #Использовать "../../bindata" 4 | 5 | Перем мИмяФайлаБазы; 6 | Перем мКаталогВнешнихПрограмм; 7 | Перем мРабочийКаталог; 8 | Перем Лог; 9 | Перем ЭтоWindows; 10 | 11 | Процедура ОткрытьФайл(Знач ИмяФайла) Экспорт 12 | мИмяФайлаБазы = ИмяФайла; 13 | КонецПроцедуры 14 | 15 | Процедура ЗакрытьФайл() Экспорт 16 | мИмяФайлаБазы = Неопределено; 17 | ВременныеФайлы.УдалитьФайл(мРабочийКаталог); 18 | КонецПроцедуры 19 | 20 | Функция ПрочитатьТаблицу(Знач ИмяТаблицы) Экспорт 21 | 22 | ВыгрузитьТаблицыВXML(ИмяТаблицы); 23 | 24 | Возврат ПрочитатьТаблицуИзXml(ФайлВыгрузкиТаблицы(ИмяТаблицы)); 25 | 26 | КонецФункции 27 | 28 | Функция ВыгрузитьТаблицыВXML(Знач ИменаТаблиц) Экспорт 29 | 30 | ЛогTool1CD = ВременныеФайлы.НовоеИмяФайла("txt"); 31 | ПрефиксПути = ?(ЭтоWindows = Ложь, "Z:", ""); 32 | // СтрокаЗапуска = """" + ПутьTool1CD() + """ " 33 | СтрокаЗапуска = """"+ ПрефиксПути + мИмяФайлаБазы + """" 34 | + " -l """ +ПрефиксПути+ ЛогTool1CD + """" 35 | + " -q -ne -ex " 36 | + """" + ПрефиксПути + РабочийКаталог() + """ """ + ИменаТаблиц + """"; 37 | 38 | ПутьПриложения = ПутьTool1CD(); 39 | Если Не ЭтоWindows Тогда 40 | СтрокаЗапуска = СтрШаблон("""%1"" %2", ПутьПриложения, СтрокаЗапуска); 41 | ПутьПриложения = "wine"; 42 | КонецЕсли; 43 | 44 | Лог.Отладка(ПутьПриложения); 45 | Лог.Отладка(СтрокаЗапуска); 46 | 47 | Команда = Новый Команда; 48 | Команда.УстановитьКоманду(ПутьПриложения); 49 | Команда.УстановитьПараметры(СтрокаЗапуска); 50 | // Команда.УстановитьСтрокуЗапуска(СтрокаЗапуска); 51 | Команда.УстановитьКодировкуВывода(КодировкаТекста.OEM); 52 | Команда.ПоказыватьВыводНемедленно(Истина); 53 | КодВозврата = Команда.Исполнить(); 54 | 55 | Если КодВозврата <> 0 Тогда 56 | Лог.Ошибка(Команда.ПолучитьВывод()); 57 | ПоказатьЛог(ЛогTool1CD); 58 | ВызватьИсключение "Tool_1CD вернул код: " + КодВозврата; 59 | 60 | КонецЕсли; 61 | 62 | МассивИменТаблиц = РазложитьИменаТаблицВМассив(ИменаТаблиц); 63 | ФайлыВыгрузки = Новый Соответствие; 64 | Для Каждого ИмяТаблицы Из МассивИменТаблиц Цикл 65 | 66 | ФайлТаблицы = Новый Файл(ФайлВыгрузкиТаблицы(ИмяТаблицы)); 67 | Если Не ФайлТаблицы.Существует() Тогда 68 | ВызватьИсключение "Таблица " + ИмяТаблицы + " не была выгружена Tool_1CD"; 69 | КонецЕсли; 70 | 71 | ФайлыВыгрузки[ИмяТаблицы] = ФайлТаблицы.ПолноеИмя; 72 | 73 | КонецЦикла; 74 | 75 | Возврат ФайлыВыгрузки; 76 | 77 | КонецФункции 78 | 79 | Функция ПрочитатьТаблицуИзXml(Знач ФайлТаблицы) Экспорт 80 | 81 | ЧтениеXML = Новый ЧтениеXML; 82 | ЧтениеXML.ОткрытьФайл(ФайлТаблицы); 83 | 84 | Попытка 85 | 86 | ЧтениеXML.ПерейтиКСодержимому(); 87 | ЧтениеXML.Прочитать(); 88 | 89 | ПоляТаблицы = ПрочитатьПоляТаблицыИзXML(ЧтениеXML); 90 | ДанныеТаблицы = Новый ТаблицаЗначений; 91 | Для Каждого Поле Из ПоляТаблицы Цикл 92 | ДанныеТаблицы.Колонки.Добавить(Поле); 93 | КонецЦикла; 94 | 95 | Пока ЧтениеXML.Прочитать() Цикл 96 | 97 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента 98 | И ЧтениеXML.Имя = "Record" Тогда 99 | 100 | НоваяСтрока = ДанныеТаблицы.Добавить(); 101 | Пока ЧтениеXML.Прочитать() Цикл 102 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда 103 | НоваяСтрока[ЧтениеXML.Имя] = ПолучитьТекст(ЧтениеXML); 104 | КонецЕсли; 105 | 106 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Record" Тогда 107 | Прервать; 108 | КонецЕсли; 109 | 110 | КонецЦикла; 111 | 112 | КонецЕсли; 113 | КонецЦикла; 114 | 115 | ЧтениеXML.Закрыть(); 116 | 117 | Исключение 118 | ЧтениеXML.Закрыть(); 119 | ВызватьИсключение; 120 | КонецПопытки; 121 | 122 | Возврат ДанныеТаблицы; 123 | 124 | КонецФункции 125 | 126 | Функция ПрочитатьПоляТаблицыИзXML(Знач ЧтениеXML) 127 | ИменаПолей = Новый Массив; 128 | Пока ЧтениеXML.Прочитать() Цикл 129 | 130 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента 131 | И ЧтениеXML.Имя = "Field" Тогда 132 | 133 | ИменаПолей.Добавить(ЧтениеXML.ЗначениеАтрибута("Name")); 134 | 135 | КонецЕсли; 136 | 137 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Fields" Тогда 138 | Прервать; 139 | КонецЕсли; 140 | 141 | КонецЦикла; 142 | 143 | Возврат ИменаПолей; 144 | 145 | КонецФункции 146 | 147 | Функция ПолучитьТекст(ЧтениеXML) 148 | Результат = ""; 149 | Пока ЧтениеXML.Прочитать() Цикл 150 | 151 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда 152 | Результат = ЧтениеXML.Значение; 153 | КонецЕсли; 154 | Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда 155 | Прервать; 156 | КонецЕсли; 157 | КонецЦикла; 158 | 159 | Возврат Результат; 160 | 161 | КонецФункции 162 | 163 | Функция РабочийКаталог() 164 | Если мРабочийКаталог = Неопределено Тогда 165 | мРабочийКаталог = ВременныеФайлы.СоздатьКаталог(); 166 | КонецЕсли; 167 | 168 | Возврат мРабочийКаталог; 169 | 170 | КонецФункции 171 | 172 | Функция ПутьTool1CD() 173 | Если мКаталогВнешнихПрограмм = Неопределено Тогда 174 | мКаталогВнешнихПрограмм = Загрузчик_tool1CD.ПутьКФайлу(); 175 | КонецЕсли; 176 | 177 | Возврат мКаталогВнешнихПрограмм; 178 | 179 | КонецФункции 180 | 181 | Функция ФайлВыгрузкиТаблицы(Знач Таблица) 182 | Возврат ОбъединитьПути(РабочийКаталог(), Таблица+".xml"); 183 | КонецФункции 184 | 185 | Процедура ПоказатьЛог(Знач ЛогTool1CD) 186 | ТекстЛога = ПрочитатьФайл(ЛогTool1CD); 187 | Сообщить(ТекстЛога); 188 | 189 | Попытка 190 | УдалитьФайлы(ЛогTool1CD); 191 | Исключение 192 | КонецПопытки; 193 | КонецПроцедуры 194 | 195 | Функция ПрочитатьФайл(Знач ИмяФайла) 196 | Чтение = Новый ЧтениеТекста(ИмяФайла); 197 | Текст = Чтение.Прочитать(); 198 | Чтение.Закрыть(); 199 | 200 | Возврат Текст; 201 | КонецФункции 202 | 203 | Функция РазложитьИменаТаблицВМассив(Знач ИменаТаблиц) 204 | 205 | МассивИмен = Новый Массив; 206 | Хвост = ИменаТаблиц; 207 | Пока Истина Цикл 208 | Поз = Найти(Хвост, ";"); 209 | Если Поз > 0 Тогда 210 | Голова = СокрЛП(Лев(Хвост, Поз-1)); 211 | Хвост = Сред(Хвост, Поз+1); 212 | МассивИмен.Добавить(Голова); 213 | Иначе 214 | Голова = СокрЛП(Хвост); 215 | Если Не ПустаяСтрока(Голова) Тогда 216 | МассивИмен.Добавить(Голова); 217 | КонецЕсли; 218 | Прервать; 219 | КонецЕсли; 220 | КонецЦикла; 221 | 222 | Возврат МассивИмен; 223 | 224 | КонецФункции 225 | 226 | СистемнаяИнформация = Новый СистемнаяИнформация; 227 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; 228 | 229 | Лог = Логирование.ПолучитьЛог("oscript.lib.tool1cd"); -------------------------------------------------------------------------------- /tests/fixtures/ОтчетПоВерсиямХранилищаРасширения.mxl: -------------------------------------------------------------------------------- 1 | MOXCEL {8,1,12, 2 | {"#","",1,1,"#","Язык по умолчанию","Язык по умолчанию",0}, 3 | {128,72}, 4 | {1,1, 5 | {4,0, 6 | {0},0,1,0,f527dc88-1d39-40b3-bcbb-d98b690ead68,0},0},0, 7 | {0,0}, 8 | {0,0}, 9 | {0,0}, 10 | {0,0}, 11 | {0,0}, 12 | {0,0},0,2,45,0,0,1,0, 13 | {16,1, 14 | {1,1, 15 | {"#","Отчет по версиям хранилища: C:\repo\gitsync-plugins\tests\fixtures\extension_storage"} 16 | },0},1,0,2,0, 17 | {16,2, 18 | {1,1, 19 | {"#","Дата отчета:"} 20 | },0},1, 21 | {16,3, 22 | {1,1, 23 | {"#","06.06.2025"} 24 | },0},2,0,3,0, 25 | {16,2, 26 | {1,1, 27 | {"#","Время отчета:"} 28 | },0},1, 29 | {16,3, 30 | {1,1, 31 | {"#","18:01:35"} 32 | },0},8, 33 | {16,0, 34 | {1,0},0},3,0,1,0, 35 | {16,4, 36 | {1,0},0},4,0,2,0, 37 | {16,2, 38 | {1,1, 39 | {"#","Версия:"} 40 | },0},1, 41 | {16,5, 42 | {1,1, 43 | {"#","1"} 44 | },0},5,0,2,0, 45 | {16,2, 46 | {1,1, 47 | {"#","Пользователь:"} 48 | },0},1, 49 | {16,3, 50 | {1,1, 51 | {"#","Администратор"} 52 | },0},6,0,2,0, 53 | {16,2, 54 | {1,1, 55 | {"#","Дата создания:"} 56 | },0},1, 57 | {16,3, 58 | {1,1, 59 | {"#","11.03.2019"} 60 | },0},7,0,2,0, 61 | {16,2, 62 | {1,1, 63 | {"#","Время создания:"} 64 | },0},1, 65 | {16,3, 66 | {1,1, 67 | {"#","14:05:58"} 68 | },0},8,0,2,0, 69 | {16,2, 70 | {1,1, 71 | {"#","Версия конфигурации:"} 72 | },0},1, 73 | {16,3, 74 | {1,0},0},9,0,2,0, 75 | {16,6, 76 | {1,1, 77 | {"#","Комментарий:"} 78 | },0},1, 79 | {16,7, 80 | {1,1, 81 | {"#","Создание хранилища конфигурации"} 82 | },0},10,0,2,0, 83 | {0,8},1, 84 | {0,9},11,0,2,0, 85 | {16,10, 86 | {1,1, 87 | {"#","Добавлены:"} 88 | },0},1, 89 | {16,11, 90 | {1,1, 91 | {"#","Расширение1"} 92 | },0},12,0,2,0, 93 | {0,10},1, 94 | {16,12, 95 | {1,1, 96 | {"#","Роль.Расш1_ОсновнаяРоль"} 97 | },0},13,0,2,0, 98 | {0,10},1, 99 | {16,12, 100 | {1,1, 101 | {"#","Язык.Русский"} 102 | },0},14,0,1,0, 103 | {16,4, 104 | {1,0},0},15,0,2,0, 105 | {16,2, 106 | {1,1, 107 | {"#","Версия:"} 108 | },0},1, 109 | {16,5, 110 | {1,1, 111 | {"#","2"} 112 | },0},16,0,2,0, 113 | {16,2, 114 | {1,1, 115 | {"#","Пользователь:"} 116 | },0},1, 117 | {16,3, 118 | {1,1, 119 | {"#","Администратор"} 120 | },0},17,0,2,0, 121 | {16,2, 122 | {1,1, 123 | {"#","Дата создания:"} 124 | },0},1, 125 | {16,3, 126 | {1,1, 127 | {"#","11.03.2019"} 128 | },0},18,0,2,0, 129 | {16,2, 130 | {1,1, 131 | {"#","Время создания:"} 132 | },0},1, 133 | {16,3, 134 | {1,1, 135 | {"#","14:06:22"} 136 | },0},19,0,2,0, 137 | {16,2, 138 | {1,1, 139 | {"#","Версия конфигурации:"} 140 | },0},1, 141 | {16,3, 142 | {1,0},0},20,0,2,0, 143 | {16,6, 144 | {1,1, 145 | {"#","Комментарий:"} 146 | },0},1, 147 | {16,7, 148 | {1,1, 149 | {"#","Модуль"} 150 | },0},21,0,2,0, 151 | {0,8},1, 152 | {0,9},22,0,2,0, 153 | {16,10, 154 | {1,1, 155 | {"#","Добавлены:"} 156 | },0},1, 157 | {16,11, 158 | {1,1, 159 | {"#","ОбщийМодуль.Расш1_ОбщийМодуль1"} 160 | },0},23,0,2,0, 161 | {0,8},1, 162 | {0,8},24,0,2,0, 163 | {16,10, 164 | {1,1, 165 | {"#","Изменены:"} 166 | },0},1, 167 | {16,11, 168 | {1,1, 169 | {"#","Расширение1"} 170 | },0},25,0,1,0, 171 | {16,4, 172 | {1,0},0},26,0,2,0, 173 | {16,2, 174 | {1,1, 175 | {"#","Версия:"} 176 | },0},1, 177 | {16,5, 178 | {1,1, 179 | {"#","3"} 180 | },0},27,0,2,0, 181 | {16,2, 182 | {1,1, 183 | {"#","Пользователь:"} 184 | },0},1, 185 | {16,3, 186 | {1,1, 187 | {"#","Администратор"} 188 | },0},28,0,2,0, 189 | {16,2, 190 | {1,1, 191 | {"#","Дата создания:"} 192 | },0},1, 193 | {16,3, 194 | {1,1, 195 | {"#","11.03.2019"} 196 | },0},29,0,2,0, 197 | {16,2, 198 | {1,1, 199 | {"#","Время создания:"} 200 | },0},1, 201 | {16,3, 202 | {1,1, 203 | {"#","14:06:44"} 204 | },0},30,0,2,0, 205 | {16,2, 206 | {1,1, 207 | {"#","Версия конфигурации:"} 208 | },0},1, 209 | {16,3, 210 | {1,0},0},31,0,2,0, 211 | {16,6, 212 | {1,1, 213 | {"#","Комментарий:"} 214 | },0},1, 215 | {16,7, 216 | {1,1, 217 | {"#","Справочник"} 218 | },0},32,0,2,0, 219 | {0,8},1, 220 | {0,9},33,0,2,0, 221 | {16,10, 222 | {1,1, 223 | {"#","Добавлены:"} 224 | },0},1, 225 | {16,11, 226 | {1,1, 227 | {"#","Справочник.Расш1_Справочник1"} 228 | },0},34,0,2,0, 229 | {0,8},1, 230 | {0,8},35,0,2,0, 231 | {16,10, 232 | {1,1, 233 | {"#","Изменены:"} 234 | },0},1, 235 | {16,11, 236 | {1,1, 237 | {"#","Расширение1"} 238 | },0},36,0,1,0, 239 | {16,4, 240 | {1,0},0},37,0,2,0, 241 | {16,2, 242 | {1,1, 243 | {"#","Версия:"} 244 | },0},1, 245 | {16,5, 246 | {1,1, 247 | {"#","4"} 248 | },0},38,0,2,0, 249 | {16,2, 250 | {1,1, 251 | {"#","Пользователь:"} 252 | },0},1, 253 | {16,3, 254 | {1,1, 255 | {"#","Администратор"} 256 | },0},39,0,2,0, 257 | {16,2, 258 | {1,1, 259 | {"#","Дата создания:"} 260 | },0},1, 261 | {16,3, 262 | {1,1, 263 | {"#","11.03.2019"} 264 | },0},40,0,2,0, 265 | {16,2, 266 | {1,1, 267 | {"#","Время создания:"} 268 | },0},1, 269 | {16,3, 270 | {1,1, 271 | {"#","14:07:30"} 272 | },0},41,0,2,0, 273 | {16,2, 274 | {1,1, 275 | {"#","Версия конфигурации:"} 276 | },0},1, 277 | {16,3, 278 | {1,0},0},42,0,2,0, 279 | {16,6, 280 | {1,1, 281 | {"#","Комментарий:"} 282 | },0},1, 283 | {16,7, 284 | {1,0},0},43,0,2,0, 285 | {0,8},1, 286 | {0,8},44,0,2,0, 287 | {16,10, 288 | {1,1, 289 | {"#","Изменены:"} 290 | },0},1, 291 | {16,11, 292 | {1,1, 293 | {"#","Расширение2"} 294 | },0}, 295 | {9,0,00000000-0000-0000-0000-000000000000,5,0,13,1,14,7,15,8,16,11,17},45,1, 296 | {5,0,01e8dedb-737c-47cf-8870-788b05997c1c,3,0,13,1,18,4,19},14,10,0,11,0,12,0,13,0,21,0,22,0,23,0,24,0,32,0,33,0,34,0,35,0,43,0,44,0,0,0,1, 297 | {12,13,0, 298 | {1,0},0,0},0,0,0,0, 299 | {11, 300 | {0,3,8,3,0}, 301 | {1,9,8,9,0}, 302 | {1,10,4,10,0}, 303 | {0,14,8,14,0}, 304 | {1,20,8,20,0}, 305 | {1,21,4,21,0}, 306 | {0,25,8,25,0}, 307 | {1,31,8,31,0}, 308 | {1,32,4,32,0}, 309 | {0,36,8,36,0}, 310 | {1,42,8,42,0} 311 | }, 312 | {0}, 313 | {0}, 314 | {7,"AddedObject", 315 | {1, 316 | {1,-1,13,-1,13,00000000-0000-0000-0000-000000000000},0},"AddedObjects", 317 | {1, 318 | {1,-1,32,-1,33,00000000-0000-0000-0000-000000000000},0},"ChangedObjects", 319 | {1, 320 | {1,-1,43,-1,44,00000000-0000-0000-0000-000000000000},0},"Comment", 321 | {1, 322 | {1,-1,42,-1,42,00000000-0000-0000-0000-000000000000},0},"Private", 323 | {1, 324 | {1,-1,37,-1,41,00000000-0000-0000-0000-000000000000},0},"Separator", 325 | {1, 326 | {1,-1,36,-1,36,00000000-0000-0000-0000-000000000000},0},"Title", 327 | {1, 328 | {1,-1,0,-1,2,00000000-0000-0000-0000-000000000000},0} 329 | },"", 330 | { 331 | {0,6,6, 332 | {"N",1000},7, 333 | {"N",1000},8, 334 | {"N",1000},9, 335 | {"N",1000},10, 336 | {"N",1000},11, 337 | {"N",1000} 338 | } 339 | }, 340 | {0,-1,-1,-1,-1,00000000-0000-0000-0000-000000000000},0,0,0,0,0,0,0,1,0,1,19, 341 | {129,0,128}, 342 | {1,1}, 343 | {1,2}, 344 | {17,1,0}, 345 | {257,2,2}, 346 | {769,1,0,0}, 347 | {17153,3,5,0,3}, 348 | {31,1,0,0,0,0}, 349 | {7,1,0,0}, 350 | {415,1,0,0,0,0,128,2}, 351 | {158,0,0,0,0,686}, 352 | {30,0,0,0,0}, 353 | {128,160}, 354 | {128,122}, 355 | {128,96}, 356 | {128,107}, 357 | {128,83}, 358 | {128,686}, 359 | {128,82},4, 360 | {7,0,6,120,0,0,0,700,0,0,0,204,0,0,0,34,"Arial",1,100}, 361 | {7,0,2,98,0,0,0,400,0,0,0,204,0,0,0,34,"Arial",1,100}, 362 | {7,0,6,98,0,0,0,700,0,0,0,204,0,0,0,34,"Arial",1,100}, 363 | {7,0,3,98,0,0,0,400,0,0,0,204,3,2,1,34,"Arial",0,100},0,0,0,2, 364 | {3,3, 365 | {-1} 366 | }, 367 | {3,3, 368 | {-3} 369 | },0,1,0, 370 | {3,0,0,100,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,"#",0,1, 371 | {3,0,0,0,0,00000000-0000-0000-0000-000000000000},0,0,0,0,0},0,"", 372 | {0},0,0,0,1,0,0,0} -------------------------------------------------------------------------------- /src/Классы/increment.os: -------------------------------------------------------------------------------- 1 | 2 | #Использовать logos 3 | #Использовать gitrunner 4 | #Использовать fs 5 | 6 | Перем Лог; 7 | 8 | Перем Обработчик; 9 | 10 | Перем ИмяФайлаДампаКонфигурации; 11 | Перем ПутьКФайлуВерсийМетаданных; 12 | Перем ВыгрузкаИзмененийВозможна; 13 | Перем ИмяРасширения; 14 | 15 | Перем ИмяФайлаИзменений; 16 | Перем ПутьКФайлуИзменений; 17 | 18 | #Область Интерфейс_плагина 19 | 20 | // Возвращает версию плагина 21 | // 22 | // Возвращаемое значение: 23 | // Строка - текущая версия плагина 24 | // 25 | Функция Версия() Экспорт 26 | Возврат "1.6.0"; 27 | КонецФункции 28 | 29 | // Возвращает приоритет выполнения плагина 30 | // 31 | // Возвращаемое значение: 32 | // Число - приоритет выполнения плагина 33 | // 34 | Функция Приоритет() Экспорт 35 | Возврат 0; 36 | КонецФункции 37 | 38 | // Возвращает описание плагина 39 | // 40 | // Возвращаемое значение: 41 | // Строка - описание функциональности плагина 42 | // 43 | Функция Описание() Экспорт 44 | Возврат "Плагин добавляет возможность инкрементальной выгрузки в конфигурации"; 45 | КонецФункции 46 | 47 | // Возвращает подробную справку к плагину 48 | // 49 | // Возвращаемое значение: 50 | // Строка - подробная справка для плагина 51 | // 52 | Функция Справка() Экспорт 53 | Возврат "Справка плагина"; 54 | КонецФункции 55 | 56 | // Возвращает имя плагина 57 | // 58 | // Возвращаемое значение: 59 | // Строка - имя плагина при подключении 60 | // 61 | Функция Имя() Экспорт 62 | Возврат "increment"; 63 | КонецФункции 64 | 65 | // Возвращает имя лога плагина 66 | // 67 | // Возвращаемое значение: 68 | // Строка - имя лога плагина 69 | // 70 | Функция ИмяЛога() Экспорт 71 | Возврат "oscript.lib.gitsync.plugins.increment"; 72 | КонецФункции 73 | 74 | #КонецОбласти 75 | 76 | #Область Подписки_на_события 77 | 78 | Процедура ПриАктивизации(СтандартныйОбработчик) Экспорт 79 | 80 | Обработчик = СтандартныйОбработчик; 81 | ПутьКФайлуВерсийМетаданных = ""; 82 | ВыгрузкаИзмененийВозможна = Ложь; 83 | 84 | КонецПроцедуры 85 | 86 | // Вызывается перед началом работы менеджера синхронизации 87 | // 88 | // Параметры: 89 | // ПутьКХранилищу - Строка - полный путь к хранилищу конфигурации 90 | // КаталогРабочейКопии - Строка - полный путь к рабочему каталогу копии 91 | // 92 | Процедура ПередНачаломВыполнения(ПутьКХранилищу, КаталогРабочейКопии) Экспорт 93 | 94 | ИмяРасширения = Обработчик.ПолучитьИмяРасширения(); 95 | 96 | КонецПроцедуры 97 | 98 | Процедура ПередВыгрузкойКонфигурациюВИсходники(Конфигуратор, КаталогРабочейКопии, КаталогВыгрузки, ПутьКХранилищу, НомерВерсии) Экспорт 99 | 100 | Лог.Информация("Определяю тип возможной выгрузки конфигурации в файлы"); 101 | 102 | ТекущийФайлВерсийМетаданных = Новый Файл(ОбъединитьПути(КаталогРабочейКопии, ИмяФайлаДампаКонфигурации)); 103 | 104 | ПутьКФайлуВерсийМетаданных = ТекущийФайлВерсийМетаданных.ПолноеИмя; 105 | 106 | Лог.Отладка("Проверяю существование файла <%1> в каталоге <%2>, файл <%3>", 107 | ИмяФайлаДампаКонфигурации, 108 | КаталогРабочейКопии, 109 | ?(ТекущийФайлВерсийМетаданных.Существует(), "существует", "отсутствует")); 110 | 111 | Лог.Отладка("Проверяю возможность обновления выгрузки для файла <%1>", ПутьКФайлуВерсийМетаданных); 112 | 113 | ВыгрузкаИзмененийВозможна = ТекущийФайлВерсийМетаданных.Существует() 114 | И ПроверитьВозможностьОбновленияФайловВыгрузки(Конфигуратор, ПутьКФайлуВерсийМетаданных); 115 | 116 | Лог.Отладка("Инкрементальная выгрузка конфигурации - %1", ?(ВыгрузкаИзмененийВозможна, "ВОЗМОЖНА", "НЕВОЗМОЖНА")); 117 | 118 | Консоль.Вывести("ИНФОРМАЦИЯ - Тип выгрузки конфигурации в файлы:"); 119 | 120 | Если ВыгрузкаИзмененийВозможна Тогда 121 | Текст = "ИНКРЕМЕНТАЛЬНАЯ ВЫГРУЗКА"; 122 | Иначе 123 | Текст = "ПОЛНАЯ ВЫГРУЗКА"; 124 | КонецЕсли; 125 | 126 | Консоль.Вывести(" " + Текст); 127 | 128 | Консоль.ВывестиСтроку(""); 129 | 130 | КонецПроцедуры 131 | 132 | Процедура ПриВыгрузкеКонфигурациюВИсходники(Конфигуратор, КаталогВыгрузки, СтандартнаяОбработка) Экспорт 133 | 134 | Если ВыгрузкаИзмененийВозможна Тогда 135 | 136 | СтандартнаяОбработка = Ложь; 137 | 138 | Параметры = Конфигуратор.ПолучитьПараметрыЗапуска(); 139 | Параметры.Добавить(СтрШаблон("/DumpConfigToFiles %1", ОбернутьВКавычки(КаталогВыгрузки))); 140 | 141 | Параметры.Добавить("-update"); 142 | 143 | Параметры.Добавить(СтрШаблон("-configDumpInfoForChanges %1", ОбернутьВКавычки(ПутьКФайлуВерсийМетаданных))); 144 | 145 | Если ЗначениеЗаполнено(ИмяРасширения) Тогда 146 | Параметры.Добавить(СтрШаблон("-Extension %1", ИмяРасширения)); 147 | КонецЕсли; 148 | 149 | Конфигуратор.ВыполнитьКоманду(Параметры); 150 | 151 | Если ФС.ФайлСуществует(ПутьКФайлуИзменений) Тогда 152 | ПереместитьФайл(ПутьКФайлуИзменений, ОбъединитьПути(КаталогВыгрузки, ИмяФайлаИзменений)); 153 | КонецЕсли; 154 | 155 | КонецЕсли; 156 | 157 | КонецПроцедуры 158 | 159 | Процедура ПриОчисткеКаталогаРабочейКопии(КаталогРабочейКопии, СоответствиеИменФайловДляПропуска, СтандартнаяОбработка) Экспорт 160 | 161 | Если ВыгрузкаИзмененийВозможна Тогда 162 | СтандартнаяОбработка = Ложь; 163 | КонецЕсли; 164 | 165 | КонецПроцедуры 166 | 167 | #КонецОбласти 168 | 169 | #Область Вспомогательные_процедуры_и_функции 170 | 171 | // Функция проверяет возможность обновления файлов выгрузки, для каталога или конкретного файла версий 172 | // 173 | // Параметры: 174 | // Конфигуратор - <Тип.Вид> - <описание параметра> 175 | // КаталогВыгрузки - Строка - временный каталог 176 | // ПутьКФайлуВерсийДляСравнения - Строка - <описание параметра> 177 | // 178 | // Возвращаемое значение: 179 | // Булево - обновление возможно? 180 | // 181 | 182 | Функция ПроверитьВозможностьОбновленияФайловВыгрузки(Конфигуратор, Знач ПутьКФайлуВерсийДляСравнения = "") 183 | 184 | ОбновлениеВозможно = Ложь; 185 | 186 | КаталогПроверки = ВременныеФайлы.СоздатьКаталог(); 187 | 188 | ТекущийФайлВерсийМетаданных = Новый Файл(ОбъединитьПути(КаталогПроверки, "ConfigDumpInfo.xml")); 189 | 190 | Если ПустаяСтрока(ПутьКФайлуВерсийДляСравнения) Тогда 191 | Возврат ОбновлениеВозможно; 192 | КонецЕсли; 193 | 194 | ПутьКФайлуИзменений = ВременныеФайлы.НовоеИмяФайла(); 195 | 196 | Параметры = Конфигуратор.ПолучитьПараметрыЗапуска(); 197 | Параметры.Добавить(СтрШаблон("/DumpConfigToFiles %1", ОбернутьВКавычки(КаталогПроверки))); 198 | Параметры.Добавить(СтрШаблон("-getChanges %1", ОбернутьВКавычки(ПутьКФайлуИзменений))); 199 | 200 | Если ЗначениеЗаполнено(ИмяРасширения) Тогда 201 | Параметры.Добавить(СтрШаблон("-Extension %1", ИмяРасширения)); 202 | КонецЕсли; 203 | 204 | Если ЗначениеЗаполнено(ПутьКФайлуВерсийДляСравнения) Тогда 205 | 206 | Параметры.Добавить(СтрШаблон("-configDumpInfoForChanges %1", ОбернутьВКавычки(ПутьКФайлуВерсийДляСравнения))); 207 | 208 | КонецЕсли; 209 | 210 | Конфигуратор.ВыполнитьКоманду(Параметры); 211 | 212 | ФайлИзменений = Новый Файл(ПутьКФайлуИзменений); 213 | 214 | Если ФайлИзменений.Существует() Тогда 215 | СтрокаПолныйДамп = ВРег("FullDump"); 216 | ЧтениеФайла = Новый ЧтениеТекста(ПутьКФайлуИзменений); 217 | СтрокаВыгрузки = Лев(ВРег(ЧтениеФайла.ПрочитатьСтроку()), СтрДлина(СтрокаПолныйДамп)); 218 | 219 | Если Не ПустаяСтрока(СокрЛП(СтрокаВыгрузки)) Тогда 220 | 221 | Лог.Отладка("Строка проверки на возможность выгрузки конфигурации: <%1> = <%2> ", СтрокаПолныйДамп, СтрокаВыгрузки); 222 | ОбновлениеВозможно = НЕ (СтрокаВыгрузки = СтрокаПолныйДамп); 223 | 224 | КонецЕсли; 225 | ЧтениеФайла.Закрыть(); 226 | 227 | КонецЕсли; 228 | 229 | ВременныеФайлы.УдалитьФайл(КаталогПроверки); 230 | 231 | Если НЕ ОбновлениеВозможно Тогда 232 | ВременныеФайлы.УдалитьФайл(ПутьКФайлуИзменений); 233 | КонецЕсли; 234 | 235 | Возврат ОбновлениеВозможно; 236 | 237 | КонецФункции 238 | Функция ОбернутьВКавычки(Знач Строка) 239 | Возврат """" + Строка + """"; 240 | КонецФункции 241 | 242 | Процедура Инициализация() 243 | 244 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 245 | ПутьКФайлуВерсийМетаданных = ""; 246 | ПутьКФайлуИзменений = ""; 247 | ИмяФайлаДампаКонфигурации = "ConfigDumpInfo.xml"; 248 | ИмяФайлаИзменений = "dumplist.txt"; // файл используется в 2х плагинах - increment и edtExport 249 | ВыгрузкаИзмененийВозможна = Ложь; 250 | ИмяРасширения = ""; 251 | 252 | КонецПроцедуры 253 | 254 | #КонецОбласти 255 | 256 | Инициализация(); 257 | -------------------------------------------------------------------------------- /src/Классы/syncRemote.os: -------------------------------------------------------------------------------- 1 | 2 | #Использовать logos 3 | #Использовать gitrunner 4 | 5 | Перем Лог; 6 | Перем КомандыПлагина; 7 | 8 | Перем Обработчик; 9 | 10 | Перем URLРепозитория; 11 | Перем ИмяВетки; 12 | Перем ПолучитьИзменения; 13 | Перем ОтправитьИзменения; 14 | 15 | Перем КоличествоКоммитовДоPush; 16 | Перем СчетчикКоммитов; 17 | Перем ОтправлятьТеги; 18 | Перем PushOptions; 19 | 20 | Перем ГитРепозиторий; 21 | 22 | #Область Интерфейс_плагина 23 | 24 | // Возвращает версию плагина 25 | // 26 | // Возвращаемое значение: 27 | // Строка - текущая версия плагина 28 | // 29 | Функция Версия() Экспорт 30 | Возврат "2.0.0"; 31 | КонецФункции 32 | 33 | // Возвращает приоритет выполнения плагина 34 | // 35 | // Возвращаемое значение: 36 | // Число - приоритет выполнения плагина 37 | // 38 | Функция Приоритет() Экспорт 39 | Возврат 0; 40 | КонецФункции 41 | 42 | // Возвращает описание плагина 43 | // 44 | // Возвращаемое значение: 45 | // Строка - описание функциональности плагина 46 | // 47 | Функция Описание() Экспорт 48 | Возврат "Плагин добавляет функциональность синхронизации с удаленным репозиторием git"; 49 | КонецФункции 50 | 51 | // Возвращает подробную справку к плагину 52 | // 53 | // Возвращаемое значение: 54 | // Строка - подробная справка для плагина 55 | // 56 | Функция Справка() Экспорт 57 | Возврат "Справка плагина"; 58 | КонецФункции 59 | 60 | // Возвращает имя плагина 61 | // 62 | // Возвращаемое значение: 63 | // Строка - имя плагина при подключении 64 | // 65 | Функция Имя() Экспорт 66 | Возврат "sync-remote"; 67 | КонецФункции 68 | 69 | // Возвращает имя лога плагина 70 | // 71 | // Возвращаемое значение: 72 | // Строка - имя лога плагина 73 | // 74 | Функция ИмяЛога() Экспорт 75 | Возврат "oscript.lib.gitsync.plugins.sync-remote"; 76 | КонецФункции 77 | 78 | #КонецОбласти 79 | 80 | #Область Подписки_на_события 81 | 82 | Процедура ПриАктивизации(СтандартныйОбработчик) Экспорт 83 | 84 | Обработчик = СтандартныйОбработчик; 85 | 86 | URLРепозитория = ""; 87 | ИмяВетки = ""; 88 | ПолучитьИзменения = Ложь; 89 | ОтправитьИзменения = Ложь; 90 | ОтправлятьТеги = Ложь; 91 | PushOptions = ""; 92 | 93 | КоличествоКоммитовДоPush = 0; 94 | СчетчикКоммитов = 0; 95 | 96 | КонецПроцедуры 97 | 98 | Процедура ПриРегистрацииКомандыПриложения(ИмяКоманды, КлассРеализации) Экспорт 99 | 100 | Лог.Отладка("Ищу команду <%1> в списке поддерживаемых", ИмяКоманды); 101 | Если КомандыПлагина.Найти(ИмяКоманды) = Неопределено Тогда 102 | Возврат; 103 | КонецЕсли; 104 | 105 | Лог.Отладка("Устанавливаю дополнительные параметры для команды %1", ИмяКоманды); 106 | 107 | КлассРеализации.Опция("PS push", Ложь, "[*sync-remote] Флаг отправки изменений на удаленный репозиторий") 108 | .Флаг() 109 | .ВОкружении("GITSYNC_REMOTE_PUSH"); 110 | КлассРеализации.Опция("G pull", Ложь, "[*sync-remote] Флаг получения изменений из удаленный репозитория перед синхронизацией") 111 | .Флаг() 112 | .ВОкружении("GITSYNC_REMOTE_PULL"); 113 | КлассРеализации.Опция("b branch", "master", "[*sync-remote] Имя ветки") 114 | .ТСтрока() 115 | .ВОкружении("GITSYNC_REMOTE_BRANCH"); 116 | КлассРеализации.Опция("T push-tags", Ложь, "[*sync-remote] Флаг отправки тегов по версиям") 117 | .Флаг() 118 | .ВОкружении("GITSYNC_REMOTE_PUSH_TAGS"); 119 | КлассРеализации.Опция("n push-n-commits", 0, "[*sync-remote] <число> количество коммитов до промежуточной отправки на удаленный сервер") 120 | .ТЧисло() 121 | .ВОкружении("GITSYNC_REMOTE_PUSH_N_COMMITS"); 122 | КлассРеализации.Опция("O push-options", "", "[*sync-remote] Дополнительные параметры для команды push, разделенные ;") 123 | .ТСтрока() 124 | .ВОкружении("GITSYNC_PUSH_OPTIONS"); 125 | 126 | КлассРеализации.Аргумент("URL", "", "[*sync-remote] Адрес удаленного репозитория GIT.") 127 | .ВОкружении("GITSYNC_REPO_URL") 128 | .Обязательный(Ложь); 129 | 130 | КонецПроцедуры 131 | 132 | Процедура ПриПолученииПараметров(ПараметрыКоманды) Экспорт 133 | 134 | URLРепозитория = ПараметрыКоманды.Параметр("URL", ""); 135 | ИмяВетки = ПараметрыКоманды.Параметр("branch", ""); 136 | 137 | ПолучитьИзменения = ПараметрыКоманды.Параметр("pull", Ложь); 138 | ОтправитьИзменения = ПараметрыКоманды.Параметр("push", Ложь); 139 | ОтправлятьТеги = ПараметрыКоманды.Параметр("push-tags", Ложь); 140 | PushOptions = СтрРазделить(ПараметрыКоманды.Параметр("push-options", ""), ";"); 141 | 142 | КоличествоКоммитовДоPush = ПараметрыКоманды.Параметр("push-n-commits", 0); 143 | 144 | Лог.Отладка("Установлено получение изменений <%1> ", ПолучитьИзменения); 145 | Лог.Отладка("Установлено имя ветки <%1> ", ИмяВетки); 146 | Лог.Отладка("Установлена отправка изменений <%1> ", ОтправитьИзменения); 147 | Лог.Отладка("Установлено количество коммитов <%1>, после которых осуществляется отправка", КоличествоКоммитовДоPush); 148 | Лог.Отладка("Установлен флаг отправки меток в значение <%1> выгрузки версий", ОтправлятьТеги); 149 | Лог.Отладка("Установлены дополнительные параметры команды push: <%1>", СтрСоединить(PushOptions, ", ")); 150 | 151 | КонецПроцедуры 152 | 153 | Процедура ПередНачаломВыполнения(ПутьКХранилищу, КаталогРабочейКопии) Экспорт 154 | 155 | Если Не ПолучитьИзменения Тогда 156 | Возврат; 157 | КонецЕсли; 158 | 159 | Лог.Информация("Получение изменений с удаленного узла (pull)"); 160 | 161 | ГитРепозиторий = ПолучитьГитРепозиторий(КаталогРабочейКопии); 162 | ГитРепозиторий.Получить(URLРепозитория, ИмяВетки); 163 | 164 | КонецПроцедуры 165 | 166 | Процедура ПослеОкончанияВыполнения(ПутьКХранилищу, КаталогРабочейКопии) Экспорт 167 | 168 | Если СчетчикКоммитов = 0 Тогда 169 | Возврат; 170 | КонецЕсли; 171 | 172 | ГитРепозиторий = ПолучитьГитРепозиторий(КаталогРабочейКопии); 173 | ВыполнитьGitPush(ГитРепозиторий, КаталогРабочейКопии); 174 | 175 | КонецПроцедуры 176 | 177 | Процедура ПослеКоммита(ГитРепозиторий, КаталогРабочейКопии) Экспорт 178 | 179 | СчетчикКоммитов = СчетчикКоммитов + 1; 180 | 181 | Если СчетчикКоммитов = КоличествоКоммитовДоPush Тогда 182 | 183 | ВыполнитьGitPush(ГитРепозиторий, КаталогРабочейКопии); 184 | СчетчикКоммитов = 0; 185 | 186 | КонецЕсли; 187 | 188 | КонецПроцедуры 189 | 190 | #КонецОбласти 191 | 192 | #Область Вспомогательные_процедуры_и_функции 193 | 194 | Процедура ВыполнитьGitPush(Знач ГитРепозиторий, Знач ЛокальныйРепозиторий) 195 | 196 | Если Не ОтправитьИзменения Тогда 197 | Возврат; 198 | КонецЕсли; 199 | 200 | Лог.Информация("Отправляю изменения на удаленный url (push)"); 201 | 202 | ГитРепозиторий.ВыполнитьКоманду(СтрРазделить("gc --auto", " ")); 203 | Лог.Отладка(СтрШаблон("Вывод команды gc: %1", СокрЛП(ГитРепозиторий.ПолучитьВыводКоманды()))); 204 | 205 | ПараметрыКомандыPush = Новый Массив; 206 | ПараметрыКомандыPush.Добавить("push -u"); 207 | ПараметрыКомандыPush.Добавить(СтрЗаменить(URLРепозитория, "%", "%%")); 208 | ПараметрыКомандыPush.Добавить("-v"); 209 | 210 | Для Каждого Опция Из PushOptions Цикл 211 | Если Не ПустаяСтрока(Опция) Тогда 212 | ПараметрыКомандыPush.Добавить("-o " + Опция); 213 | КонецЕсли; 214 | КонецЦикла; 215 | 216 | ГитРепозиторий.ВыполнитьКоманду(ПараметрыКомандыPush); 217 | 218 | Если ОтправлятьТеги Тогда 219 | 220 | ПараметрыКомандыPush = Новый Массив; 221 | ПараметрыКомандыPush.Добавить("push -u"); 222 | ПараметрыКомандыPush.Добавить(СтрЗаменить(URLРепозитория, "%", "%%")); 223 | ПараметрыКомандыPush.Добавить("--tags"); 224 | 225 | Для Каждого Опция Из PushOptions Цикл 226 | Если Не ПустаяСтрока(Опция) Тогда 227 | ПараметрыКомандыPush.Добавить("-o " + Опция); 228 | КонецЕсли; 229 | КонецЦикла; 230 | 231 | ГитРепозиторий.ВыполнитьКоманду(ПараметрыКомандыPush); 232 | 233 | КонецЕсли; 234 | 235 | Лог.Отладка(СтрШаблон("Вывод команды Push: %1", СокрЛП(ГитРепозиторий.ПолучитьВыводКоманды()))); 236 | 237 | КонецПроцедуры 238 | 239 | Функция ПолучитьГитРепозиторий(Знач КаталогРабочейКопии) 240 | 241 | Если Не ГитРепозиторий = Неопределено Тогда 242 | Возврат ГитРепозиторий; 243 | КонецЕсли; 244 | 245 | ГитРепозиторий = Новый ГитРепозиторий(); 246 | ГитРепозиторий.УстановитьРабочийКаталог(КаталогРабочейКопии); 247 | 248 | Возврат ГитРепозиторий; 249 | 250 | КонецФункции // ПолучитьГитРепозиторий() 251 | 252 | Процедура Инициализация() 253 | 254 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 255 | КомандыПлагина = Новый Массив; 256 | КомандыПлагина.Добавить("sync"); 257 | 258 | URLРепозитория = ""; 259 | ИмяВетки = ""; 260 | ПолучитьИзменения = Ложь; 261 | ОтправитьИзменения = Ложь; 262 | ОтправлятьТеги = Ложь; 263 | 264 | КоличествоКоммитовДоPush = 0; 265 | СчетчикКоммитов = 0; 266 | 267 | КонецПроцедуры 268 | 269 | #КонецОбласти 270 | 271 | Инициализация(); 272 | -------------------------------------------------------------------------------- /src/Классы/checkComments.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | 3 | Перем ВерсияПлагина; 4 | Перем Лог; 5 | Перем КомандыПлагина; 6 | Перем ВызватьОшибку; 7 | Перем ПрефиксЗадачи; 8 | Перем ПаттернЗадачи; 9 | Перем МинимальноеКоличествоЗадач; 10 | Перем МаксимальноеКоличествоЗадач; 11 | Перем ВыводитьПредставление; 12 | Перем ИсправлятьКавычки; 13 | 14 | #Область Интерфейс_плагина 15 | 16 | // Возвращает версию плагина 17 | // 18 | // Возвращаемое значение: 19 | // Строка - текущая версия плагина 20 | // 21 | Функция Версия() Экспорт 22 | Возврат "1.6.0"; 23 | КонецФункции 24 | 25 | // Возвращает приоритет выполнения плагина 26 | // 27 | // Возвращаемое значение: 28 | // Число - приоритет выполнения плагина 29 | // 30 | Функция Приоритет() Экспорт 31 | Возврат 0; 32 | КонецФункции 33 | 34 | // Возвращает описание плагина 35 | // 36 | // Возвращаемое значение: 37 | // Строка - описание функциональности плагина 38 | // 39 | Функция Описание() Экспорт 40 | Возврат "Плагин добавляет функциональность проверки комментариев в хранилище"; 41 | КонецФункции 42 | 43 | // Возвращает подробную справку к плагину 44 | // 45 | // Возвращаемое значение: 46 | // Строка - подробная справка для плагина 47 | // 48 | Функция Справка() Экспорт 49 | Возврат "Справка плагина"; 50 | КонецФункции 51 | 52 | // Возвращает имя плагина 53 | // 54 | // Возвращаемое значение: 55 | // Строка - имя плагина при подключении 56 | // 57 | Функция Имя() Экспорт 58 | Возврат "check-comments"; 59 | КонецФункции 60 | 61 | // Возвращает имя лога плагина 62 | // 63 | // Возвращаемое значение: 64 | // Строка - имя лога плагина 65 | // 66 | Функция ИмяЛога() Экспорт 67 | Возврат "oscript.lib.gitsync.plugins.check-comments"; 68 | КонецФункции 69 | 70 | #КонецОбласти 71 | 72 | #Область Подписки_на_события 73 | 74 | Процедура ПриРегистрацииКомандыПриложения(ИмяКоманды, КлассРеализации) Экспорт 75 | 76 | Лог.Отладка("Ищу команду <%1> в списке поддерживаемых", ИмяКоманды); 77 | Если КомандыПлагина.Найти(ИмяКоманды) = Неопределено Тогда 78 | Возврат; 79 | КонецЕсли; 80 | 81 | Лог.Отладка("Устанавливаю дополнительные параметры для команды %1", ИмяКоманды); 82 | 83 | КлассРеализации.Опция("C error-comment", Ложь, "[*check-comments] Флаг вызова ошибки при отсутствии текста комментария") 84 | .Флаговый(); 85 | 86 | КлассРеализации.Опция("task-prefix", "", "[*check-comments] Префикс задачи.") 87 | .ВОкружении("GITSYNC_TASK_PREFIX") 88 | .Обязательный(Ложь); 89 | 90 | КлассРеализации.Опция("task-pattern", "", "[*check-comments] Паттерн задачи.") 91 | .ВОкружении("GITSYNC_TASK_PATTERN") 92 | .Обязательный(Ложь); 93 | 94 | КлассРеализации.Опция("min-task-count", 0, СтрШаблон("[*check-comments] Минимальное количество упоминаний задач")) 95 | .ТЧисло() 96 | .Обязательный(Ложь); 97 | 98 | КлассРеализации.Опция("max-task-count", 0, СтрШаблон("[*check-comments] Максимальное количество упоминаний задач")) 99 | .ТЧисло() 100 | .Обязательный(Ложь); 101 | 102 | КлассРеализации.Опция("author-presentation", Ложь, "[*check-comments] Флаг использования представления автора в сообщении об отсутствии комментария") 103 | .Флаг() 104 | .ВОкружении("GITSYNC_AUTHOR_PRESENTATION") 105 | .Обязательный(Ложь); 106 | 107 | КлассРеализации.Опция("repair-quotes", Ложь, "[*check-comments] Флаг замены всех символов кавычек на корректные.") 108 | .Флаг() 109 | .ВОкружении("GITSYNC_REPAIR_QUOTES") 110 | .Обязательный(Ложь); 111 | КонецПроцедуры 112 | 113 | Процедура ПриПолученииПараметров(ПараметрыКоманды) Экспорт 114 | 115 | ВызватьОшибку = ПараметрыКоманды.Параметр("error-comment", Ложь); 116 | 117 | ВызватьОшибку = Булево(ВызватьОшибку); 118 | Лог.Отладка("Получаю параметр значение <%1>", ВызватьОшибку); 119 | 120 | ПрефиксЗадачи = ПараметрыКоманды.Параметр("task-prefix", ""); 121 | Лог.Отладка("Получаю параметр значение <%1>", ПрефиксЗадачи); 122 | 123 | ПаттернЗадачи = ПараметрыКоманды.Параметр("task-pattern", ""); 124 | Лог.Отладка("Получаю параметр значение <%1>", ПаттернЗадачи); 125 | 126 | МинимальноеКоличествоЗадач = ПараметрыКоманды.Параметр("min-task-count", 0); 127 | Лог.Отладка("Получаю параметр значение <%1>", МинимальноеКоличествоЗадач); 128 | 129 | МаксимальноеКоличествоЗадач = ПараметрыКоманды.Параметр("max-task-count", 0); 130 | Лог.Отладка("Получаю параметр значение <%1>", МаксимальноеКоличествоЗадач); 131 | 132 | ВыводитьПредставление = ПараметрыКоманды.Параметр("author-presentation", Ложь); 133 | Лог.Отладка("Получаю параметр значение <%1>", ВыводитьПредставление); 134 | 135 | ИсправлятьКавычки = Булево(ПараметрыКоманды.Параметр("repair-quotes", Ложь)); 136 | Лог.Отладка("Получаю параметр значение <%1>", ИсправлятьКавычки); 137 | 138 | КонецПроцедуры 139 | 140 | Процедура ПередОбработкойВерсииХранилища(СтрокаВерсии, СледующаяВерсия) Экспорт 141 | 142 | ПроверитьЗаполненностьКомментария(СтрокаВерсии, СледующаяВерсия); 143 | 144 | ПроверитьКомментарийНаНаличиеУпоминанийЗадач(СтрокаВерсии, СледующаяВерсия); 145 | 146 | ИсправитьКавычки(СтрокаВерсии); 147 | 148 | КонецПроцедуры 149 | 150 | Процедура ПроверитьЗаполненностьКомментария(СтрокаВерсии, СледующаяВерсия) 151 | 152 | Если Не ПустаяСтрока(СтрокаВерсии.Комментарий) Тогда 153 | Возврат; 154 | КонецЕсли; 155 | 156 | СтрокаОшибки = СтрШаблон("Версия <%1> от автора <%2>: комментарий не задан", 157 | СледующаяВерсия, Автор(СтрокаВерсии)); 158 | Лог.КритичнаяОшибка(СтрокаОшибки); 159 | 160 | Если ВызватьОшибку Тогда 161 | 162 | ВызватьИсключение СтрокаОшибки; 163 | 164 | КонецЕсли; 165 | 166 | КонецПроцедуры 167 | 168 | Процедура ПроверитьКомментарийНаНаличиеУпоминанийЗадач(СтрокаВерсии, СледующаяВерсия) 169 | 170 | Если (ПустаяСтрока(ПрефиксЗадачи) и ПустаяСтрока(ПаттернЗадачи)) Или ПустаяСтрока(СтрокаВерсии.Комментарий) Тогда 171 | Возврат; 172 | КонецЕсли; 173 | 174 | Если НЕ ПустаяСтрока(ПаттернЗадачи) Тогда 175 | РВ = Новый РегулярноеВыражение(ПаттернЗадачи); 176 | ИспользуемыйШаблон = "соответствующих паттерну """ + ПаттернЗадачи + """"; 177 | Иначе 178 | РВ = Новый РегулярноеВыражение(СтрШаблон("%1-%2", ПрефиксЗадачи, "\d")); 179 | ИспользуемыйШаблон = ПрефиксЗадачи; 180 | КонецЕсли; 181 | 182 | Совпадения = РВ.НайтиСовпадения(СтрокаВерсии.Комментарий); 183 | КоличествоВхождений = Совпадения.количество(); 184 | 185 | Если КоличествоВхождений < МинимальноеКоличествоЗадач Тогда 186 | СтрокаОшибки = СтрШаблон("Версия <%1> от автора <%2>: количество упоминаний задач %3 (%4) меньше требуемого (%5)", 187 | СледующаяВерсия, 188 | Автор(СтрокаВерсии), ИспользуемыйШаблон, КоличествоВхождений, МинимальноеКоличествоЗадач); 189 | 190 | Лог.КритичнаяОшибка(СтрокаОшибки); 191 | 192 | Если ВызватьОшибку Тогда 193 | 194 | ВызватьИсключение СтрокаОшибки; 195 | 196 | КонецЕсли; 197 | 198 | КонецЕсли; 199 | 200 | Если КоличествоВхождений > МаксимальноеКоличествоЗадач Тогда 201 | СтрокаОшибки = СтрШаблон("Версия <%1> от автора <%2>: количество упоминаний задач %3 (%4) больше требуемого (%5)", 202 | СледующаяВерсия, 203 | Автор(СтрокаВерсии), ИспользуемыйШаблон, КоличествоВхождений, МаксимальноеКоличествоЗадач); 204 | 205 | Лог.КритичнаяОшибка(СтрокаОшибки); 206 | 207 | Если ВызватьОшибку Тогда 208 | 209 | ВызватьИсключение СтрокаОшибки; 210 | 211 | КонецЕсли; 212 | 213 | КонецЕсли; 214 | 215 | КонецПроцедуры 216 | 217 | Процедура ИсправитьКавычки(СтрокаВерсии) 218 | 219 | Лог.Отладка("Исправлять кавычки в комментарии: <%1>", ИсправлятьКавычки); 220 | 221 | Если Не ИсправлятьКавычки Тогда 222 | Возврат; 223 | КонецЕсли; 224 | 225 | ХорошаяКавычка = """"; 226 | 227 | ПлохиеКавычки = Новый Массив; 228 | ПлохиеКавычки.Добавить(Символ(8220)); 229 | ПлохиеКавычки.Добавить(Символ(8221)); 230 | ПлохиеКавычки.Добавить(Символ(171)); 231 | ПлохиеКавычки.Добавить(Символ(187)); 232 | 233 | Для Каждого ПлохаяКавычка Из ПлохиеКавычки Цикл 234 | СтрокаВерсии.Комментарий = СтрЗаменить(СтрокаВерсии.Комментарий, ПлохаяКавычка, ХорошаяКавычка); 235 | КонецЦикла; 236 | 237 | КонецПроцедуры 238 | 239 | #КонецОбласти 240 | 241 | #Область СлужебныеПроцедурыИФункции 242 | 243 | Функция Автор(СтрокаВерсии) 244 | 245 | Если ВыводитьПредставление Тогда 246 | 247 | Возврат СтрокаВерсии.ПредставлениеАвтора; 248 | 249 | Иначе 250 | 251 | Возврат СтрокаВерсии.Автор; 252 | 253 | КонецЕсли; 254 | 255 | КонецФункции 256 | 257 | #КонецОбласти 258 | 259 | Процедура Инициализация() 260 | 261 | ВерсияПлагина = "1.3.1"; 262 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 263 | КомандыПлагина = Новый Массив; 264 | КомандыПлагина.Добавить("sync"); 265 | 266 | КонецПроцедуры 267 | 268 | Инициализация(); 269 | -------------------------------------------------------------------------------- /src/Классы/smartTags.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | 3 | Перем Лог; 4 | Перем Обработчик; 5 | Перем КомандыПлагина; 6 | Перем ПропускатьСуществующиеТеги; 7 | Перем ПоследняяВерсияКонфигурации; 8 | Перем ТекущаяВерсияКонфигурации; 9 | 10 | Перем НумероватьВерсии; 11 | Перем ТекущаяВерсияХранилища1С; 12 | 13 | #Область Интерфейс_плагина 14 | 15 | // Возвращает версию плагина 16 | // 17 | // Возвращаемое значение: 18 | // Строка - текущая версия плагина 19 | // 20 | Функция Версия() Экспорт 21 | Возврат "1.6.0"; 22 | КонецФункции 23 | 24 | // Возвращает приоритет выполнения плагина 25 | // 26 | // Возвращаемое значение: 27 | // Число - приоритет выполнения плагина 28 | // 29 | Функция Приоритет() Экспорт 30 | Возврат 0; 31 | КонецФункции 32 | 33 | // Возвращает описание плагина 34 | // 35 | // Возвращаемое значение: 36 | // Строка - описание функциональности плагина 37 | // 38 | Функция Описание() Экспорт 39 | Возврат "Плагин добавляет функциональность автоматической расстановки меток в git"; 40 | КонецФункции 41 | 42 | // Возвращает подробную справку к плагину 43 | // 44 | // Возвращаемое значение: 45 | // Строка - подробная справка для плагина 46 | // 47 | Функция Справка() Экспорт 48 | Возврат "Справка плагина"; 49 | КонецФункции 50 | 51 | // Возвращает имя плагина 52 | // 53 | // Возвращаемое значение: 54 | // Строка - имя плагина при подключении 55 | // 56 | Функция Имя() Экспорт 57 | Возврат "smart-tags"; 58 | КонецФункции 59 | 60 | // Возвращает имя лога плагина 61 | // 62 | // Возвращаемое значение: 63 | // Строка - имя лога плагина 64 | // 65 | Функция ИмяЛога() Экспорт 66 | Возврат "oscript.lib.gitsync.plugins.smart-tags"; 67 | КонецФункции 68 | 69 | #КонецОбласти 70 | 71 | #Область Подписки_на_события 72 | 73 | Процедура ПриАктивизации(СтандартныйОбработчик) Экспорт 74 | 75 | Обработчик = СтандартныйОбработчик; 76 | ПоследняяВерсияКонфигурации = ""; 77 | ТекущаяВерсияКонфигурации = ""; 78 | 79 | КонецПроцедуры 80 | 81 | Процедура ПриРегистрацииКомандыПриложения(ИмяКоманды, КлассРеализации) Экспорт 82 | 83 | Лог.Отладка("Ищу команду <%1> в списке поддерживаемых", ИмяКоманды); 84 | Если КомандыПлагина.Найти(ИмяКоманды) = Неопределено Тогда 85 | Возврат; 86 | КонецЕсли; 87 | 88 | Лог.Отладка("Устанавливаю дополнительные параметры для команды %1", ИмяКоманды); 89 | 90 | КлассРеализации.Опция("S skip-exists-tags", Ложь, "[*smart-tags] флаг пропуска ошибок создания существующих тегов") 91 | .Флаговый() 92 | .ВОкружении("GITSYNC_SKIP_EXISTS_TAGS"); 93 | 94 | КлассРеализации.Опция("N numerator", Ложь, "[*smart-tags] флаг добавляет номер хранилища 1С как тег вида v.X") 95 | .Флаговый(); 96 | 97 | КонецПроцедуры 98 | 99 | Процедура ПриПолученииПараметров(ПараметрыКоманды) Экспорт 100 | 101 | ПропускатьСуществующиеТеги = ПараметрыКоманды.Параметр("skip-exists-tags", Ложь); 102 | 103 | НумероватьВерсии = ПараметрыКоманды.Параметр("numerator", Ложь); 104 | 105 | КонецПроцедуры 106 | 107 | Процедура ПередНачаломВыполнения(ПутьКХранилищу, КаталогРабочейКопии) Экспорт 108 | 109 | ПоследняяВерсияКонфигурации = ПрочитатьВерсиюИзИсходников(КаталогРабочейКопии); 110 | 111 | КонецПроцедуры 112 | 113 | Процедура ПередОбработкойВерсииХранилища(СтрокаВерсии, СледующаяВерсия) Экспорт 114 | 115 | Если ЗначениеЗаполнено(СтрокаВерсии.Тэг) Тогда 116 | ТекущаяВерсияКонфигурации = СтрокаВерсии.Тэг; 117 | Иначе 118 | ТекущаяВерсияКонфигурации = ""; 119 | КонецЕсли; 120 | 121 | ТекущаяВерсияХранилища1С = СледующаяВерсия; 122 | 123 | КонецПроцедуры 124 | 125 | Процедура ПослеКоммита(ГитРепозиторий, КаталогРабочейКопии) Экспорт 126 | 127 | Если ПустаяСтрока(ТекущаяВерсияКонфигурации) Тогда 128 | ТекущаяВерсияКонфигурации = ПрочитатьВерсиюИзИсходников(КаталогРабочейКопии); 129 | КонецЕсли; 130 | 131 | ТребуетсяВызовИсключения = Ложь; 132 | мТекстыОшибок = Новый Массив; 133 | 134 | Если НЕ ПустаяСтрока(ТекущаяВерсияКонфигурации) 135 | И ПоследняяВерсияКонфигурации <> ТекущаяВерсияКонфигурации Тогда 136 | 137 | Лог.Информация("Определена новая версия конфигурации: %1. Будет установлен новый тег", ТекущаяВерсияКонфигурации); 138 | 139 | ПараметрыКоманды = Новый Массив; 140 | ПараметрыКоманды.Добавить("tag"); 141 | ПараметрыКоманды.Добавить(СтрЗаменить(ТекущаяВерсияКонфигурации, " ", "")); 142 | 143 | Попытка 144 | ГитРепозиторий.ВыполнитьКоманду(ПараметрыКоманды); 145 | Исключение 146 | ТекстОшибки = ОписаниеОшибки(); 147 | Если ПропускатьСуществующиеТеги 148 | И ЭтоОшибкаТегУжеСуществует(ТекстОшибки, ТекущаяВерсияКонфигурации) Тогда 149 | Лог.Ошибка(ТекстОшибки); 150 | Иначе 151 | ТребуетсяВызовИсключения = Истина; 152 | мТекстыОшибок.Добавить(ТекстОшибки); 153 | КонецЕсли; 154 | КонецПопытки; 155 | 156 | ПоследняяВерсияКонфигурации = ТекущаяВерсияКонфигурации; 157 | ТекущаяВерсияКонфигурации = ""; 158 | 159 | КонецЕсли; 160 | 161 | Если НумероватьВерсии Тогда 162 | Если ЗначениеЗаполнено(ТекущаяВерсияХранилища1С) Тогда 163 | Лог.Информация("Устанавливаем тэг-нумератор версии хранилища 1С: 'v.%1'", ТекущаяВерсияХранилища1С); 164 | 165 | ПараметрыКоманды = Новый Массив; 166 | ПараметрыКоманды.Добавить("tag"); 167 | ПараметрыКоманды.Добавить("v." + Строка(ТекущаяВерсияХранилища1С)); 168 | 169 | Попытка 170 | ГитРепозиторий.ВыполнитьКоманду(ПараметрыКоманды); 171 | Исключение 172 | ТекстОшибки = ОписаниеОшибки(); 173 | Если ПропускатьСуществующиеТеги 174 | И ЭтоОшибкаТегУжеСуществует(ТекстОшибки, ТекущаяВерсияХранилища1С) Тогда 175 | Лог.Ошибка(ТекстОшибки); 176 | Иначе 177 | ТребуетсяВызовИсключения = Истина; 178 | мТекстыОшибок.Добавить(ТекстОшибки); 179 | КонецЕсли; 180 | КонецПопытки; 181 | 182 | ТекущаяВерсияХранилища1С = ""; 183 | 184 | КонецЕсли; 185 | 186 | КонецЕсли; 187 | 188 | Если ТребуетсяВызовИсключения Тогда 189 | ВызватьИсключение СтрСоединить(мТекстыОшибок, Символы.ПС); 190 | КонецЕсли; 191 | 192 | КонецПроцедуры 193 | 194 | #КонецОбласти 195 | 196 | #Область Вспомогательные_процедуры_и_функции 197 | 198 | Функция ПрочитатьВерсиюИзИсходников(КаталогИсходныхФайлов) 199 | 200 | ФайлКонфигурации = Новый Файл(ОбъединитьПути(КаталогИсходныхФайлов, "Configuration.xml")); 201 | Если Не ФайлКонфигурации.Существует() Тогда 202 | Возврат ПоследняяВерсияКонфигурации; 203 | КонецЕсли; 204 | 205 | ПараметрыКонфигурации = ПолучитьПараметрыКонфигурацииИзИсходников(КаталогИсходныхФайлов); 206 | 207 | Возврат ПараметрыКонфигурации["Version"]; 208 | 209 | КонецФункции // ПрочитатьВерсиюИзИсходников() 210 | 211 | Функция ЭтоОшибкаТегУжеСуществует(ТекстОшибки, ТекущаяВерсияКонфигурации) 212 | 213 | Возврат СтрНайти( 214 | ТекстОшибки, 215 | СтрШаблон("fatal: tag '%1' already exists", ТекущаяВерсияКонфигурации)) > 0; 216 | 217 | КонецФункции 218 | 219 | // Функция читает параметры конфигурации из каталога исходников 220 | // 221 | Функция ПолучитьПараметрыКонфигурацииИзИсходников(КаталогИсходныхФайлов) 222 | 223 | ФайлКонфигурации = Новый Файл(ОбъединитьПути(КаталогИсходныхФайлов, "Configuration.xml")); 224 | Если Не ФайлКонфигурации.Существует() Тогда 225 | ВызватьИсключение СтрШаблон("Файл <%1> не найден у указанном каталоге.", ФайлКонфигурации.ПолноеИмя); 226 | КонецЕсли; 227 | 228 | ПараметрыКонфигурации = Новый Соответствие; 229 | 230 | Чтение = Новый ЧтениеXML; 231 | Чтение.ОткрытьФайл(ФайлКонфигурации.ПолноеИмя); 232 | 233 | Пока Чтение.Прочитать() Цикл 234 | Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Чтение.Имя = "Properties" Тогда 235 | Прервать; 236 | КонецЕсли; 237 | КонецЦикла; 238 | 239 | МассивДоступныхСвойств = Новый Массив; 240 | МассивДоступныхСвойств.Добавить("Vendor"); 241 | МассивДоступныхСвойств.Добавить("Version"); 242 | МассивДоступныхСвойств.Добавить("UpdateCatalogAddress"); 243 | МассивДоступныхСвойств.Добавить("Comment"); 244 | МассивДоступныхСвойств.Добавить("Name"); 245 | 246 | Пока Не (Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.ЛокальноеИмя = "Properties") Цикл 247 | 248 | Ключ = Чтение.ЛокальноеИмя; 249 | Если НЕ Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента 250 | Или МассивДоступныхСвойств.Найти(Ключ) = Неопределено Тогда 251 | Чтение.Прочитать(); 252 | Продолжить; 253 | Иначе 254 | Чтение.Прочитать(); 255 | Если Чтение.ТипУзла = ТипУзлаXML.Текст Тогда 256 | Значение = Чтение.Значение; 257 | ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда 258 | Значение = ""; 259 | Иначе 260 | Продолжить; 261 | КонецЕсли; 262 | ПараметрыКонфигурации.Вставить(Ключ, Значение); 263 | Лог.Отладка("Читаю опцию: %1 264 | | Значение: %2", Ключ, Значение); 265 | КонецЕсли; 266 | 267 | КонецЦикла; 268 | 269 | Чтение.Закрыть(); 270 | 271 | Возврат ПараметрыКонфигурации; 272 | 273 | КонецФункции 274 | 275 | Процедура Инициализация() 276 | 277 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 278 | КомандыПлагина = Новый Массив; 279 | КомандыПлагина.Добавить("sync"); 280 | КомандыПлагина.Добавить("export"); 281 | ПоследняяВерсияКонфигурации = ""; 282 | ТекущаяВерсияКонфигурации = ""; 283 | ТекущаяВерсияХранилища1С = ""; 284 | 285 | КонецПроцедуры 286 | 287 | #КонецОбласти 288 | 289 | Инициализация(); 290 | -------------------------------------------------------------------------------- /src/Классы/dropSupport.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | #Использовать gitsync 3 | 4 | Перем Лог; // Лог - объект протоколирования (logger) 5 | Перем Обработчик; // Команда - обработчик текущей команды gitsync 6 | Перем КомандыПлагина; // Массив из Строка - список команд к которым подключается текущий плагин 7 | Перем ТекущаяКоманда; // Строка - имя выполняемой команды gitsync 8 | 9 | Перем ЗакоммититьФайлИгнорируемыхИзменений; // Булево - Истина - закоммитить файл .gitignore. 10 | 11 | #Область Интерфейс_плагина 12 | 13 | // Возвращает версию плагина 14 | // 15 | // Возвращаемое значение: 16 | // Строка - текущая версия плагина 17 | // 18 | Функция Версия() Экспорт 19 | Возврат "1.6.0"; 20 | КонецФункции 21 | 22 | // Возвращает приоритет выполнения плагина 23 | // 24 | // Возвращаемое значение: 25 | // Число - приоритет выполнения плагина 26 | // 27 | Функция Приоритет() Экспорт 28 | Возврат 0; 29 | КонецФункции 30 | 31 | // Возвращает описание плагина 32 | // 33 | // Возвращаемое значение: 34 | // Строка - описание функциональности плагина 35 | // 36 | Функция Описание() Экспорт 37 | Возврат "Плагин удаляет информацию о поддержке. 38 | |Удаляет файлы конфигураций поставщика поддержки (*.cf) и очищает файл настроек поддержки (ParentConfiguration.bin)."; 39 | КонецФункции 40 | 41 | // Возвращает подробную справку к плагину 42 | // 43 | // Возвращаемое значение: 44 | // Строка - подробная справка для плагина 45 | // 46 | Функция Справка() Экспорт 47 | Возврат "Плагин удаляет информацию о поддержке. 48 | |Удаляет файлы конфигураций поставщика поддержки (*.cf) и очищает файл настроек поддержки (ParentConfiguration.bin)."; 49 | КонецФункции 50 | 51 | // Возвращает имя плагина 52 | // 53 | // Возвращаемое значение: 54 | // Строка - имя плагина при подключении 55 | // 56 | Функция Имя() Экспорт 57 | Возврат "drop-support"; 58 | КонецФункции 59 | 60 | // Возвращает имя лога плагина 61 | // 62 | // Возвращаемое значение: 63 | // Строка - имя лога плагина 64 | // 65 | Функция ИмяЛога() Экспорт 66 | Возврат СтрШаблон("oscript.lib.gitsync.plugins.%1", Имя()); 67 | КонецФункции 68 | 69 | #КонецОбласти 70 | 71 | #Область Подписки_на_события 72 | 73 | Процедура ПриАктивизации(СтандартныйОбработчик) Экспорт 74 | 75 | Обработчик = СтандартныйОбработчик; 76 | 77 | КонецПроцедуры 78 | 79 | Процедура ПриРегистрацииКомандыПриложения(ИмяКоманды, КлассРеализации) Экспорт 80 | 81 | ТекущаяКоманда = ИмяКоманды; 82 | 83 | Лог.Отладка("Ищу команду <%1> в списке поддерживаемых", ИмяКоманды); 84 | Если КомандыПлагина.Найти(ИмяКоманды) = Неопределено Тогда 85 | Возврат; 86 | КонецЕсли; 87 | 88 | КонецПроцедуры 89 | 90 | Процедура ПриПолученииПараметров(ПараметрыКоманды) Экспорт 91 | 92 | КонецПроцедуры 93 | 94 | Процедура ПередВыгрузкойКонфигурациюВИсходники(Конфигуратор, 95 | КаталогРабочейКопии, 96 | КаталогВыгрузки, 97 | ПутьКХранилищу, 98 | НомерВерсии) Экспорт 99 | 100 | УдалитьИнформациюОПоддержке(КаталогРабочейКопии); 101 | 102 | КонецПроцедуры 103 | 104 | Процедура ПослеВыгрузкиКонфигурациюВИсходники(Конфигуратор, КаталогВыгрузки) Экспорт 105 | 106 | УдалитьИнформациюОПоддержке(КаталогВыгрузки); 107 | 108 | КонецПроцедуры 109 | 110 | Процедура ПередКоммитом(КаталогРабочейКопии, Комментарий, Автор, Дата) Экспорт 111 | 112 | КорневойКаталогГит = КорневойКаталогГит(КаталогРабочейКопии); 113 | 114 | Если НЕ ЗначениеЗаполнено(КорневойКаталогГит) Тогда 115 | Лог.Предупреждение("Каталог ""%1"" не является репозиторием git!", КаталогРабочейКопии); 116 | Возврат; 117 | КонецЕсли; 118 | 119 | КаталогПоддержки = ОбъединитьПути(КаталогРабочейКопии, "Ext", "ParentConfigurations"); 120 | ФайлИгнорируемыхИзменений = Новый Файл(ОбъединитьПути(КорневойКаталогГит, ".gitignore")); 121 | ТекстИгнорируемыхИзменений = Новый ТекстовыйДокумент(); 122 | 123 | Если ФайлИгнорируемыхИзменений.Существует() И ФайлИгнорируемыхИзменений.ЭтоФайл() Тогда 124 | ТекстИгнорируемыхИзменений.Прочитать(ФайлИгнорируемыхИзменений.ПолноеИмя); 125 | КонецЕсли; 126 | 127 | ОтносительныйПуть = СтрШаблон("%1%2*.cf", 128 | СтрЗаменить(КаталогПоддержки, КорневойКаталогГит, ""), 129 | ПолучитьРазделительПути()); 130 | 131 | Для НомерСтроки = 1 По ТекстИгнорируемыхИзменений.КоличествоСтрок() Цикл 132 | ТекСтрока = ТекстИгнорируемыхИзменений.ПолучитьСтроку(НомерСтроки); 133 | Если СтрНайти(ТекСтрока, ОтносительныйПуть) > 0 Тогда 134 | Возврат; 135 | КонецЕсли; 136 | КонецЦикла; 137 | 138 | ТекстИгнорируемыхИзменений.ДобавитьСтроку(ОтносительныйПуть); 139 | ТекстИгнорируемыхИзменений.Записать(ФайлИгнорируемыхИзменений.ПолноеИмя); 140 | 141 | ЗакоммититьФайлИгнорируемыхИзменений = Истина; 142 | 143 | КонецПроцедуры 144 | 145 | Процедура ПриКоммите(ГитРепозиторий, 146 | Комментарий, 147 | ПроиндексироватьОтслеживаемыеФайлы, 148 | ИмяФайлаКомментария, 149 | АвторДляГит, 150 | ДатаДляГит, 151 | Коммитер, 152 | ДатаКоммитера) Экспорт 153 | 154 | Если НЕ ЗакоммититьФайлИгнорируемыхИзменений Тогда 155 | Возврат; 156 | КонецЕсли; 157 | 158 | РабочийКаталог = ГитРепозиторий.ПолучитьРабочийКаталог(); 159 | КорневойКаталогГит = КорневойКаталогГит(РабочийКаталог); 160 | 161 | Если НЕ ЗначениеЗаполнено(КорневойКаталогГит) Тогда 162 | Лог.Предупреждение("Каталог ""%1"" не является репозиторием git!", РабочийКаталог); 163 | Возврат; 164 | КонецЕсли; 165 | 166 | ФайлИгнорируемыхИзменений = Новый Файл(ОбъединитьПути(КорневойКаталогГит, ".gitignore")); 167 | 168 | ПараметрыКомандыГит = Новый Массив(); 169 | ПараметрыКомандыГит.Добавить("add"); 170 | ПараметрыКомандыГит.Добавить("-A"); 171 | ПараметрыКомандыГит.Добавить(ФайлИгнорируемыхИзменений.ПолноеИмя); 172 | 173 | ГитРепозиторий.ВыполнитьКоманду(ПараметрыКомандыГит); 174 | 175 | КонецПроцедуры 176 | 177 | #КонецОбласти 178 | 179 | #Область Вспомогательные_процедуры_и_функции 180 | 181 | // Функция возвращает путь к корневому каталогу репозитария git 182 | // 183 | // Параметры: 184 | // КаталогРабочейКопии - Строка - проверяемый каталог 185 | // 186 | // Возвращаемое значение: 187 | // Строка - путь к корневому каталогу репозитария git 188 | // если пустая строка, то каталог не является репозиторием git 189 | // 190 | Функция КорневойКаталогГит(Знач КаталогРабочейКопии) 191 | 192 | ТекущийКаталог = Новый Файл(КаталогРабочейКопии); 193 | 194 | ЭтоКорневойКаталог = (ТекущийКаталог.ПолноеИмя = "/" 195 | ИЛИ Прав(ТекущийКаталог.ПолноеИмя, 1) = ":" 196 | ИЛИ Прав(ТекущийКаталог.ПолноеИмя, 2) = ":/" 197 | ИЛИ Прав(ТекущийКаталог.ПолноеИмя, 2) = ":\"); 198 | 199 | Если ЭтоКорневойКаталог Тогда 200 | Возврат ""; 201 | КонецЕсли; 202 | 203 | СлужебныйКаталогГит = Новый Файл(ОбъединитьПути(ТекущийКаталог.ПолноеИмя, ".git")); 204 | 205 | Если СлужебныйКаталогГит.Существует() И СлужебныйКаталогГит.ЭтоКаталог() Тогда 206 | Возврат ТекущийКаталог.ПолноеИмя; 207 | Иначе 208 | Возврат КорневойКаталогГит(ТекущийКаталог.Путь); 209 | КонецЕсли; 210 | 211 | КонецФункции // КорневойКаталогГит() 212 | 213 | // Процедура удаляет файлы конфигураций поставщика (*.cf) 214 | // и очищает информацию о поддержке в файле ParentConfigurations.bin 215 | // 216 | // Параметры: 217 | // КаталогРабочейКопии - Строка - обрабатываемый каталог 218 | // 219 | Процедура УдалитьИнформациюОПоддержке(КаталогРабочейКопии) 220 | 221 | КаталогОбщихДанныхКонфигурации = ОбъединитьПути(КаталогРабочейКопии, "Ext"); 222 | КаталогПоддержки = ОбъединитьПути(КаталогОбщихДанныхКонфигурации, "ParentConfigurations"); 223 | ФайлыПоставщика = НайтиФайлы(КаталогПоддержки, "*.cf"); 224 | 225 | Для Каждого ТекФайлПоставщика Из ФайлыПоставщика Цикл 226 | Лог.Отладка("Удаляем файл поставщика ""%1"".", ТекФайлПоставщика.ПолноеИмя); 227 | УдалитьФайлы(ТекФайлПоставщика.ПолноеИмя); 228 | КонецЦикла; 229 | 230 | ФайлПоддержки = Новый Файл(ОбъединитьПути(КаталогОбщихДанныхКонфигурации, "ParentConfigurations.bin")); 231 | Если ФайлПоддержки.Существует() И ФайлПоддержки.ЭтоФайл() Тогда 232 | ТекстПоддержки = Новый ТекстовыйДокумент(); 233 | ТекстПоддержки.Прочитать(ФайлПоддержки.ПолноеИмя); 234 | 235 | Если ТекстПоддержки.КоличествоСтрок() = 1 Тогда 236 | ТекСтрока = ТекстПоддержки.ПолучитьСтроку(1); 237 | Если СтрНайти(ТекСтрока, ТекстОтключеннойПоддержки()) > 0 Тогда 238 | Возврат; 239 | КонецЕсли; 240 | КонецЕсли; 241 | 242 | ТекстПоддержки.УстановитьТекст(ТекстОтключеннойПоддержки()); 243 | ТекстПоддержки.Записать(ФайлПоддержки.ПолноеИмя); 244 | 245 | Лог.Отладка("Отключена поддержка в файле ""%1"".", ФайлПоддержки.ПолноеИмя); 246 | КонецЕсли; 247 | 248 | КонецПроцедуры // УдалитьИнформациюОПоддержке() 249 | 250 | // Функция возвращает текст файла ParentConfigurations.bin для отключения поддержки 251 | // 252 | // Возвращаемое значение: 253 | // Строка - текст файла ParentConfigurations.bin для отключения поддержки 254 | // 255 | Функция ТекстОтключеннойПоддержки() 256 | 257 | Возврат "{6,0,0,0,1,0}"; 258 | 259 | КонецФункции // ТекстОтключеннойПоддержки() 260 | 261 | #КонецОбласти 262 | 263 | Процедура Инициализация() 264 | 265 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 266 | 267 | КомандыПлагина = Новый Массив; 268 | КомандыПлагина.Добавить("sync"); 269 | 270 | ЗакоммититьФайлИгнорируемыхИзменений = Ложь; 271 | 272 | КонецПроцедуры 273 | 274 | Инициализация(); 275 | -------------------------------------------------------------------------------- /src/Классы/dropConfigDump.os: -------------------------------------------------------------------------------- 1 | #Использовать logos 2 | #Использовать gitsync 3 | 4 | Перем Лог; // Лог - объект протоколирования (logger) 5 | Перем Обработчик; // Команда - обработчик текущей команды gitsync 6 | Перем КомандыПлагина; // Массив из Строка - список команд к которым подключается текущий плагин 7 | Перем ТекущаяКоманда; // Строка - имя выполняемой команды gitsync 8 | 9 | Перем ЗакоммититьФайлИгнорируемыхИзменений; // Булево - Истина - закоммитить файл .gitignore. 10 | 11 | #Область Интерфейс_плагина 12 | 13 | // Возвращает версию плагина 14 | // 15 | // Возвращаемое значение: 16 | // Строка - текущая версия плагина 17 | // 18 | Функция Версия() Экспорт 19 | Возврат "1.6.0"; 20 | КонецФункции 21 | 22 | // Возвращает приоритет выполнения плагина 23 | // 24 | // Возвращаемое значение: 25 | // Число - приоритет выполнения плагина 26 | // 27 | Функция Приоритет() Экспорт 28 | Возврат 0; 29 | КонецФункции 30 | 31 | // Возвращает описание плагина 32 | // 33 | // Возвращаемое значение: 34 | // Строка - описание функциональности плагина 35 | // 36 | Функция Описание() Экспорт 37 | Возврат "Плагин отключает версионирование файла дампа версий объектов конфигурации (ConfigDumpInfo.xml) 38 | |и удаляет его после выгрузки конфигурации в файлы."; 39 | КонецФункции 40 | 41 | // Возвращает подробную справку к плагину 42 | // 43 | // Возвращаемое значение: 44 | // Строка - подробная справка для плагина 45 | // 46 | Функция Справка() Экспорт 47 | Возврат "Плагин отключает версионирование файла дампа версий объектов конфигурации (ConfigDumpInfo.xml) 48 | |и удаляет его после выгрузки конфигурации в файлы."; 49 | КонецФункции 50 | 51 | // Возвращает имя плагина 52 | // 53 | // Возвращаемое значение: 54 | // Строка - имя плагина при подключении 55 | // 56 | Функция Имя() Экспорт 57 | Возврат "drop-config-dump"; 58 | КонецФункции 59 | 60 | // Возвращает имя лога плагина 61 | // 62 | // Возвращаемое значение: 63 | // Строка - имя лога плагина 64 | // 65 | Функция ИмяЛога() Экспорт 66 | Возврат СтрШаблон("oscript.lib.gitsync.plugins.%1", Имя()); 67 | КонецФункции 68 | 69 | #КонецОбласти 70 | 71 | #Область Подписки_на_события 72 | 73 | Процедура ПриАктивизации(СтандартныйОбработчик) Экспорт 74 | 75 | Обработчик = СтандартныйОбработчик; 76 | 77 | МенеджерПлагинов = ПараметрыПриложения.МенеджерПлагинов(); 78 | ИндексПлагинов = МенеджерПлагинов.ПолучитьИндексПлагинов(); 79 | ОтключаемыеПлагины = ОтключаемыеПлагины(); 80 | 81 | Для Каждого ТекЭлемент Из ИндексПлагинов Цикл 82 | Если ОтключаемыеПлагины.Найти(ВРег(ТекЭлемент.Ключ)) = Неопределено Тогда 83 | Продолжить; 84 | КонецЕсли; 85 | Если НЕ ТекЭлемент.Значение.Включен() Тогда 86 | Продолжить; 87 | КонецЕсли; 88 | 89 | Лог.Информация("Плагин ""%1"" не совместим с плагином ""%2"" и будет отключен на время выполнения синхронизации!", 90 | ТекЭлемент.Ключ, 91 | Имя()); 92 | ТекЭлемент.Значение.Отключить(); 93 | 94 | КонецЦикла; 95 | 96 | КонецПроцедуры 97 | 98 | Процедура ПриРегистрацииКомандыПриложения(ИмяКоманды, КлассРеализации) Экспорт 99 | 100 | ТекущаяКоманда = ИмяКоманды; 101 | 102 | Лог.Отладка("Ищу команду <%1> в списке поддерживаемых", ИмяКоманды); 103 | Если КомандыПлагина.Найти(ИмяКоманды) = Неопределено Тогда 104 | Возврат; 105 | КонецЕсли; 106 | 107 | КонецПроцедуры 108 | 109 | Процедура ПриПолученииПараметров(ПараметрыКоманды) Экспорт 110 | 111 | КонецПроцедуры 112 | 113 | Процедура ПередВыгрузкойКонфигурациюВИсходники(Конфигуратор, 114 | КаталогРабочейКопии, 115 | КаталогВыгрузки, 116 | ПутьКХранилищу, 117 | НомерВерсии) Экспорт 118 | 119 | УдалитьФайлДампаИзменений(КаталогРабочейКопии); 120 | 121 | КонецПроцедуры 122 | 123 | Процедура ПослеВыгрузкиКонфигурациюВИсходники(Конфигуратор, КаталогВыгрузки) Экспорт 124 | 125 | УдалитьФайлДампаИзменений(КаталогВыгрузки); 126 | 127 | КонецПроцедуры 128 | 129 | Процедура ПередКоммитом(КаталогРабочейКопии, Комментарий, Автор, Дата) Экспорт 130 | 131 | КорневойКаталогГит = КорневойКаталогГит(КаталогРабочейКопии); 132 | 133 | Если НЕ ЗначениеЗаполнено(КорневойКаталогГит) Тогда 134 | Лог.Предупреждение("Каталог ""%1"" не является репозиторием git!", КаталогРабочейКопии); 135 | Возврат; 136 | КонецЕсли; 137 | 138 | ПутьКФайлуДампаИзменений = ОбъединитьПути(КаталогРабочейКопии, ИмяФайлаДампаИзменений()); 139 | ФайлИгнорируемыхИзменений = Новый Файл(ОбъединитьПути(КорневойКаталогГит, ".gitignore")); 140 | ТекстИгнорируемыхИзменений = Новый ТекстовыйДокумент(); 141 | 142 | Если ФайлИгнорируемыхИзменений.Существует() И ФайлИгнорируемыхИзменений.ЭтоФайл() Тогда 143 | Лог.Отладка("Найден файл игнорируемых изменений ""%1"".", ФайлИгнорируемыхИзменений.ПолноеИмя); 144 | ТекстИгнорируемыхИзменений.Прочитать(ФайлИгнорируемыхИзменений.ПолноеИмя); 145 | КонецЕсли; 146 | 147 | ОтносительныйПуть = СтрЗаменить(ПутьКФайлуДампаИзменений, КорневойКаталогГит, ""); 148 | 149 | Для НомерСтроки = 1 По ТекстИгнорируемыхИзменений.КоличествоСтрок() Цикл 150 | ТекСтрока = ТекстИгнорируемыхИзменений.ПолучитьСтроку(НомерСтроки); 151 | Если СтрНайти(ТекСтрока, ОтносительныйПуть) > 0 Тогда 152 | Возврат; 153 | КонецЕсли; 154 | КонецЦикла; 155 | 156 | ТекстИгнорируемыхИзменений.ДобавитьСтроку(ОтносительныйПуть); 157 | ТекстИгнорируемыхИзменений.Записать(ФайлИгнорируемыхИзменений.ПолноеИмя); 158 | Лог.Отладка("Файл дампа изменений ""%1"" добавлен в файл игнорируемых изменений ""%2"".", 159 | ОтносительныйПуть, 160 | ФайлИгнорируемыхИзменений.ПолноеИмя); 161 | 162 | ЗакоммититьФайлИгнорируемыхИзменений = Истина; 163 | 164 | КонецПроцедуры 165 | 166 | Процедура ПриКоммите(ГитРепозиторий, 167 | Комментарий, 168 | ПроиндексироватьОтслеживаемыеФайлы, 169 | ИмяФайлаКомментария, 170 | АвторДляГит, 171 | ДатаДляГит, 172 | Коммитер, 173 | ДатаКоммитера) Экспорт 174 | 175 | Если НЕ ЗакоммититьФайлИгнорируемыхИзменений Тогда 176 | Возврат; 177 | КонецЕсли; 178 | 179 | РабочийКаталог = ГитРепозиторий.ПолучитьРабочийКаталог(); 180 | КорневойКаталогГит = КорневойКаталогГит(РабочийКаталог); 181 | 182 | Если НЕ ЗначениеЗаполнено(КорневойКаталогГит) Тогда 183 | Лог.Предупреждение("Каталог ""%1"" не является репозиторием git!", РабочийКаталог); 184 | Возврат; 185 | КонецЕсли; 186 | 187 | ФайлИгнорируемыхИзменений = Новый Файл(ОбъединитьПути(КорневойКаталогГит, ".gitignore")); 188 | 189 | ПараметрыКомандыГит = Новый Массив(); 190 | ПараметрыКомандыГит.Добавить("add"); 191 | ПараметрыКомандыГит.Добавить("-A"); 192 | ПараметрыКомандыГит.Добавить(ФайлИгнорируемыхИзменений.ПолноеИмя); 193 | 194 | ГитРепозиторий.ВыполнитьКоманду(ПараметрыКомандыГит); 195 | 196 | КонецПроцедуры 197 | 198 | #КонецОбласти 199 | 200 | #Область Вспомогательные_процедуры_и_функции 201 | 202 | // Функция возвращает путь к корневому каталогу репозитария git 203 | // 204 | // Параметры: 205 | // КаталогРабочейКопии - Строка - проверяемый каталог 206 | // 207 | // Возвращаемое значение: 208 | // Строка - путь к корневому каталогу репозитария git 209 | // если пустая строка, то каталог не является репозиторием git 210 | // 211 | Функция КорневойКаталогГит(Знач КаталогРабочейКопии) 212 | 213 | ТекущийКаталог = Новый Файл(КаталогРабочейКопии); 214 | 215 | ЭтоКорневойКаталог = (ТекущийКаталог.ПолноеИмя = "/" 216 | ИЛИ Прав(ТекущийКаталог.ПолноеИмя, 1) = ":" 217 | ИЛИ Прав(ТекущийКаталог.ПолноеИмя, 2) = ":/" 218 | ИЛИ Прав(ТекущийКаталог.ПолноеИмя, 2) = ":\"); 219 | 220 | Если ЭтоКорневойКаталог Тогда 221 | Возврат ""; 222 | КонецЕсли; 223 | 224 | СлужебныйКаталогГит = Новый Файл(ОбъединитьПути(ТекущийКаталог.ПолноеИмя, ".git")); 225 | 226 | Если СлужебныйКаталогГит.Существует() И СлужебныйКаталогГит.ЭтоКаталог() Тогда 227 | Возврат ТекущийКаталог.ПолноеИмя; 228 | Иначе 229 | Возврат КорневойКаталогГит(ТекущийКаталог.Путь); 230 | КонецЕсли; 231 | 232 | КонецФункции // КорневойКаталогГит() 233 | 234 | // Процедура удаляет файл дампа изменений (ConfigDumpInfo.xml) в указаном каталоге 235 | // 236 | // Параметры: 237 | // КаталогРабочейКопии - Строка - проверяемый каталог 238 | // 239 | Процедура УдалитьФайлДампаИзменений(КаталогРабочейКопии) 240 | 241 | ФайлДампаИзменений = Новый Файл(ОбъединитьПути(КаталогРабочейКопии, ИмяФайлаДампаИзменений())); 242 | 243 | Если ФайлДампаИзменений.Существует() Тогда 244 | Лог.Отладка("Удаляем файл дампа изменений ""%1"".", ФайлДампаИзменений.ПолноеИмя); 245 | УдалитьФайлы(ФайлДампаИзменений.ПолноеИмя); 246 | КонецЕсли; 247 | 248 | КонецПроцедуры // УдалитьФайлДампаИзменений() 249 | 250 | // Функция возвращает имя файла дампа изменений 251 | // 252 | // Возвращаемое значение: 253 | // Строка - "ConfigDumpInfo.xml" имя файла дампа изменений 254 | // 255 | Функция ИмяФайлаДампаИзменений() 256 | Возврат "ConfigDumpInfo.xml"; 257 | КонецФункции // ИмяФайлаДампаИзменений() 258 | 259 | // Функция возвращает имя плагина инкрементальной выгрузки 260 | // 261 | // Возвращаемое значение: 262 | // Строка - "INCREMENT" имя плагина инкрементальной выгрузки 263 | // 264 | Функция ИмяПлагинаИнкрементальнойВыгрузки() 265 | Возврат "INCREMENT"; 266 | КонецФункции // ИмяПлагинаИнкрементальнойВыгрузки() 267 | 268 | // Функция возвращает имя плагина инкрементальной выгрузки 269 | // 270 | // Возвращаемое значение: 271 | // ФиксированныйМассив из Строка - список отключаемых плагинов 272 | // 273 | Функция ОтключаемыеПлагины() 274 | 275 | ОтключаемыеПлагины = Новый Массив(); 276 | ОтключаемыеПлагины.Добавить(ИмяПлагинаИнкрементальнойВыгрузки()); 277 | 278 | Возврат Новый ФиксированныйМассив(ОтключаемыеПлагины); 279 | 280 | КонецФункции // ОтключаемыеПлагины() 281 | 282 | #КонецОбласти 283 | 284 | Процедура Инициализация() 285 | 286 | Лог = Логирование.ПолучитьЛог(ИмяЛога()); 287 | 288 | КомандыПлагина = Новый Массив; 289 | КомандыПлагина.Добавить("init"); 290 | КомандыПлагина.Добавить("sync"); 291 | 292 | ЗакоммититьФайлИгнорируемыхИзменений = Ложь; 293 | 294 | КонецПроцедуры 295 | 296 | Инициализация(); 297 | --------------------------------------------------------------------------------