Cmdlets/MergeSolution.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(VerbsData.Merge, "Solution")]
    public class MergeSolution: Cmdlet
    {
        [Parameter(Position = 1, Mandatory = true)]
        public string ConnectionString { get; set; }
 
        [Parameter(Position = 2, Mandatory = true)]
        public string SolutionName { get; set; }
 
        CrmServiceClient _client;
 
        protected override void BeginProcessing()
        {
            _client = new CrmServiceClient(ConnectionString);
        }
 
        protected override void ProcessRecord()
        {
            Entity solution = new Entity("solution");
 
            QueryExpression query = new QueryExpression
            {
                EntityName = "solution",
                ColumnSet = new ColumnSet("uniquename", "version"),
                Criteria = new FilterExpression
                {
                    Conditions =
                    {
                        new ConditionExpression("uniquename", ConditionOperator.Equal, SolutionName),
                    }
                }
            };
 
            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, Convert.ToInt32(versions[1]) + 1, dot, Convert.ToInt32(versions[2]), dot, 0);
 
 
            CloneAsSolutionRequest request = new CloneAsSolutionRequest()
            {
                ParentSolutionUniqueName = SolutionName,
                DisplayName = SolutionName,
                VersionNumber = version
            };
 
            CloneAsSolutionResponse cloneResponse = _client.Execute(request) as CloneAsSolutionResponse;
 
            WriteVerbose($"Solution {cloneResponse.SolutionId} created!");
        }
 
        protected override void EndProcessing() { }
    }
}