Beispiel #1
0
        public override void OnExecute(CommandEventArgs e)
        {
            List <string>  toAdd = new List <string>();
            List <SvnItem> items = new List <SvnItem>();

            foreach (SvnItem item in e.Selection.GetSelectedSvnItems(true))
            {
                if (item.IsVersioned)
                {
                    items.Add(item);
                }
                else if (item.IsFile && item.IsVersionable && item.InSolution && !item.IsIgnored && !item.IsSccExcluded)
                {
                    toAdd.Add(item.FullPath); // Add new files  ### Alternative: Show them as added
                    items.Add(item);
                }
            }

            if (items.Count == 0)
            {
                return;
            }

            SvnRevision start = SvnRevision.Base;
            SvnRevision end   = SvnRevision.Working;

            // should we show the path selector?
            if (e.ShouldPrompt(true))
            {
                using (CommonFileSelectorDialog dlg = new CommonFileSelectorDialog())
                {
                    dlg.Text          = CommandStrings.UnifiedDiffTitle;
                    dlg.Items         = items;
                    dlg.RevisionStart = start;
                    dlg.RevisionEnd   = end;

                    if (dlg.ShowDialog(e.Context) != DialogResult.OK)
                    {
                        return;
                    }

                    items.Clear();
                    items.AddRange(dlg.GetCheckedItems());
                    start = dlg.RevisionStart;
                    end   = dlg.RevisionEnd;
                }
            }

            if (items.Count == 0)
            {
                return;
            }

            SvnRevisionRange revRange = new SvnRevisionRange(start, end);

            IAnkhTempFileManager tempfiles = e.GetService <IAnkhTempFileManager>();
            string tempFile = tempfiles.GetTempFile(".patch");

            IAnkhSolutionSettings ss = e.GetService <IAnkhSolutionSettings>();
            string slndir            = ss.ProjectRoot;

            using (MemoryStream stream = new MemoryStream())
            {
                e.Context.GetService <IProgressRunner>().RunModal(CommandStrings.RunningDiff,
                                                                  delegate(object sender, ProgressWorkerArgs ee)
                {
                    SvnAddArgs aa   = new SvnAddArgs();
                    aa.ThrowOnError = false;
                    aa.AddParents   = false;
                    foreach (string item in toAdd)
                    {
                        ee.Client.Add(item, aa);
                    }

                    SvnDiffArgs diffArgs    = new SvnDiffArgs();
                    diffArgs.IgnoreAncestry = true;
                    diffArgs.NoDeleted      = false;
                    diffArgs.ThrowOnError   = false;

                    foreach (SvnItem item in items)
                    {
                        SvnWorkingCopy wc;
                        if (!string.IsNullOrEmpty(slndir) && item.IsBelowPath(slndir))
                        {
                            diffArgs.RelativeToPath = slndir;
                        }
                        else if ((wc = item.WorkingCopy) != null)
                        {
                            diffArgs.RelativeToPath = wc.FullPath;
                        }
                        else
                        {
                            diffArgs.RelativeToPath = null;
                        }

                        if (!ee.Client.Diff(item.FullPath, revRange, diffArgs, stream))
                        {
                            if (diffArgs.LastException != null)
                            {
                                StreamWriter sw = new StreamWriter(stream);
                                sw.WriteLine();
                                sw.WriteLine(string.Format("# {0}: {1}", item.FullPath, diffArgs.LastException.Message));
                                sw.Flush();
                                // Don't dispose the writer as that might close the stream
                            }

                            if (diffArgs.IsLastInvocationCanceled)
                            {
                                break;
                            }
                        }
                    }

                    stream.Flush();
                });

                stream.Position = 0;
                using (StreamReader sr = new StreamReader(stream))
                {
                    File.WriteAllText(tempFile, sr.ReadToEnd(), Encoding.UTF8);
                    VsShellUtilities.OpenDocument(e.Context, tempFile);
                }
            }
        }
Beispiel #2
0
        public void DoBlame(CommandEventArgs e,
                            SvnOrigin origin,
                            SvnRevision revisionStart,
                            SvnRevision revisionEnd,
                            bool ignoreEols,
                            SvnIgnoreSpacing ignoreSpacing,
                            bool retrieveMergeInfo)
        {
            // There are two SVN related operations:
            // [1] Getting the file at revisionEnd, which will be displayed in the editor
            // [2] Getting the blame information, which will be displayed in the margin

            // This is the parameter structure for [1] getting the file
            SvnWriteArgs wa = new SvnWriteArgs();

            wa.Revision = revisionEnd;

            // This is the parameter structure for [2] getting the blame information
            SvnBlameArgs ba = new SvnBlameArgs();

            ba.Start                   = revisionStart;
            ba.End                     = revisionEnd;
            ba.IgnoreLineEndings       = ignoreEols;
            ba.IgnoreSpacing           = ignoreSpacing;
            ba.RetrieveMergedRevisions = retrieveMergeInfo;

            SvnTarget target = origin.Target;

            // Can we make this an MEF service?
            IAnkhTempFileManager tempMgr = e.GetService <IAnkhTempFileManager>();
            string tempFile = tempMgr.GetTempFileNamed(target.FileName);

            Collection <SvnBlameEventArgs> blameResult = null;

            bool retry             = false;
            ProgressRunnerResult r = e.GetService <IProgressRunner>().RunModal("Annotating", delegate(object sender, ProgressWorkerArgs ee)
            {
                // Here we [1] get the file at revisionEnd
                using (FileStream fs = File.Create(tempFile))
                {
                    ee.Client.Write(target, fs, wa);
                }

                // Here we [2] get the blame information
                ba.SvnError +=
                    delegate(object errorSender, SvnErrorEventArgs errorEventArgs)
                {
                    if (errorEventArgs.Exception is SvnClientBinaryFileException)
                    {
                        retry = true;
                        errorEventArgs.Cancel = true;
                    }
                };
                ee.Client.GetBlame(target, ba, out blameResult);
            });

            if (retry)
            {
                using (AnkhMessageBox mb = new AnkhMessageBox(e.Context))
                {
                    // Move to resources later :)
                    if (DialogResult.Yes != mb.Show("You are trying to annotate a binary file. Are you sure you want to continue?",
                                                    "Binary file detected",
                                                    MessageBoxButtons.YesNo, MessageBoxIcon.Information))
                    {
                        return;
                    }

                    r = e.GetService <IProgressRunner>()
                        .RunModal("Annotating",
                                  delegate(object sender, ProgressWorkerArgs ee)
                    {
                        ba.IgnoreMimeType = true;
                        ee.Client.GetBlame(target, ba, out blameResult);
                    });
                }
            }

            if (!r.Succeeded)
            {
                return;
            }

            // Create a parameter struture and add it to our internal map.
            // Creating the actual view model class is now deferred to the GetModel method.
            var annParam = new AnnotateMarginParameters {
                Context = e.Context, Origin = origin, BlameResult = blameResult
            };

            _ViewModelMap.Add(tempFile, annParam);

            // Open the editor.
            // ToDo: Open files like resx as code.
            var dte = e.GetService <DTE> (typeof(SDTE));

            dte.ItemOperations.OpenFile(tempFile, EnvDTE.Constants.vsViewKindTextView);
        }
Beispiel #3
0
        /*private void TryObtainBlock(CommandEventArgs e)
         * {
         *  ISelectionContextEx ex = e.GetService<ISelectionContextEx>(typeof(ISelectionContext));
         *
         *  if (ex == null)
         *      return;
         *
         *  IVsTextView view = ex.ActiveDocumentFrameTextView;
         *  IVsTextLines lines;
         *  Guid languageService;
         *  IVsLanguageInfo info;
         *
         *  if (view != null
         *      && VSErr.Succeeded(view.GetBuffer(out lines))
         *      && VSErr.Succeeded(lines.GetLanguageServiceID(out languageService))
         *      && null != (info = e.QueryService<IVsLanguageInfo>(languageService)))
         *  {
         *      GC.KeepAlive(info);
         *      IVsLanguageBlock b = info as IVsLanguageBlock;
         *      if (b != null)
         *      {
         *          GC.KeepAlive(b);
         *      }
         *  }
         *  //IVsLanguageBlock
         *
         *
         *  GC.KeepAlive(ex);
         * }*/

        static void DoBlame(CommandEventArgs e, SvnOrigin item, SvnRevision revisionStart, SvnRevision revisionEnd, bool ignoreEols, SvnIgnoreSpacing ignoreSpacing, bool retrieveMergeInfo)
        {
            SvnWriteArgs wa = new SvnWriteArgs();

            wa.Revision = revisionEnd;

            SvnBlameArgs ba = new SvnBlameArgs();

            ba.Start                   = revisionStart;
            ba.End                     = revisionEnd;
            ba.IgnoreLineEndings       = ignoreEols;
            ba.IgnoreSpacing           = ignoreSpacing;
            ba.RetrieveMergedRevisions = retrieveMergeInfo;

            SvnTarget target = item.Target;

            IAnkhTempFileManager tempMgr = e.GetService <IAnkhTempFileManager>();
            string tempFile = tempMgr.GetTempFileNamed(target.FileName);

            Collection <SvnBlameEventArgs> blameResult = null;

            bool retry             = false;
            ProgressRunnerResult r = e.GetService <IProgressRunner>().RunModal(CommandStrings.Annotating, delegate(object sender, ProgressWorkerArgs ee)
            {
                using (FileStream fs = File.Create(tempFile))
                {
                    ee.Client.Write(target, fs, wa);
                }

                ba.SvnError +=
                    delegate(object errorSender, SvnErrorEventArgs errorEventArgs)
                {
                    if (errorEventArgs.Exception is SvnClientBinaryFileException)
                    {
                        retry = true;
                        errorEventArgs.Cancel = true;
                    }
                };
                ee.Client.GetBlame(target, ba, out blameResult);
            });

            if (retry)
            {
                using (AnkhMessageBox mb = new AnkhMessageBox(e.Context))
                {
                    if (DialogResult.Yes != mb.Show(
                            CommandStrings.AnnotateBinaryFileContinueAnywayText,
                            CommandStrings.AnnotateBinaryFileContinueAnywayTitle,
                            MessageBoxButtons.YesNo, MessageBoxIcon.Information))
                    {
                        return;
                    }

                    r = e.GetService <IProgressRunner>()
                        .RunModal(CommandStrings.Annotating,
                                  delegate(object sender, ProgressWorkerArgs ee)
                    {
                        ba.IgnoreMimeType = true;
                        ee.Client.GetBlame(target, ba, out blameResult);
                    });
                }
            }

            if (!r.Succeeded)
            {
                return;
            }

            AnnotateEditorControl annEditor = new AnnotateEditorControl();
            IAnkhEditorResolver   er        = e.GetService <IAnkhEditorResolver>();

            annEditor.Create(e.Context, tempFile);
            annEditor.LoadFile(tempFile);
            annEditor.AddLines(item, blameResult);

            // Detect and set the language service
            Guid language;

            if (er.TryGetLanguageService(Path.GetExtension(target.FileName), out language))
            {
                // Extension is mapped -> user
                annEditor.SetLanguageService(language);
            }
            else if (blameResult != null && blameResult.Count > 0 && blameResult[0].Line != null)
            {
                // Extension is not mapped -> Check if this is xml (like project files)
                string line = blameResult[0].Line.Trim();

                if (line.StartsWith("<?xml") ||
                    (line.StartsWith("<") && line.Contains("xmlns=\"http://schemas.microsoft.com/developer/msbuild/")))
                {
                    if (er.TryGetLanguageService(".xml", out language))
                    {
                        annEditor.SetLanguageService(language);
                    }
                }
            }
        }