static void DoBlame(CommandEventArgs e, GitOrigin item, GitRevision revisionEnd, GitIgnoreSpacing ignoreSpacing) { GitWriteArgs wa = new GitWriteArgs(); wa.Revision = revisionEnd; GitBlameArgs ba = new GitBlameArgs(); ba.End = revisionEnd; ba.IgnoreSpacing = ignoreSpacing; GitTarget target = item.Target; IVisualGitTempFileManager tempMgr = e.GetService<IVisualGitTempFileManager>(); string tempFile = tempMgr.GetTempFileNamed(target.FileName); Collection<GitBlameEventArgs> blameResult = null; Dictionary<string, string> logMessages = new Dictionary<string, string>(); 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); } try { ee.Client.GetBlame(target, ba, out blameResult); } catch (GitClientBinaryFileException) { retry = true; } }); if (retry) { using (VisualGitMessageBox mb = new VisualGitMessageBox(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) { ee.Client.GetBlame(target, ba, out blameResult); }); } } } if (!r.Succeeded) return; AnnotateEditorControl annEditor = new AnnotateEditorControl(); IVisualGitEditorResolver er = e.GetService<IVisualGitEditorResolver>(); 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); } } } }
public string GetTempFile(GitTarget target, GitRevision revision, bool withProgress) { if (target == null) throw new ArgumentNullException("target"); else if (revision == null) throw new ArgumentNullException("revision"); string file = GetTempPath(target.FileName, revision); bool unrelated = false; ProgressRunnerResult r = GetService<IProgressRunner>().RunModal("Getting file", delegate(object sender, ProgressWorkerArgs aa) { GitWriteArgs wa = new GitWriteArgs(); wa.Revision = revision; using (Stream s = File.Create(file)) aa.Client.Write(target, s, wa); }); if (!r.Succeeded || unrelated) return null; // User canceled if (File.Exists(file)) File.SetAttributes(file, FileAttributes.ReadOnly); // A readonly file does not allow editting from many diff tools return file; }