Example #1
0
        public void TestAutomerge()
        {
            var source  = new StringSource("ABCABBA");
            var target1 = new StringSource("CBABAC");
            var target2 = new StringSource("ABCABBAD");

            var finalControl = new List <Operation>
            {
                new Operation(OperationKind.Delete, 0, source),
                new Operation(OperationKind.Delete, 1, source),
                new Operation(OperationKind.Equal, 2, source),
                new Operation(OperationKind.Insert, 1, target1),
                new Operation(OperationKind.Equal, 3, source),
                new Operation(OperationKind.Equal, 4, source),
                new Operation(OperationKind.Delete, 5, source),
                new Operation(OperationKind.Insert, 7, target2),
                new Operation(OperationKind.Insert, 5, target1)
            };

            var sourceTarget1 = this.m_diffEngine.GetDiff(source, target1);
            var sourceTarget2 = this.m_diffEngine.GetDiff(source, target2);

            Assert.IsNotNull(sourceTarget1);
            Assert.IsNotNull(sourceTarget2);

            var merge = new MergeEngine(ResolveStrategyAction.AcceptFirst, false);
            var final = merge.GetMergeOperations(sourceTarget1.ToList(), sourceTarget2.ToList()).ToList();

            Assert.IsNotNull(final);

            var equal = finalControl.Count == final.Count;

            Assert.IsTrue(equal);

            for (var i = 0; i < finalControl.Count; i++)
            {
                var op = final[i];
                Assert.IsTrue(op != null && Equals(op, finalControl[i]));
            }
        }
Example #2
0
        public void TestAutomergeAcceptFirstConflict()
        {
            var source  = new StringSource("ABC");
            var target1 = new StringSource("ABD");
            var target2 = new StringSource("ABR");

            var finalControl = new List <Operation>
            {
                new Operation(OperationKind.Equal, 0, source),
                new Operation(OperationKind.Equal, 1, source),
                new Operation(OperationKind.Delete, 2, source),
                new Operation(OperationKind.Insert, 2, target1, true),
            };

            var sourceTarget1 = this.m_diffEngine.GetDiff(source, target1);
            var sourceTarget2 = this.m_diffEngine.GetDiff(source, target2);

            Assert.IsNotNull(sourceTarget1);
            Assert.IsNotNull(sourceTarget2);

            var merge = new MergeEngine(ResolveStrategyAction.AcceptFirst, true);

            merge.ConflictOperationsResolveStrategies.Add(OperationKind.Equal, new ResolveStrategy(ResolveStrategyAction.AcceptFirst, false));
            merge.ConflictOperationsResolveStrategies.Add(OperationKind.Delete, new ResolveStrategy(ResolveStrategyAction.AcceptFirst, false));

            var final = merge.GetMergeOperations(sourceTarget1.ToList(), sourceTarget2.ToList()).ToList();

            Assert.IsNotNull(final);

            var equal = finalControl.Count == final.Count;

            Assert.IsTrue(equal);

            for (var i = 0; i < finalControl.Count; i++)
            {
                var op = final[i];
                Assert.IsTrue(op != null && Equals(op, finalControl[i]));
            }
        }
Example #3
0
        private static void Main(string[] args)
        {
            if (args == null ||
                args.Length == 0 ||
                (args.Length != 4 && args.Length != 5) ||
                args.Any(string.IsNullOrEmpty))
            {
                PrintUsage();
                return;
            }

            var operation = args[0]?.Replace("-", string.Empty).ToUpperInvariant();

            if (string.IsNullOrEmpty(operation))
            {
                PrintUsage();
                return;
            }
            var     outToConsole = args.Length == 4;
            ISource source       = null,
                    target1      = null,
                    target2      = null;

            switch (Array.IndexOf(m_operations, operation))
            {
            case 0:
                source  = new StringSource(args[1]);
                target1 = new StringSource(args[2]);
                target2 = new StringSource(args[3]);
                break;

            case 1:
                try
                {
                    source  = new TextFileSource(args[1]);
                    target1 = new TextFileSource(args[2]);
                    target2 = new TextFileSource(args[3]);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Во время загрузки файлов произошла ошибка:");
                    Console.WriteLine(ex.Message);
                    PrintUsage();
                    return;
                }

                break;

            default:
                PrintUsage();
                break;
            }
            var diffEngine  = new MyersDiffEngine();
            var operations1 = diffEngine.GetDiff(source, target1);
            var operations2 = diffEngine.GetDiff(source, target2);

            var mergeEngine = new MergeEngine(ResolveStrategyAction.AcceptFirst, false);

            mergeEngine.ConflictOperationsResolveStrategies.Add(OperationKind.Insert, new ResolveStrategy(ResolveStrategyAction.AcceptAll, true));
            var final = mergeEngine.GetMergeOperations(operations1.ToList(), operations2.ToList());

            Console.WriteLine("Эталон: {0}", source);
            Console.WriteLine("Первый элемент: {0}", target1);
            Console.WriteLine("Второй элемент: {0}", target2);
            var sb = new StringBuilder();

            foreach (var op in final)
            {
                switch (op.Kind)
                {
                case OperationKind.Equal:
                case OperationKind.Insert:
                default:

                    sb.AppendFormat("{0}{1}", op.IsConflict ? " Конфликт! >" : string.Empty, op.Source[op.Index]);
                    break;

                case OperationKind.Unknown:
                case OperationKind.Delete:
                    break;
                }
            }
            Console.WriteLine();
            Console.WriteLine("---РЕЗУЛЬТАТ---");
            if (outToConsole)
            {
                Console.WriteLine(sb.ToString());
            }
            else
            {
                try
                {
                    using (var wrtr = new StreamWriter(args[4]))
                    {
                        wrtr.Write(sb.ToString());
                        wrtr.Close();
                    }
                    Console.WriteLine("Изменения записаны в файл {0}", args[4]);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Во время записи результата в файл произошла ошибка:");
                    Console.WriteLine(ex.Message);
                    PrintUsage();
                    return;
                }
            }
            Console.WriteLine();
            Console.WriteLine("Нажмите <Enter> для завершения работы...");
            Console.ReadLine();
        }