Beispiel #1
0
        public eTeamCodingChecksResult CheckBeforeOpen(out string ErrorMsg)
        {
            eTeamCodingChecksResult answer = eTeamCodingChecksResult.None;

            ErrorMsg = string.Empty;

            Seri.Log.Here().Debug("Начинаем проверку перед открытием объекта");

            // Проверяем включен ли TeamCoding
            if (!_Settings.TEAMCODING_ENABLE)
            {
                Seri.Log.Here().Debug("TeamCoding отключен, пропускаем все проверки");
                answer |= eTeamCodingChecksResult.Allow;
            }
            else
            {
                // Пробуем загрузить провайдера TeamCoding
                try
                {
                    if (_TeamCodingProvider == null)
                    {
                        _TeamCodingProvider = NinjectCore.Get <ITeamCodingProvider>();
                    }
                }
                catch (Exception ex)
                {
                    // При загрузке провайдера были ошибки
                    Seri.LogException(ex);
                    ErrorMsg = ex.Message;
                    // Запрещаем компилировать объект
                    answer |= eTeamCodingChecksResult.Allow | eTeamCodingChecksResult.ProviderNotSet;
                    return(answer);
                }

                // Текущий сервер
                var ServerName = _IDEProvider.SQLQueryExecute <DummyString>(_Settings.SQL_SERVERNAME)[0].Value;
                Seri.Log.Here().Debug("ServerName = " + ServerName);

                // Текущий объект
                var dbObject = _IDEProvider.GetDbObject <DbObject>(true);
                Seri.Log.Here().Debug($"dbObject {dbObject}");

                if (dbObject == null)
                {
                    answer |= eTeamCodingChecksResult.Allow;
                }
                else
                {
                    var UserOwner = _TeamCodingProvider.GetUserOwner(dbObject, ServerName);
                    Seri.Log.Here().Debug("UserOwner = " + UserOwner);
                    if (!string.IsNullOrEmpty(UserOwner))
                    {
                        ErrorMsg = $"Объект находится в пользовании у [{UserOwner}]";
                        answer  |= eTeamCodingChecksResult.Restrict;
                    }
                }
            }

            return(answer);
        }
        public TeamCodingViewModel(ITeamCodingProvider TeamCodingProvider, IIDEProvider IDEProvider, ISettings Settings)
        {
            _TeamCodingProvider = TeamCodingProvider;

            UserLogin = Settings.TEAMCODING_LOGIN;

            DbObject = IDEProvider.GetDbObject <DbObject>(true);
            if (DbObject == null)
            {
                DbObject = new DbObject("SIA", "LOLKEK", "PACKAGE");
            }

            CheckInSource   = NinjectCore.Get <CommandCheckIn>();
            CheckOutSource  = NinjectCore.Get <CommandCheckOut>();
            CheckInCommand  = new RelayCommand(CheckIn, CheckInSource.CanExecute);
            CheckOutCommand = new RelayCommand(CheckOut, CheckOutSource.CanExecute);

            CheckOutList = new ObservableCollection <ICheckOutObject>();
            FillCheckOutList();
        }
Beispiel #3
0
 public CommandCheckOut(ITeamCodingProvider TeamCodingProvider, ISettings Settings, IIDEProvider IDEProvider) : base("PluginCommandCheckOut")
 {
     _TeamCodingProvider = TeamCodingProvider;
     _Settings           = Settings;
     _IDEProvider        = IDEProvider;
 }
        private void FillSettings()
        {
            _ListSettings = new List <IPluginParameter>();

            #region Main group

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.GitRepositoryPath, @"D:\Repo")
            {
                Description    = "Репозиторий Git",
                DescriptionExt = "Необходимо указать расположение репозитрия Git с объектами DB",
                Group          = ePluginParameterGroupType.Main,
                ParamterUIType = ePluginParameterUIType.Path,
                OrderPosition  = 1
            });

            _ListSettings.Add(new PluginParameterList(ePluginParameterID.SaveEncodingType, 2, typeof(eSaveEncodingType))
            {
                Description    = "Кодировка по умолчанию",
                DescriptionExt = @"Файл в репозитории Git может иметь маркер кодировки UTF8 – BOM. BOM - Byte Order Mark, Маркер последовательности " +
                                 "байтов или метка порядка – специальный символ из стандарта Юникод, вставляемый в начало текстового файла или потока для обозначения того, " +
                                 "что в файле(потоке) используется Юникод, а также для косвенного указания кодировки и порядка байтов, " +
                                 "с помощью которых символы Юникода были закодированы. Рекомендуется не менять существующий формат.",
                Group          = ePluginParameterGroupType.Main,
                ParamterUIType = ePluginParameterUIType.List,
                OrderPosition  = 100
            });

            #endregion


            #region GitDiff group

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DiffAddSchema, true)
            {
                Description    = "Добавлять префикс схемы к названию объекта",
                DescriptionExt = "Эта настройка, дополняет предыдущую. При отсутствии схемы в названии объекта БД, она будет добавлена. (Такое встречается в файлах Git)",
                Group          = ePluginParameterGroupType.GitDiff,
                OrderPosition  = 30
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DiffChangeCor, true)
            {
                Description    = "Игнорировать изменения до названия объекта",
                DescriptionExt = "Касается переноса после ‘Create or replace’ а также лишних пробелов, которые могут встречаться в файле Git и " +
                                 "отсутствовать в PL/SQL Developer. При включенной настройке, вы не увидите этих изменений в первых строках файла.",
                Group         = ePluginParameterGroupType.GitDiff,
                OrderPosition = 10
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DiffChangeName, true)
            {
                Description    = "Сохранять название объекта, как в git",
                DescriptionExt = "Название объекта БД открытого в PL/SQL Developer может не всегда совпадать с названием того же объекта в Git. " +
                                 "Если опция включена, название объекта всегда будет соответствовать версии названия в файле в репозитории Git.",
                Group         = ePluginParameterGroupType.GitDiff,
                OrderPosition = 20
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DiffCRLF, true)
            {
                Description    = "Обрабатывать перенос строк LF",
                DescriptionExt = "В PL/SQL Developer применяется стандартный для Windows перенос строк в два символа CR-LF (“Carriage Return” и “Line Feed”). " +
                                 "Если в локальном файле репозитория Git, перенос строк реализован через один символ LF (пока такое встречается редко), то при включённой опции, " +
                                 "CR-LF в тексте объекта БД будет заменено на LF. Это позволит избежать конфликтов в каждой строчке текста. Так же эту проблему можно решить, " +
                                 "если в настрйоках Git установить переменную autocrlf в true(выполнить git config--global core.autocrlf true)",
                Group         = ePluginParameterGroupType.GitDiff,
                OrderPosition = 50
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DiffWorkWithSlash, true)
            {
                Description    = "Обрабатывать '/' в конце файла",
                DescriptionExt = "Текст в файлах в репозитории Git заканчивается на ‘/’. Обработка этого символа предотвращает его " +
                                 "затирание при операции сохранения текста. А также убирает этот символ при операции загрузки текста.",
                Group         = ePluginParameterGroupType.GitDiff,
                OrderPosition = 40
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DiffEndSpace, true)
            {
                Description    = "Игн. изменения пробелов в конце строк",
                DescriptionExt = "Изменения в виде пробелов на конце строк не будут отображаться при сравнении, но будут фиксироваться в комите, " +
                                 "если вы не загрузили исходный текст объекта перед работой. Настрйока повилась, после интеграции " +
                                 "конвейерной системы релизов, которая очевидно делает то же самое.",
                Group         = ePluginParameterGroupType.GitDiff,
                OrderPosition = 60
            });

            #endregion


            #region Warning group

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.UnexpectedBranch, true)
            {
                Description    = "Проверка ветки при сохранении текста в репозиторий",
                DescriptionExt = "При сохранении текста объекта в репозитории, если название ветки не совпадает с соответствующим регулярным выражением " +
                                 "– появится предупреждение, во избежание отправки изменений не в ту ветку.",
                Group         = ePluginParameterGroupType.Warning,
                OrderPosition = 10
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.UnexpectedServer, true)
            {
                Description    = "Проверка сервера при загрузки текста в PL/SQL Developer",
                DescriptionExt = "При загрузке текста в PL/SQL Developer, если название сервера не совпадает с соответствующим регулярным выражением – " +
                                 "появится предупреждение, во избежание изменения объекта БД не на том сервере",
                Group         = ePluginParameterGroupType.Warning,
                OrderPosition = 20
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.WarnInRegEx, string.Empty)
            {
                Description       = "Регулярное выражение, для проверки операции SaveText",
                DescriptionExt    = string.Empty,
                Group             = ePluginParameterGroupType.Warning,
                ParentParameterID = ePluginParameterID.UnexpectedBranch,
                OrderPosition     = 11
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.WarnOutRegEx, string.Empty)
            {
                Description       = "Регулярное выражение, для проверки операции LoadText",
                DescriptionExt    = string.Empty,
                Group             = ePluginParameterGroupType.Warning,
                ParentParameterID = ePluginParameterID.UnexpectedServer,
                OrderPosition     = 21
            });

            #endregion


            #region Blame Group

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.ShowGitBlameProperties, true)
            {
                Description    = "Запрашивать настройки для команды GitBlame",
                DescriptionExt = "Если опция включена, то перед операцией GitBlame можно будет выбрать кол-во строк которое будет обработано. Если же отклчить настройку, то по умолчанию обработаются только 10 строк",
                Group          = ePluginParameterGroupType.Blame,
                OrderPosition  = 10
            });

            var CommitViewURL = _DefaultConfiguration.SelectToken("CommitViewURL").ToString();
            if (string.IsNullOrEmpty(CommitViewURL))
            {
                CommitViewURL = "https://www.google.com/search?q=";
            }
            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.CommitViewURL, CommitViewURL)
            {
                Description    = "URL для запуска информации по коммиту",
                DescriptionExt = "В окне GitBlame при запросе информации по комиту будет переход по этой ссылки. (К этой ссылке в конце будет добавлен sha комита)",
                Group          = ePluginParameterGroupType.Blame,
                OrderPosition  = 20
            });

            #endregion


            #region Others group

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.ClassicButtonsPosition, false)
            {
                Description    = "Классическое расположение кнопок в окне Gitt Diff",
                DescriptionExt = string.Empty,
                Group          = ePluginParameterGroupType.Others,
                OrderPosition  = 10
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DICTI_CHILDREN_LIMIT_ENABLE, true)
            {
                Description   = "Включить ограничение для отбора дочерних записей из Dicti",
                Group         = ePluginParameterGroupType.Others,
                OrderPosition = 20
            });

            _ListSettings.Add(new PluginParameter <int>(ePluginParameterID.DICTI_CHILDREN_LIMIT_VALUE, 20)
            {
                Description       = "Лимит на кол0во отобранных дочерних записей для Dicti",
                Group             = ePluginParameterGroupType.Others,
                ParentParameterID = ePluginParameterID.DICTI_CHILDREN_LIMIT_ENABLE,
                OrderPosition     = 20
            });

            #endregion


            #region SQL Group

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.SQL_DICTI_PARENT_COUNT, _DefaultConfiguration.SelectToken("SQL_DICTI_PARENT_COUNT").ToString())
            {
                Group = ePluginParameterGroupType.SQL
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.SQL_DICTI_PARENT, _DefaultConfiguration.SelectToken("SQL_DICTI_PARENT").ToString())
            {
                Group = ePluginParameterGroupType.SQL
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.SQL_DICTI_HIERARCHY, _DefaultConfiguration.SelectToken("SQL_DICTI_HIERARCHY").ToString())
            {
                Group = ePluginParameterGroupType.SQL
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.SQL_DICTIISN_BY_CONSTNAME, _DefaultConfiguration.SelectToken("SQL_DICTIISN_BY_CONSTNAME").ToString())
            {
                Group = ePluginParameterGroupType.SQL
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.SQL_SERVERNAME, _DefaultConfiguration.SelectToken("SQL_SERVERNAME").ToString())
            {
                Group = ePluginParameterGroupType.SQL
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.SQL_FTOGGLE, _DefaultConfiguration.SelectToken("SQL_FTOGGLE").ToString())
            {
                Group = ePluginParameterGroupType.SQL
            });


            #endregion


            #region TeamCoding Group

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.TEAMCODING_ENABLE, false)
            {
                Description        = "Вкл. TeamCoding",
                DescriptionExt     = "TeamCoding позволяет команде работать на одном сервере. Добавляет возможность делать CheckOut, CheckIn для объектов",
                Group              = ePluginParameterGroupType.TeamCoding,
                OrderPosition      = 10,
                OnParameterChanged = (x) =>
                {
                    var menu = NinjectCore.Get <IMenu>();
                    menu.RefreshMenu();
                }
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.TEAMCODING_LOGIN, string.Empty)
            {
                Description       = "Логин",
                DescriptionExt    = "Ваше имя под которым объекты БД будут браться в пользование",
                Group             = ePluginParameterGroupType.TeamCoding,
                ParentParameterID = ePluginParameterID.TEAMCODING_ENABLE,
                OrderPosition     = 20
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.TEAMCODING_RESTRICT_COMPILE_WITHOUT_CHECKOUT, false)
            {
                Description    = "Запретить компиляцию без CheckOut",
                DescriptionExt = "Если объект в настоящий момет никем не занят, можно разрешить его компилировать без CheckOut. " +
                                 "Эта настройка общая, изменения распространится на всех участников TEAMCODING. " +
                                 "Пожалуйста договоритесь с командой о политиках работы на общей среде прежде чем менять настрйоку",
                Group              = ePluginParameterGroupType.TeamCoding,
                ParentParameterID  = ePluginParameterID.TEAMCODING_ENABLE,
                OrderPosition      = 25,
                OnParameterChanged = (x) =>
                {
                    ITeamCodingProvider provider            = NinjectCore.Get <ITeamCodingProvider>();
                    provider.RestrickCompileWithoutCheckOut = x;
                }
            });

            _ListSettings.Add(new PluginParameterList(ePluginParameterID.TEAMCODING_PROVIDER, 0, typeof(eTeamCodingProviderType))
            {
                Description    = "Провайдер для TeamCoding-а",
                DescriptionExt = "Вариант обмена информацией между несколькими пользователями PL/SQL Developer. Для того что-бы команды была в одной \"сети\", " +
                                 "У всех должны быть одинаковые настройки.\n" +
                                 "Общий файл на диске - файл размешенный в сетевой папке к которому есть доступ у каждого участника. " +
                                 "При операции CheckOut в этот файл добавится информация, что пользователь <Логин> взял в пользование такой объект БД. " +
                                 "Другие участники при обращении к этому объекту БД, будут видеть предупреждение, что объект в настоящий момент занят.",
                Group              = ePluginParameterGroupType.TeamCoding,
                ParentParameterID  = ePluginParameterID.TEAMCODING_ENABLE,
                OrderPosition      = 30,
                OnParameterChanged = (x) => NinjectCore.SetTeamCodingProvider((eTeamCodingProviderType)x)
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.TEAMCODING_FILEPROVIDER_PATH, string.Empty)
            {
                Description                = "Путь для общего файла",
                ParamterUIType             = ePluginParameterUIType.Path,
                Group                      = ePluginParameterGroupType.TeamCoding,
                ParentParameterID          = ePluginParameterID.TEAMCODING_PROVIDER,
                ParentParameterStringValue = "0",
                OrderPosition              = 40
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.TEAMCODING_SERVERNAME_REGEX, string.Empty)
            {
                Description       = "Название рабочего сервера",
                DescriptionExt    = "Регулярное выражение для имени сервера, который должен быть подключен к TeamCoding",
                Group             = ePluginParameterGroupType.TeamCoding,
                ParentParameterID = ePluginParameterID.TEAMCODING_ENABLE,
                OrderPosition     = 50
            });

            #endregion
        }
Beispiel #5
0
        public eTeamCodingChecksResult CheckBeforeCompile(out string ErrorMsg)
        {
            eTeamCodingChecksResult answer = eTeamCodingChecksResult.None;

            ErrorMsg = string.Empty;

            Seri.Log.Here().Debug("Начинаем проверку перед компиляцией");

            // Проверяем включен ли TeamCoding
            if (!_Settings.TEAMCODING_ENABLE)
            {
                Seri.Log.Here().Debug("TeamCoding отключен, пропускаем все проверки");
                answer |= eTeamCodingChecksResult.Allow;
            }
            else
            {
                // Пробуем загрузить провайдера TeamCoding
                try
                {
                    if (_TeamCodingProvider == null)
                    {
                        _TeamCodingProvider = NinjectCore.Get <ITeamCodingProvider>();
                    }
                }
                catch (Exception ex)
                {
                    // При загрузке провайдера были ошибки
                    Seri.LogException(ex);
                    ErrorMsg = ex.Message;

                    // Запрещаем компилировать объект
                    answer |= eTeamCodingChecksResult.Restrict | eTeamCodingChecksResult.ProviderNotSet;
                    return(answer);
                }

                // Текущий сервер
                var ServerName = _IDEProvider.SQLQueryExecute <DummyString>(_Settings.SQL_SERVERNAME)[0].Value;
                Seri.Log.Here().Debug("ServerName = " + ServerName);

                // Текущий объект
                var dbObject = _IDEProvider.GetDbObject <DbObject>(true);
                Seri.Log.Here().Debug($"dbObject {dbObject}");

                if (dbObject == null)
                {
                    // Если объет не определн, пропускам
                    answer |= eTeamCodingChecksResult.Allow;
                    Seri.Log.Here().Warning("Перед компиляцией не смогли определить объект, почему? (Не должны здесть оказаться)");
                }
                else
                {
                    // Текущий владелец объекта по версии Team Coding-а
                    var UserOwner = _TeamCodingProvider.GetUserOwner(dbObject, ServerName);
                    Seri.Log.Here().Debug("UserOwner = " + UserOwner);

                    // Владельца нет
                    if (string.IsNullOrEmpty(UserOwner))
                    {
                        // Проверяем можем ли мы компилировать без CheckOut
                        if (_Settings.TEAMCODING_RESTRICT_COMPILE_WITHOUT_CHECKOUT)
                        {
                            ErrorMsg = "Запрещено компилировать объект без CheckOut";
                            answer  |= eTeamCodingChecksResult.Restrict;
                        }
                        else
                        {
                            answer |= eTeamCodingChecksResult.Allow;
                        }
                    }
                    else
                    {
                        // Владелец есть, и это МЫ
                        if (UserOwner == _Settings.TEAMCODING_LOGIN)
                        {
                            answer |= eTeamCodingChecksResult.Allow;
                        }
                        else
                        {
                            ErrorMsg = $"Невозможно скомпилировать. Объект находится в пользовании [{UserOwner}]";
                            answer  |= eTeamCodingChecksResult.Restrict;
                        }
                    }
                }
            }

            return(answer);
        }