/// <summary>
 /// Creates a policy in Azure DevOps.
 /// </summary>
 /// <param name="policyClient">Policy client</param>
 /// <param name="types">Types</param>
 /// <param name="projectId">Team project id</param>
 /// <param name="repository">Git repository</param>
 /// <param name="currentPolicy">Branch policy</param>
 /// <param name="policy">Policy</param>
 /// <returns>Task</returns>
 protected abstract Task CreatePolicy(
     PolicyHttpClient policyClient,
     IEnumerable <PolicyType> types,
     Guid projectId,
     GitRepository repository,
     BranchPolicies currentPolicy,
     Policy policy);
 /// <summary>
 /// Logs the change.
 /// </summary>
 /// <param name="policyClient">Policy client</param>
 /// <param name="types">Types</param>
 /// <param name="projectId">Team project id</param>
 /// <param name="repository">Git repository</param>
 /// <param name="currentPolicy">Branch policy</param>
 /// <param name="policy">Policy</param>
 /// <returns>Task</returns>
 #pragma warning disable 1998
 protected override async Task CreatePolicy(
     PolicyHttpClient policyClient,
     IEnumerable <PolicyType> types,
     Guid projectId,
     GitRepository repository,
     BranchPolicies currentPolicy,
     Policy policy)
 {
     this.Logger.Info($"Policy not found in Azure DevOps, would be created. (Repository: {repository.Name}, Branch: {currentPolicy.Branch}, Type: {policy.TypeString})");
     this.Logger.Debug($"Settings is: {policy.PrepareSettingsWithScopeAndSubType(repository.Id, policy)}");
 }
        private void HandleBranchChanges(
            PolicyHttpClient policyClient,
            Guid projectId,
            GitRepository repository,
            IEnumerable <PolicyConfiguration> serverPolicies,
            IEnumerable <PolicyType> types,
            List <int> handledServerPolicies,
            BranchPolicies currentPolicy,
            List <Task> resultList)
        {
            foreach (var policy in currentPolicy.Policies)
            {
                bool hasMatch = false;

                policy.PreparePolicyType(types);

                if (policy.PolicyType == null)
                {
                    this.Logger.Warn($"Type not found. (Branch: {currentPolicy.Branch}, Type: {policy.Type})");
                }

                if (serverPolicies != null)
                {
                    foreach (var serverPolicy in serverPolicies)
                    {
                        if (policy.PolicyType.Id == serverPolicy.Type.Id && serverPolicy.DoesSubTypeMatch(policy) &&
                            ((serverPolicy.GetBranch() == null) ||     // Repository specific
                             (serverPolicy.GetBranch() == policy.Branch && serverPolicy.GetMatchKind() == policy.MatchKind)))
                        {
                            hasMatch = true;
                            handledServerPolicies.Add(serverPolicy.Id);

                            if (policy.PolicyEquals(serverPolicy))
                            {
                                this.Logger.Info($"Policy is up to date. (Repository: {repository.Name}, Branch: {currentPolicy.Branch}, Type: {policy.TypeString})");
                            }
                            else
                            {
                                resultList.Add(this.UpdatePolicy(policyClient, types, projectId, repository, currentPolicy, policy, serverPolicy));
                            }

                            break;
                        }
                    }
                }

                if (!hasMatch)
                {
                    resultList.Add(this.CreatePolicy(policyClient, types, projectId, repository, currentPolicy, policy));
                }
            }
        }
        /// <summary>
        /// Creates a policy in Azure DevOps.
        /// </summary>
        /// <param name="policyClient">Policy client</param>
        /// <param name="types">Types</param>
        /// <param name="projectId">Team project id</param>
        /// <param name="repository">Git repository</param>
        /// <param name="currentPolicy">Branch policy</param>
        /// <param name="policy">Policy</param>
        /// <returns>Task</returns>
        protected override async Task CreatePolicy(
            PolicyHttpClient policyClient,
            IEnumerable <PolicyType> types,
            Guid projectId,
            GitRepository repository,
            BranchPolicies currentPolicy,
            Policy policy)
        {
            var policyConfiguration = this.GetPolicyConfiguration(types, repository, policy);
            var result = await policyClient.CreatePolicyConfigurationAsync(policyConfiguration, projectId).ConfigureAwait(false);

            this.Logger.Debug(this.Serializer.Serialize(result));
            this.Logger.Info($"Policy created. (Repository: {repository.Name}, Branch: {currentPolicy.Branch}, Type: {policy.TypeString})");
        }