public override void OnExecute(CommandEventArgs e) { PathSelectorResult result = ShowDialog(e); if (!result.Succeeded) return; GitRevisionRange revRange = new GitRevisionRange(result.RevisionStart, result.RevisionEnd); IVisualGitTempFileManager tempfiles = e.GetService<IVisualGitTempFileManager>(); string tempFile = tempfiles.GetTempFile(".patch"); IVisualGitSolutionSettings ss = e.GetService<IVisualGitSolutionSettings>(); string slndir = ss.ProjectRoot; string slndirP = slndir + "\\"; GitDiffArgs args = new GitDiffArgs(); args.IgnoreAncestry = true; args.NoDeleted = false; args.Depth = result.Depth; using (MemoryStream stream = new MemoryStream()) { e.Context.GetService<IProgressRunner>().RunModal("Diffing", delegate(object sender, ProgressWorkerArgs ee) { foreach (GitItem item in result.Selection) { GitWorkingCopy wc; if (!string.IsNullOrEmpty(slndir) && item.FullPath.StartsWith(slndirP, StringComparison.OrdinalIgnoreCase)) args.RelativeToPath = slndir; else if ((wc = item.WorkingCopy) != null) args.RelativeToPath = wc.FullPath; else args.RelativeToPath = null; ee.Client.Diff(item.FullPath, revRange, args, stream); } stream.Flush(); stream.Position = 0; }); using (StreamReader sr = new StreamReader(stream)) { File.WriteAllText(tempFile, sr.ReadToEnd(), Encoding.UTF8); VsShellUtilities.OpenDocument(e.Context, tempFile); } } }
public bool CreatePatch(IEnumerable<PendingChange> changes, PendingChangeCreatePatchArgs args) { using (PendingCommitState state = new PendingCommitState(Context, changes)) { if (!PreCommit_VerifySingleRoot(state)) // Verify single root 'first' return false; if (!PreCommit_SaveDirty(state)) return false; if (args.AddUnversionedFiles) { if (!PreCommit_AddNewFiles(state)) return false; if (!PreCommit_HandleMissingFiles(state)) return false; } state.FlushState(); if (!PreCommit_AddNeededParents(state)) return false; if (!PreCommit_VerifySingleRoot(state)) // Verify single root 'again' return false; } string relativeToPath = args.RelativeToPath; string relativeToPathP = relativeToPath.EndsWith("\\") ? relativeToPath : (relativeToPath + "\\"); string fileName = args.FileName; GitRevisionRange revRange = new GitRevisionRange(GitRevision.Base, GitRevision.Working); GitDiffArgs a = new GitDiffArgs(); a.IgnoreAncestry = true; a.NoDeleted = false; a.Depth = GitDepth.Empty; using (MemoryStream stream = new MemoryStream()) { GetService<IProgressRunner>().RunModal(PccStrings.DiffTitle, delegate(object sender, ProgressWorkerArgs e) { foreach (PendingChange pc in changes) { GitItem item = pc.GitItem; GitWorkingCopy wc; if (!string.IsNullOrEmpty(relativeToPath) && item.FullPath.StartsWith(relativeToPathP, StringComparison.OrdinalIgnoreCase)) a.RelativeToPath = relativeToPath; else if ((wc = item.WorkingCopy) != null) a.RelativeToPath = wc.FullPath; else a.RelativeToPath = null; e.Client.Diff(item.FullPath, revRange, a, stream); } stream.Flush(); stream.Position = 0; }); using (StreamReader sr = new StreamReader(stream)) { string line; // Parse to lines to resolve EOL issues using (StreamWriter sw = File.CreateText(fileName)) { while (null != (line = sr.ReadLine())) sw.WriteLine(line); } } } return true; }