public override Annotation[] GetAnnotations(Repository repo, FilePath file, SvnRevision revStart, SvnRevision revEnd) { if (file == FilePath.Null) { throw new ArgumentNullException(); } var target = new SvnPathTarget(file, SharpSvn.SvnRevision.Base); int numAnnotations = 0; using (var data = new MemoryStream()) { lock (client) client.Write(target, data); using (var reader = new StreamReader(data)) { reader.BaseStream.Seek(0, SeekOrigin.Begin); while (reader.ReadLine() != null) { numAnnotations++; } } } System.Collections.ObjectModel.Collection <SvnBlameEventArgs> list; var args = new SvnBlameArgs { Start = GetRevision(revStart), End = GetRevision(revEnd), }; bool success; lock (client) { success = client.GetBlame(target, args, out list); } if (success) { var annotations = new Annotation [numAnnotations]; foreach (var annotation in list) { if (annotation.LineNumber < annotations.Length) { annotations [(int)annotation.LineNumber] = new Annotation(annotation.Revision.ToString(), annotation.Author, annotation.Time); } } return(annotations); } return(new Annotation[0]); }
public void Blame_BlameBasic() { SvnSandBox sbox = new SvnSandBox(this); sbox.Create(SandBoxRepository.AnkhSvnCases); string WcPath = sbox.Wc; string path = Path.Combine(WcPath, "Form.cs"); string blame = this.RunCommand("svn", "blame -v " + path); Blame[] cmdline = this.ParseCommandLineBlame(blame); SvnBlameArgs a = new SvnBlameArgs(); Assert.That(this.Client.Blame(path, a, this.Receiver)); Assert.That(this.blames.Count, Is.EqualTo(cmdline.Length)); for (int i = 0; i < cmdline.Length; i++) { Blame.CheckEqual(cmdline[i], (Blame)this.blames[i]); } }
public void Blame_WithEmptyEntries() { SvnSandBox sbox = new SvnSandBox(this); sbox.Create(SandBoxRepository.AnkhSvnCases); string WcPath = sbox.Wc; string path = Path.Combine(WcPath, "Form.cs"); SvnBlameArgs a = new SvnBlameArgs(); a.Start = SvnRevision.Head; a.End = SvnRevision.Head; // this won't give any results - verify that there are no exceptions Assert.That(this.Client.Blame(path, a, this.Receiver)); Blame[] b = (Blame[])this.blames.ToArray(typeof(Blame)); Assert.That(b[0].Revision, Is.EqualTo(-1)); Assert.That(b[0].Author, Is.EqualTo(null)); Assert.That(b[0].Date, Is.EqualTo(DateTime.MinValue)); }
public void Blame_TestMore() { SvnSandBox sbox = new SvnSandBox(this); string reposPath = sbox.CreateRepository(SandBoxRepository.MergeScenario).AbsolutePath; Uri reposUri = SvnTools.LocalPathToUri(reposPath, true); Uri uri = new Uri(reposUri, "trunk/index.html"); int n = 0; SvnBlameArgs ba = new SvnBlameArgs(); ba.Notify += delegate(object sender, SvnNotifyEventArgs e) { Assert.That(e.Uri, Is.EqualTo(uri)); Assert.That(e.RevisionProperties, Is.Not.Null); n++; }; int lines = 0; Client.Blame(uri, ba, delegate(object sender, SvnBlameEventArgs e) { Assert.That(e.Author, Is.Not.Null); Assert.That(e.RevisionProperties, Is.Not.Null); Assert.That(e.RevisionProperties.Contains(SvnPropertyNames.SvnAuthor)); Assert.That(e.RevisionProperties.Contains(SvnPropertyNames.SvnLog)); Assert.That(e.RevisionProperties[SvnPropertyNames.SvnAuthor].StringValue, Is.Not.Null); Assert.That(e.RevisionProperties[SvnPropertyNames.SvnLog].StringValue, Is.Not.Null); Assert.That(e.MergedAuthor, Is.Null); Assert.That(e.MergedRevisionProperties, Is.Null); lines++; }); Assert.That(n, Is.EqualTo(3)); Assert.That(lines, Is.EqualTo(32)); }
public override Annotation[] GetAnnotations (Repository repo, FilePath file, SvnRevision revStart, SvnRevision revEnd) { if (file == FilePath.Null) throw new ArgumentNullException (); SvnPathTarget target = new SvnPathTarget (file, SharpSvn.SvnRevision.Base); MemoryStream data = new MemoryStream (); int numAnnotations = 0; client.Write (target, data); using (StreamReader reader = new StreamReader (data)) { reader.BaseStream.Seek (0, SeekOrigin.Begin); while (reader.ReadLine () != null) numAnnotations++; } System.Collections.ObjectModel.Collection<SvnBlameEventArgs> list; SvnBlameArgs args = new SvnBlameArgs (); args.Start = GetRevision (revStart); args.End = GetRevision (revEnd); if (client.GetBlame (target, args, out list)) { Annotation[] annotations = new Annotation [numAnnotations]; foreach (var annotation in list) { if (annotation.LineNumber < annotations.Length) annotations [(int)annotation.LineNumber] = new Annotation (annotation.Revision.ToString (), annotation.Author, annotation.Time); } return annotations; } return new Annotation[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); }
/*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); } } } }
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; Dictionary<long, string> logMessages = new Dictionary<long, string>(); ba.Notify += delegate(object sender, SvnNotifyEventArgs ee) { if (ee.Action == SvnNotifyAction.BlameRevision && ee.RevisionProperties != null) { if (ee.RevisionProperties.Contains(SvnPropertyNames.SvnLog)) logMessages[ee.Revision] = ee.RevisionProperties[SvnPropertyNames.SvnLog].StringValue; } }; 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)) { 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, logMessages); // 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); } } } }