示例#1
0
        public bool RunMerge(AnkhMergeArgs args)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            if (args == null)
            {
                throw new ArgumentNullException("args");
            }
            else if (!HasMerge)
            {
                throw new InvalidOperationException();
            }

            if (_ormw == null)
            {
                _ormw = GetInterfaceDelegate <OpenAndRegisterMergeWindow>(_type_IVsFileMergeService, _vsFileMergeService);
                _umw  = GetInterfaceDelegate <UnregisterMergeWindow>(_type_IVsFileMergeService, _vsFileMergeService);
                _qmws = GetInterfaceDelegate <QueryMergeWindowState>(_type_IVsFileMergeService, _vsFileMergeService);
            }

            if (_ormw == null || _umw == null || _qmws == null)
            {
                return(false);
            }

            int cookie;

            IVsWindowFrame frame = _ormw(args.TheirsFile, args.MineFile, args.BaseFile, args.MergedFile,
                                         Path.GetFileName(args.TheirsFile), Path.GetFileName(args.MineFile),
                                         Path.GetFileName(args.BaseFile), Path.GetFileName(args.MergedFile),
                                         args.TheirsTitle, args.MineTitle, args.BaseTitle, args.MergedTitle,
                                         Guid.Empty.ToString(), null, null, out cookie);

            if (frame != null)
            {
                GC.KeepAlive(new DiffMergeInstance(this, frame, _umw, _qmws, cookie));

                if (!args.ShowDiffAsDocument)
                {
                    frame.SetProperty((int)__VSFPROPID.VSFPROPID_FrameMode, (int)VSFRAMEMODE.VSFM_Float);
                }

                return(true);
            }

            return(false);
        }
示例#2
0
        private void HandleConflictWithExternalMergeTool(SvnConflictEventArgs e)
        {
            IAnkhDiffHandler handler = GetService<IAnkhDiffHandler>();
            if (handler == null)
            {
                HandleConflictWithDialog(e);
            }
            else
            {
                AnkhMergeArgs ama = new AnkhMergeArgs();
                // Ensure paths are in valid format or the DiffToolMonitor constructor
                // throws argument exception validatig the file path to be monitored.
                ama.BaseFile = SvnTools.GetNormalizedFullPath(e.BaseFile);
                ama.TheirsFile = SvnTools.GetNormalizedFullPath(e.TheirFile);
                ama.MineFile = SvnTools.GetNormalizedFullPath(e.MyFile);
                ama.MergedFile = SvnTools.GetNormalizedFullPath(e.MergedFile);
                ama.Mode = DiffMode.PreferExternal;
                ama.BaseTitle = "Base";
                ama.TheirsTitle = "Theirs";
                ama.MineTitle = "Mine";
                ama.MergedTitle = new System.IO.FileInfo(e.Path).Name;
                bool merged = handler.RunMerge(ama);       
                if (merged)
                {
                    IUIService ui = Context.GetService<IUIService>();
                    string message = "Did you resolve all of the conflicts in the file?\n\nAnswering yes marks this file as resolved, no will keep it as conflicted.";
                    string caption = "Resolve Conflict";
                    DialogResult result = ui.ShowMessage(message, caption, MessageBoxButtons.YesNoCancel);
                    e.Cancel = result == DialogResult.Cancel;

                    if(!e.Cancel)
                        merged = result == DialogResult.Yes;
                }
                if (!merged)
                {
                    //Restore original merged file.
                    HandleConflictWithDialog(e);
                }
                else
                {
                    e.Choice = SvnAccept.Merged;
                }
            }
        }
示例#3
0
            public Replacer(AnkhDiff context, AnkhDiffToolArgs args, DiffToolMode toolMode)
                : base(context)
            {
                if (context == null)
                {
                    throw new ArgumentNullException("context");
                }
                else if (args == null)
                {
                    throw new ArgumentNullException("args");
                }

                _diff      = context;
                _toolArgs  = args;
                _diffArgs  = args as AnkhDiffArgs;
                _mergeArgs = args as AnkhMergeArgs;
                _patchArgs = args as AnkhPatchArgs;
                _toolMode  = toolMode;
            }
示例#4
0
        public bool RunMerge(AnkhMergeArgs args)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }
            else if (!args.Validate())
            {
                throw new ArgumentException("Arguments not filled correctly", "args");
            }

            SetFloat(args);

            string mergeApp = this.GetMergePath(args.Mode, args.MineFile);

            if (string.IsNullOrEmpty(mergeApp))
            {
                IAnkhInternalDiff internalDiff = GetService <IAnkhInternalDiff>();

                if (internalDiff != null && internalDiff.HasMerge)
                {
                    return(internalDiff.RunMerge(args));
                }
            }

            if (string.IsNullOrEmpty(mergeApp))
            {
                new AnkhMessageBox(Context).Show("Please specify a merge tool in Tools->Options->SourceControl->Subversion", "AnkhSVN - No visual merge tool is available");

                return(false);
            }

            string program;
            string arguments;

            if (!Substitute(mergeApp, args, DiffToolMode.Merge, out program, out arguments) ||
                !File.Exists(program))
            {
                new AnkhMessageBox(Context).Show(string.Format("Can't find merge program '{0}'", program ?? mergeApp));
                return(false);
            }

            Process p = new Process();

            p.StartInfo = new ProcessStartInfo(program, arguments);

            string mergedFile = args.MergedFile;

            DiffToolMonitor monitor = null;

            if (!string.IsNullOrEmpty(mergedFile))
            {
                monitor = new DiffToolMonitor(Context, mergedFile, false, args.GetMergedExitCodes());

                p.EnableRaisingEvents = true;
                monitor.Register(p);
            }

            bool started = false;

            try
            {
                return(started = p.Start());
            }
            finally
            {
                if (!started)
                {
                    if (monitor != null)
                    {
                        monitor.Dispose();
                    }
                }
            }
        }
示例#5
0
        public override void OnExecute(CommandEventArgs e)
        {
            // TODO: Choose which conflict to edit if we have more than one!
            SvnItem conflict = null;

            if (e.Command == AnkhCommand.DocumentConflictEdit)
            {
                conflict = e.Selection.ActiveDocumentSvnItem;

                if (conflict == null || !conflict.IsConflicted)
                {
                    return;
                }
            }
            else
            {
                foreach (SvnItem item in e.Selection.GetSelectedSvnItems(false))
                {
                    if (item.IsConflicted)
                    {
                        conflict = item;
                        break;
                    }
                }
            }

            if (conflict == null)
            {
                return;
            }

            conflict.MarkDirty();
            if (conflict.Status.LocalTextStatus != SvnStatus.Conflicted)
            {
                AnkhMessageBox mb = new AnkhMessageBox(e.Context);

                mb.Show(string.Format(CommandStrings.TheConflictInXIsAlreadyResolved, conflict.FullPath), CommandStrings.EditConflictTitle,
                        System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);
                return;
            }

            SvnInfoEventArgs conflictInfo = null;

            bool ok = false;
            ProgressRunnerResult r = e.GetService <IProgressRunner>().RunModal(CommandStrings.RetrievingConflictDetails,
                                                                               delegate(object sender, ProgressWorkerArgs a)
            {
                ok = a.Client.GetInfo(conflict.FullPath, out conflictInfo);
            });

            if (!ok || !r.Succeeded || conflictInfo == null)
            {
                return;
            }

            AnkhMergeArgs da  = new AnkhMergeArgs();
            string        dir = conflict.Directory;

            da.BaseFile   = Path.Combine(dir, conflictInfo.ConflictOld ?? conflictInfo.ConflictNew);
            da.TheirsFile = Path.Combine(dir, conflictInfo.ConflictNew ?? conflictInfo.ConflictOld);

            if (!string.IsNullOrEmpty(conflictInfo.ConflictWork))
            {
                da.MineFile = Path.Combine(dir, conflictInfo.ConflictWork);
            }
            else
            {
                da.MineFile = conflict.FullPath;
            }

            da.MergedFile = conflict.FullPath;

            da.BaseTitle   = "Base";
            da.TheirsTitle = "Theirs";
            da.MineTitle   = "Mine";
            da.MergedTitle = conflict.Name;


            e.GetService <IAnkhDiffHandler>().RunMerge(da);
        }
示例#6
0
 public bool RunMerge(AnkhMergeArgs args)
 {
     throw new NotImplementedException();
 }