public void DoCreatePatch(string fileName) { if (string.IsNullOrEmpty(fileName)) { return; } PendingChangeCreatePatchArgs a = new PendingChangeCreatePatchArgs(); a.FileName = fileName; IVisualGitSolutionSettings ss = Context.GetService<IVisualGitSolutionSettings>(); a.RelativeToPath = ss.ProjectRoot; a.AddUnversionedFiles = true; List<PendingChange> changes = new List<PendingChange>(); foreach (PendingCommitItem pci in _listItems.Values) { if (pci.Checked) { changes.Add(pci.PendingChange); } } if (Context.GetService<IPendingChangeHandler>().CreatePatch(changes, a)) { } }
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; }
public override void OnExecute(CommandEventArgs e) { IPendingChangesManager pcm = e.GetService<IPendingChangesManager>(); Dictionary<string, PendingChange> changes = new Dictionary<string, PendingChange>(StringComparer.OrdinalIgnoreCase); foreach (PendingChange pc in pcm.GetAll()) { if (!changes.ContainsKey(pc.FullPath)) changes.Add(pc.FullPath, pc); } Dictionary<string, GitItem> selectedChanges = new Dictionary<string, GitItem>(StringComparer.OrdinalIgnoreCase); foreach (GitItem item in e.Selection.GetSelectedGitItems(true)) { if (changes.ContainsKey(item.FullPath) && !selectedChanges.ContainsKey(item.FullPath)) { selectedChanges.Add(item.FullPath, item); } } Collection<GitItem> resources = new Collection<GitItem>(); List<GitItem> selectedItems = new List<GitItem>(selectedChanges.Values); // TODO: Give the whole list to a refreshable dialog! foreach (GitItem item in selectedItems) { PendingChange pc = changes[item.FullPath]; if (pc.IsChangeForPatching()) continue; resources.Add(item); } if (resources.Count == 0) return; using (PendingChangeSelector pcs = new PendingChangeSelector()) { pcs.Context = e.Context; pcs.Text = CommandStrings.CreatePatchTitle; pcs.PreserveWindowPlacement = true; pcs.LoadItems(e.Selection.GetSelectedGitItems(true)); DialogResult dr = pcs.ShowDialog(e.Context); if (dr != DialogResult.OK) return; string fileName = GetFileName(e.Context.DialogOwner); if (string.IsNullOrEmpty(fileName)) { return; } PendingChangeCreatePatchArgs pca = new PendingChangeCreatePatchArgs(); pca.FileName = fileName; IVisualGitSolutionSettings ss = e.GetService<IVisualGitSolutionSettings>(); pca.RelativeToPath = ss.ProjectRoot; pca.AddUnversionedFiles = true; List<PendingChange> patchChanges = new List<PendingChange>(pcs.GetSelection()); e.GetService<IPendingChangeHandler>().CreatePatch(patchChanges, pca); } }