Example #1
0
        public void TestBothEmptySources()
        {
            var diffEngine = new MyersDiffEngine();
            var operations = diffEngine.GetDiff(null, null);

            Assert.IsNull(operations);
        }
Example #2
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();
        }