public override void OnExecute(CommandEventArgs e) { string argumentFile = e.Argument as string; List <SvnItem> selection = new List <SvnItem>(); if (string.IsNullOrEmpty(argumentFile)) { if (e.ShouldPrompt(true)) { selection.AddRange(e.Selection.GetSelectedSvnItems(true)); using (PendingChangeSelector pcs = new PendingChangeSelector()) { pcs.Text = CommandStrings.AddDialogTitle; pcs.PreserveWindowPlacement = true; pcs.LoadItems(selection, delegate(SvnItem item) { return(!item.IsVersioned && item.IsVersionable); }, delegate(SvnItem item) { if (item.IsIgnored) { return(false); } else if (item.IsSccExcluded) { return(false); } return(item.InSolution); }); if (pcs.ShowDialog(e.Context) != DialogResult.OK) { return; } selection.Clear(); selection.AddRange(pcs.GetSelectedItems()); } } else { foreach (SvnItem item in e.Selection.GetSelectedSvnItems(true)) { if (!item.IsVersioned && item.IsVersionable && !item.IsIgnored && item.InSolution) { selection.Add(item); } } } } else { selection.Add(e.GetService <ISvnStatusCache>()[argumentFile]); } ICollection <string> paths = SvnItem.GetPaths(selection); IAnkhOpenDocumentTracker documentTracker = e.GetService <IAnkhOpenDocumentTracker>(); documentTracker.SaveDocuments(paths); // Make sure all files are saved before updating/merging! using (DocumentLock lck = documentTracker.LockDocuments(paths, DocumentLockType.NoReload)) using (lck.MonitorChangesForReload()) e.GetService <IProgressRunner>().RunModal(CommandStrings.AddTaskDialogTitle, delegate(object sender, ProgressWorkerArgs ee) { SvnAddArgs args = new SvnAddArgs(); args.Depth = SvnDepth.Empty; args.AddParents = true; foreach (SvnItem item in selection) { ee.Client.Add(item.FullPath, args); } }); }
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); } } }