public void MoveItemsTest()
        {
            // Arrange
            var id          = Guid.NewGuid().ToString();
            var sourceItems = new List <IDataItem>();
            var sourceItem  = new QuickContentDataItem(string.Empty, string.Empty, string.Empty, new SyncItem()
            {
                ID = id, TemplateID = id, ItemPath = "/sitecore/content/Home/Test1"
            }, true);

            sourceItems.Add(sourceItem);

            var targetItems = new List <IDataItem>();
            var targetItem  = new QuickContentDataItem(string.Empty, string.Empty, string.Empty, new SyncItem()
            {
                ID = id, TemplateID = id, ItemPath = "/sitecore/content/Home/Test2"
            }, true);

            targetItems.Add(targetItem);

            var sourceDataIterator = new TestDataIterator(sourceItems);
            var targetDataIterator = new TestDataIterator(targetItems);

            var engineMock = new Mock <DataEngine>(null, null, new List <ICommandFilter>());

            // Act
            var commands = DiffGenerator.GetDiffCommands(new HashSet <string>(), CollisionBehavior.Force, sourceDataIterator, targetDataIterator, engineMock.Object);

            //Assert
            Assert.AreEqual(1, commands.Count);
            Assert.AreEqual(1, commands.Count(x => x is ChangeItemCommand));
        }
示例#2
0
        /// <summary>
        /// Mains the specified args.
        /// </summary>
        /// <param name="args">The arguments.</param>
        public static void Main(string[] args)
        {
            var options = new Options();

            if (CommandLine.Parser.Default.ParseArguments(args, options))
            {
                Console.WriteLine("Source: {0}", options.Source);
                Console.WriteLine("Target: {0}", options.Target);
                Console.WriteLine("Output: {0}", options.Output);
                Console.WriteLine("Collision behavior: {0}", options.CollisionBehavior);
                Console.WriteLine("Configuration: {0}", options.Configuration);
                Console.WriteLine("Path to project file: {0}", options.ScProjFilePath);

                if (ExclusionHandler.HasValidExclusions(options.Configuration, options.ScProjFilePath))
                {
                    var exclusions = ExclusionHandler.GetExcludedItems(options.ScProjFilePath, options.Configuration);

                    ExclusionHandler.RemoveExcludedItems(options.Source, exclusions);
                    ExclusionHandler.RemoveExcludedItems(options.Target, exclusions);
                }

                var diff = new DiffInfo(
                    DiffGenerator.GetDiffCommands(options.Source, options.Target, options.CollisionBehavior),
                    "Sitecore Courier Package",
                    string.Empty,
                    string.Format("Diff between serialization folders '{0}' and '{1}'.", options.Source, options.Target));

                PackageGenerator.GeneratePackage(diff, string.Empty, options.Output);
            }
            else
            {
                Console.WriteLine(options.GetUsage());
            }
        }
示例#3
0
        protected override void BeginProcessing()
        {
            try
            {
                var currentDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE",
                                                Path.Combine(currentDirectory, "Sitecore.Courier.dll.config"));
                ResetConfigMechanism();
                string version = Guid.NewGuid().ToString();

                Console.WriteLine("Source: {0}", Source);
                Console.WriteLine("Target: {0}", Target);
                Console.WriteLine("Output: {0}", Output);
                Console.WriteLine("SerializationProvider: {0}", SerializationProvider);
                Console.WriteLine("CollisionBehavior: {0}", CollisionBehavior);
                Console.WriteLine("IncludeFiles: {0}", IncludeFiles);
                Console.WriteLine("DacPac: {0}", DacPac);

                RainbowSerializationProvider.Enabled        = SerializationProvider == SerializationProvider.Rainbow;
                RainbowSerializationProvider.IncludeFiles   = IncludeFiles;
                RainbowSerializationProvider.EnsureRevision = EnsureRevision;

                var diff = new DiffInfo(
                    DiffGenerator.GetDiffCommands(Source, Target, IncludeSecurity, version, CollisionBehavior),
                    "Sitecore Courier Package",
                    string.Empty,
                    string.Format("Diff between serialization folders '{0}' and '{1}'.", Source, Target));

                if (IncludeSecurity)
                {
                    diff.Commands.Add(new PostStepFileSystemDataItem(currentDirectory, string.Empty, PostDeployDll)
                                      .GenerateAddCommand().FirstOrDefault());
                    diff.PostStep = PostStep;
                    diff.Version  = version;
                }

                if (DacPac)
                {
                    SqlConverter c = new SqlConverter();
                    c.ConvertPackage(diff, Output);

                    var           builder = new DacPacBuilder();
                    DirectoryInfo d       = new DirectoryInfo(Output);
                    foreach (var file in d.GetFiles("*.sql"))
                    {
                        builder.ConvertToDacPac(file.FullName, Path.Combine(file.DirectoryName, $"{Path.GetFileNameWithoutExtension(file.Name)}.dacpac"));
                    }
                }
                else
                {
                    PackageGenerator.GeneratePackage(diff, string.Empty, Output);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                throw ex;
            }
        }
        /// <summary>
        /// Handles the Generate_ click event.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        protected void Generate_Click(object sender, EventArgs e)
        {
            var sourcePath = this.SourcePath.Text;
            var targetPath = this.TargetPath.Text;

            var result = DiffGenerator.GetDiffCommands(sourcePath, targetPath);

            var fileName = "SitecoreCourier_{0}.update".FormatWith(Guid.NewGuid());
            var filePath = string.Format("{0}/{1}", this.Server.MapPath("/temp"), fileName);

            result = FilterCommands(result);
            var diff = new DiffInfo(result, "Sitecore Courier Package", string.Empty, string.Format("Diff has been generated between '{0}' and '{1}'", this.SourcePath.Text, this.TargetPath.Text));

            PackageGenerator.GeneratePackage(diff, string.Empty, filePath);

            this.DownloadLink.NavigateUrl = string.Format("/temp/{0}", fileName);
            this.DownloadLink.Visible     = true;
            this.AnalyzeResults.Visible   = false;
        }
        /// <summary>
        /// Handles the Analyze_ click event.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        protected void Analyze_Click(object sender, EventArgs e)
        {
            var sourcePath = this.SourcePath.Text;
            var targetPath = this.TargetPath.Text;
            var result     = DiffGenerator.GetDiffCommands(sourcePath, targetPath);

            this.Added.Items.Clear();
            this.Changed.Items.Clear();
            this.Deleted.Items.Clear();

            foreach (var command in result)
            {
                if (command.CommandPrefix == "addeditems")
                {
                    var item = new ListItem(command.EntityPath.Substring(0, command.EntityPath.IndexOf("{", System.StringComparison.Ordinal) - 1), command.EntityID);
                    item.Selected = true;
                    this.Added.Items.Add(item);
                }

                if (command.CommandPrefix == "changeditems")
                {
                    var item = new ListItem(command.EntityPath.Substring(0, command.EntityPath.IndexOf("{", System.StringComparison.Ordinal) - 1), command.EntityID);
                    item.Selected = true;
                    this.Changed.Items.Add(item);
                }

                if (command.CommandPrefix == "deleteditems")
                {
                    var item = new ListItem(command.EntityPath.Substring(0, command.EntityPath.IndexOf("{", System.StringComparison.Ordinal) - 1), command.EntityID);
                    item.Selected = true;
                    this.Deleted.Items.Add(item);
                }
            }

            AddedCount.Text   = Added.Items.Count.ToString(CultureInfo.InvariantCulture);
            DeletedCount.Text = Deleted.Items.Count.ToString(CultureInfo.InvariantCulture);
            ChangedCount.Text = Changed.Items.Count.ToString(CultureInfo.InvariantCulture);

            this.DownloadLink.Visible   = false;
            this.AnalyzeResults.Visible = true;
        }
        public void DeleteItemsTest()
        {
            // Arrange
            var sourceItems = new List <IDataItem>();
            var sourceItem  = new QuickContentDataItem(string.Empty, string.Empty, string.Empty, new SyncItem());

            sourceItems.Add(sourceItem);

            var targetItems        = new List <IDataItem>();
            var sourceDataIterator = new TestDataIterator(sourceItems);
            var targetDataIterator = new TestDataIterator(targetItems);

            var engineMock = new Mock <DataEngine>(null, null, new List <ICommandFilter>());

            // Act
            var commands = DiffGenerator.GetDiffCommands(new HashSet <string>(), CollisionBehavior.Force, sourceDataIterator, targetDataIterator, engineMock.Object);

            //Assert
            Assert.AreEqual(1, commands.Count);
            Assert.AreEqual(1, commands.Count(x => x is DeleteItemCommand));
        }
示例#7
0
        /// <summary>
        /// Mains the specified args.
        /// </summary>
        /// <param name="args">The arguments.</param>
        public static void Main(string[] args)
        {
            var options = new Options();

            if (CommandLine.Parser.Default.ParseArguments(args, options))
            {
                Console.WriteLine("Source: {0}", options.Source);
                Console.WriteLine("Target: {0}", options.Target);
                Console.WriteLine("Output: {0}", options.Output);
                var diff = new DiffInfo(
                    DiffGenerator.GetDiffCommands(options.Source, options.Target),
                    "Sitecore Courier Package",
                    string.Empty,
                    string.Format("Diff between serialization folders '{0}' and '{1}'.", options.Source, options.Target));

                PackageGenerator.GeneratePackage(diff, string.Empty, options.Output);
            }
            else
            {
                Console.WriteLine(options.GetUsage());
            }
        }
示例#8
0
        /// <summary>
        /// Mains the specified args.
        /// </summary>
        /// <param name="args">The arguments.</param>
        public static void Main(string[] args)
        {
            var options = new Options();

            if (CommandLine.Parser.Default.ParseArguments(args, options))
            {
                Console.WriteLine("Source: {0}", options.Source);
                Console.WriteLine("Target: {0}", options.Target);
                Console.WriteLine("Output: {0}", options.Output);
                Console.WriteLine("Collision behavior: {0}", options.CollisionBehavior);
                Console.WriteLine("Use Rainbow: {0}", options.UseRainbow);
                Console.WriteLine("Include Security: {0}", options.IncludeSecurity);
                Console.WriteLine("Include Files: {0}", options.IncludeFiles);
                Console.WriteLine("Configuration: {0}", options.Configuration);
                Console.WriteLine("Ensure Revision: {0}", options.EnsureRevision);
                Console.WriteLine("Path to project file: {0}", options.ScProjFilePath);
                Console.WriteLine("DacPac Output: {0}", options.DacPac);

                string version = Guid.NewGuid().ToString();
                SanitizeOptions(options);

                if (ExclusionHandler.HasValidExclusions(options.Configuration, options.ScProjFilePath))
                {
                    var exclusions = ExclusionHandler.GetExcludedItems(options.ScProjFilePath, options.Configuration);

                    ExclusionHandler.RemoveExcludedItems(options.Source, exclusions);
                    ExclusionHandler.RemoveExcludedItems(options.Target, exclusions);
                }

                RainbowSerializationProvider.Enabled        = options.UseRainbow;
                RainbowSerializationProvider.IncludeFiles   = options.IncludeFiles;
                RainbowSerializationProvider.EnsureRevision = options.EnsureRevision;

                var commands = DiffGenerator.GetDiffCommands(options.Source, options.Target, options.IncludeSecurity, version, options.CollisionBehavior);

                var diff = new DiffInfo(
                    commands,
                    "Sitecore Courier Package",
                    string.Empty,
                    string.Format("Diff between serialization folders '{0}' and '{1}'.", options.Source, options.Target));

                if (options.IncludeSecurity)
                {
                    var currentDirectory = Directory.GetCurrentDirectory();
                    commands.Add(new PostStepFileSystemDataItem(currentDirectory, string.Empty, PostDeployDll)
                                 .GenerateAddCommand().FirstOrDefault());
                    diff.PostStep = PostStep;
                    diff.Version  = version;
                }

                if (options.DacPac)
                {
                    SqlConverter c = new SqlConverter();
                    c.ConvertPackage(diff, options.Output);

                    var           builder = new DacPacBuilder();
                    DirectoryInfo d       = new DirectoryInfo(options.Output);
                    foreach (var file in d.GetFiles("*.sql"))
                    {
                        builder.ConvertToDacPac(file.FullName, Path.Combine(file.DirectoryName, $"{Path.GetFileNameWithoutExtension(file.Name)}.dacpac"));
                    }
                }
                else
                {
                    PackageGenerator.GeneratePackage(diff, string.Empty, options.Output);
                }
            }
            else
            {
                Console.WriteLine(options.GetUsage());
            }
        }
        public void ChangedUnicornSerializationNameAndDeletionTest()
        {
            //Source dataset, a template with 2 fields. Serialized to a unicorn setting named Unicorn1
            var sourceItems = new List <IDataItem>();

            sourceItems.Add(new QuickContentDataItem("C:\\Source", "Unicorn1", "Template 1.yml",
                                                     new SyncItem()
            {
                ID         = "2a54b494-68fe-44f6-85d9-88a3b57cf689",
                TemplateID = "ab86861a-6030-46c5-b394-e8f99e8b87db",
                ParentID   = "3C1715FE-6A13-4FCF-845F-DE308BA9741D",
                ItemPath   = "/sitecore/Templates/Template 1"
            }, true));
            sourceItems.Add(new QuickContentDataItem("C:\\Source", "Unicorn1\\Template 1", "Section 1.yml",
                                                     new SyncItem()
            {
                ID         = "79a314b1-82ad-4733-bb82-92cc62306c31",
                TemplateID = "e269fbb5-3750-427a-9149-7aa950b49301",
                ParentID   = "2a54b494-68fe-44f6-85d9-88a3b57cf689",
                ItemPath   = "/sitecore/Templates/Template 1/Section 1"
            }, true));
            sourceItems.Add(new QuickContentDataItem("C:\\Source", "Unicorn1\\Template 1\\Section 1", "Field1.yml",
                                                     new SyncItem()
            {
                ID         = "dcfcf4d9-6fed-4f16-a8a3-acf22188dd74",
                TemplateID = "455a3e98-a627-4b40-8035-e683a0331ac7",
                ParentID   = "79a314b1-82ad-4733-bb82-92cc62306c31",
                ItemPath   = "/sitecore/Templates/Template 1/Section 1/Field1"
            }, true));
            sourceItems.Add(new QuickContentDataItem("C:\\Source", "Unicorn1\\Template 1\\Section 1", "Field2.yml",
                                                     new SyncItem()
            {
                ID         = "dcfcf4d9-6fed-4f16-a8a3-acf22188dd73",
                TemplateID = "455a3e98-a627-4b40-8035-e683a0331ac7",
                ParentID   = "79a314b1-82ad-4733-bb82-92cc62306c31",
                ItemPath   = "/sitecore/Templates/Template 1/Section 1/Field2"
            }, true));

            //Target dataset, same template, 1 field removed. Serialized to a unicorn setting named Unicorn2
            var targetItems = new List <IDataItem>();

            targetItems.Add(new QuickContentDataItem("C:\\Target", "Unicorn2", "Template 1.yml",
                                                     new SyncItem()
            {
                ID         = "2a54b494-68fe-44f6-85d9-88a3b57cf689",
                TemplateID = "ab86861a-6030-46c5-b394-e8f99e8b87db",
                ParentID   = "3C1715FE-6A13-4FCF-845F-DE308BA9741D",
                ItemPath   = "/sitecore/Templates/Template 1"
            }, true));
            targetItems.Add(new QuickContentDataItem("C:\\Target", "Unicorn2\\Template 1", "Section 1.yml",
                                                     new SyncItem()
            {
                ID         = "79a314b1-82ad-4733-bb82-92cc62306c31",
                TemplateID = "e269fbb5-3750-427a-9149-7aa950b49301",
                ParentID   = "2a54b494-68fe-44f6-85d9-88a3b57cf689",
                ItemPath   = "/sitecore/Templates/Template 1/Section 1"
            }, true));
            targetItems.Add(new QuickContentDataItem("C:\\Target", "Unicorn2\\Template 1\\Section 1", "Field1.yml",
                                                     new SyncItem()
            {
                ID         = "dcfcf4d9-6fed-4f16-a8a3-acf22188dd74",
                TemplateID = "455a3e98-a627-4b40-8035-e683a0331ac7",
                ParentID   = "79a314b1-82ad-4733-bb82-92cc62306c31",
                ItemPath   = "/sitecore/Templates/Template 1/Section 1/Field1"
            }, true));

            var sourceDataIterator = new TestDataIterator(sourceItems);
            var targetDataIterator = new TestDataIterator(targetItems);

            var engineMock = new Mock <DataEngine>(null, null, new List <ICommandFilter>());

            // Act
            var commands = DiffGenerator.GetDiffCommands(new HashSet <string>(targetItems.Select(x => (x as QuickContentDataItem).ItemID)), CollisionBehavior.Force, sourceDataIterator, targetDataIterator, engineMock.Object);

            //Assert
            Assert.AreEqual(1, commands.Count);
            Assert.AreEqual(1, commands.Count(x => x is DeleteItemCommand));
        }