public override void OnExecute(CommandEventArgs e) { List <SvnItem> selectedFiles = new List <SvnItem>(); if (e.Command == AnkhCommand.DocumentShowChanges) { SvnItem item = e.Selection.ActiveDocumentSvnItem; if (item == null) { return; } selectedFiles.Add(item); } else { foreach (SvnItem item in e.Selection.GetSelectedSvnItems(false)) { if (!item.IsVersioned || (item.Status.LocalNodeStatus == SvnStatus.Added && !item.Status.IsCopied)) { continue; } if (e.Command == AnkhCommand.ItemCompareBase || e.Command == AnkhCommand.ItemShowChanges) { if (!(item.IsModified || item.IsDocumentDirty) || !item.IsLocalDiffAvailable // exclude if local diff is not available ) { continue; } } if (e.Command == AnkhCommand.DiffLocalItem && !NotDeletedFilter(item)) { continue; } selectedFiles.Add(item); } } SvnRevisionRange revRange = null; switch (e.Command) { case AnkhCommand.DiffLocalItem: break; // revRange null -> show selector case AnkhCommand.ItemCompareBase: case AnkhCommand.ItemShowChanges: case AnkhCommand.DocumentShowChanges: revRange = new SvnRevisionRange(SvnRevision.Base, SvnRevision.Working); break; case AnkhCommand.ItemCompareCommitted: revRange = new SvnRevisionRange(SvnRevision.Committed, SvnRevision.Working); break; case AnkhCommand.ItemCompareLatest: revRange = new SvnRevisionRange(SvnRevision.Head, SvnRevision.Working); break; case AnkhCommand.ItemComparePrevious: revRange = new SvnRevisionRange(SvnRevision.Previous, SvnRevision.Working); break; } if (e.PromptUser || selectedFiles.Count > 1 || revRange == null) { SvnRevision start = revRange == null ? SvnRevision.Base : revRange.StartRevision; SvnRevision end = revRange == null ? SvnRevision.Working : revRange.EndRevision; // should we show the path selector? if (e.PromptUser || !Shift) { using (CommonFileSelectorDialog dlg = new CommonFileSelectorDialog()) { dlg.Text = CommandStrings.CompareFilesTitle; dlg.Items = selectedFiles; dlg.RevisionStart = start; dlg.RevisionEnd = end; if (dlg.ShowDialog(e.Context) != DialogResult.OK) { return; } selectedFiles.Clear(); selectedFiles.AddRange(dlg.GetCheckedItems()); start = dlg.RevisionStart; end = dlg.RevisionEnd; } } revRange = new SvnRevisionRange(start, end); } if (revRange.EndRevision.RevisionType == SvnRevisionType.Working || revRange.StartRevision.RevisionType == SvnRevisionType.Working) { // Save only the files needed IAnkhOpenDocumentTracker tracker = e.GetService <IAnkhOpenDocumentTracker>(); if (tracker != null) { tracker.SaveDocuments(SvnItem.GetPaths(selectedFiles)); } } IAnkhDiffHandler diff = e.GetService <IAnkhDiffHandler>(); foreach (SvnItem item in selectedFiles) { AnkhDiffArgs da = new AnkhDiffArgs(); if ((item.Status.IsCopied || item.IsReplaced) && (!revRange.StartRevision.RequiresWorkingCopy || !revRange.EndRevision.RequiresWorkingCopy)) { // The file is copied, use its origins history instead of that of the new file SvnUriTarget copiedFrom = diff.GetCopyOrigin(item); // TODO: Maybe handle Previous/Committed as history if (copiedFrom != null && !revRange.StartRevision.RequiresWorkingCopy) { if (null == (da.BaseFile = diff.GetTempFile(copiedFrom, revRange.StartRevision, true))) { return; // Canceled } da.BaseTitle = diff.GetTitle(copiedFrom, revRange.StartRevision); } if (copiedFrom != null && !revRange.EndRevision.RequiresWorkingCopy) { if (null == (da.MineFile = diff.GetTempFile(copiedFrom, revRange.EndRevision, true))) { return; // Canceled } da.MineTitle = diff.GetTitle(copiedFrom, revRange.EndRevision); } } if (da.BaseFile == null) { if (null == (da.BaseFile = (revRange.StartRevision == SvnRevision.Working) ? item.FullPath : diff.GetTempFile(item, revRange.StartRevision, true))) { return; // Canceled } da.BaseTitle = diff.GetTitle(item, revRange.StartRevision); } if (da.MineFile == null) { if (null == (da.MineFile = (revRange.EndRevision == SvnRevision.Working) ? item.FullPath : diff.GetTempFile(item, revRange.EndRevision, true))) { return; // Canceled } da.MineTitle = diff.GetTitle(item, revRange.EndRevision); } if (!String.Equals(da.MineFile, item.FullPath, StringComparison.OrdinalIgnoreCase)) { da.ReadOnly = true; } diff.RunDiff(da); } }
public override void OnExecute(CommandEventArgs e) { List <SvnOrigin> selected = new List <SvnOrigin>(); ISvnStatusCache cache = e.GetService <ISvnStatusCache>(); switch (e.Command) { case AnkhCommand.Log: IAnkhDiffHandler diffHandler = e.GetService <IAnkhDiffHandler>(); List <SvnOrigin> items = new List <SvnOrigin>(); foreach (SvnItem i in e.Selection.GetSelectedSvnItems(false)) { Debug.Assert(i.IsVersioned); if (i.IsReplaced || i.IsAdded) { if (!i.HasCopyableHistory) { continue; } items.Add(new SvnOrigin(diffHandler.GetCopyOrigin(i), i.WorkingCopy.RepositoryRoot)); continue; } items.Add(new SvnOrigin(i)); } PerformLog(e.Context, items, null, null); break; case AnkhCommand.SolutionHistory: IAnkhSolutionSettings settings = e.GetService <IAnkhSolutionSettings>(); PerformLog(e.Context, new SvnOrigin[] { new SvnOrigin(cache[settings.ProjectRoot]) }, null, null); break; case AnkhCommand.ProjectHistory: IProjectFileMapper mapper = e.GetService <IProjectFileMapper>(); foreach (SccProject p in e.Selection.GetSelectedProjects(false)) { ISccProjectInfo info = mapper.GetProjectInfo(p); if (info != null) { selected.Add(new SvnOrigin(cache[info.ProjectDirectory])); } } PerformLog(e.Context, selected, null, null); break; case AnkhCommand.DocumentHistory: SvnItem docItem = e.Selection.ActiveDocumentSvnItem; Debug.Assert(docItem != null); PerformLog(e.Context, new SvnOrigin[] { new SvnOrigin(docItem) }, null, null); break; case AnkhCommand.ReposExplorerLog: foreach (ISvnRepositoryItem i in e.Selection.GetSelection <ISvnRepositoryItem>()) { if (i != null && i.Origin != null) { selected.Add(i.Origin); } } if (selected.Count > 0) { PerformLog(e.Context, selected, null, null); } break; case AnkhCommand.AnnotateShowLog: IAnnotateSection section = EnumTools.GetSingle(e.Selection.GetSelection <IAnnotateSection>()); if (section == null) { return; } PerformLog(e.Context, new SvnOrigin[] { section.Origin }, section.Revision, null); break; } }