Cmdlets/NewPatch.cs

using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Tooling.Connector;
using System;
using System.Linq;
using System.Management.Automation;
 
namespace Xrm.DevOps.Tools.Cmdlets
{
    [Cmdlet(VerbsCommon.New, "Patch")]
    public class NewPatch: Cmdlet
    {
        [Parameter(Position = 1, Mandatory = true)]
        public string ConnectionString { get; set; }
 
        [Parameter(Position = 2, Mandatory = true)]
        public string ParentSolutionName { get; set; }
 
        CrmServiceClient _client;
 
        protected override void BeginProcessing()
        {
            _client = new CrmServiceClient(ConnectionString);
        }
 
        protected override void ProcessRecord()
        {
            //https://github.com/WaelHamze/xrm-ci-framework/blob/master/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Cmdlets/AddXrmSolutionPatch.cs
 
            Entity solution = new Entity("solution");
 
            QueryExpression query = new QueryExpression
            {
                EntityName = "solution",
                ColumnSet = new ColumnSet("uniquename", "version"),
                Criteria = new FilterExpression
                {
                    FilterOperator = LogicalOperator.Or,
                    Conditions =
                    {
                        new ConditionExpression("uniquename", ConditionOperator.Equal, ParentSolutionName),
                        new ConditionExpression("uniquename", ConditionOperator.Like, $"{ParentSolutionName}_Patch%")
                    }
                }
            };
            query.AddOrder("version", OrderType.Descending);
 
            var response = _client.RetrieveMultiple(query);
 
            if (response.Entities.Count > 0)
            {
                solution = response.Entities.First();
            }
 
            string[] versions = solution.GetAttributeValue<string>("version").Split('.');
            char dot = '.';
            string version = string.Concat(versions[0], dot, versions[1], dot, Convert.ToInt32(versions[2]) + 1, dot, 0);
 
 
            CloneAsPatchRequest request = new CloneAsPatchRequest
            {
                ParentSolutionUniqueName = ParentSolutionName,
                DisplayName = ParentSolutionName,
                VersionNumber = version
            };
 
            CloneAsPatchResponse cloneResponse = _client.Execute(request) as CloneAsPatchResponse;
 
            WriteVerbose($"Patch {cloneResponse.SolutionId} created!");
        }
 
        protected override void EndProcessing()
        {
 
        }
    }
}