public override void OnExecute(CommandEventArgs e) { GitPushArgs args = new GitPushArgs(); string repositoryRoot; var repositoryRoots = new HashSet<string>(FileSystemUtil.StringComparer); foreach (var projectRoot in GetAllRoots(e)) { if ( GitTools.TryGetRepositoryRoot(projectRoot.FullPath, out repositoryRoot) && !repositoryRoots.Contains(repositoryRoot) ) repositoryRoots.Add(repositoryRoot); } if (repositoryRoots.Count > 1) { throw new InvalidOperationException("Pushing of multiple repository roots is not supported"); } repositoryRoot = repositoryRoots.Single(); switch (e.Command) { case VisualGitCommand.PendingChangesPushSpecificBranch: case VisualGitCommand.PendingChangesPushSpecificTag: if (!QueryParameters(e, repositoryRoot, args)) return; break; } ProgressRunnerArgs pa = new ProgressRunnerArgs(); pa.CreateLog = true; pa.TransportClientArgs = args; GitException exception = null; e.GetService<IProgressRunner>().RunModal(CommandStrings.PushingSolution, pa, delegate(object sender, ProgressWorkerArgs a) { using (var client = e.GetService<IGitClientPool>().GetNoUIClient()) { try { client.Push(repositoryRoot, args); } catch (GitException ex) { exception = ex; } } }); if (exception != null) { e.GetService<IVisualGitErrorHandler>().OnWarning(exception); } }
public override void OnExecute(CommandEventArgs e) { using (CloneDialog dialog = new CloneDialog()) { if (dialog.ShowDialog(e.Context) != DialogResult.OK) return; using (var client = e.GetService<IGitClientPool>().GetNoUIClient()) { } GitCloneArgs args = new GitCloneArgs(); ProgressRunnerArgs pa = new ProgressRunnerArgs(); pa.CreateLog = true; pa.TransportClientArgs = args; string destination = Path.GetFullPath(dialog.Destination); GitException exception = null; e.GetService<IProgressRunner>().RunModal(CommandStrings.CloningRepository, pa, delegate(object sender, ProgressWorkerArgs a) { try { a.Client.Clone(dialog.Remote, dialog.RemoteRef, destination, args); } catch (GitException ex) { exception = ex; } }); if (exception != null) { e.GetService<IVisualGitErrorHandler>().OnWarning(exception); } else { IVsSolution2 sol = e.GetService<IVsSolution2>(typeof(SVsSolution)); sol.OpenSolutionViaDlg(destination, 1); } } }
public void PerformMerge() { MergeType mergeType = GetPage<MergeTypePage>().SelectedMergeType; ProgressRunnerArgs runnerArgs = new ProgressRunnerArgs(); runnerArgs.CreateLog = !PerformDryRun; // Perform merge using IProgressRunner Context.GetService<IProgressRunner>().RunModal(MergeStrings.MergingTitle, runnerArgs, delegate(object sender, ProgressWorkerArgs ee) { _mergeActions = new List<SvnNotifyEventArgs>(); _resolvedMergeConflicts = new Dictionary<string, List<SvnConflictType>>(); MergeConflictHandler mergeConflictHandler = CreateMergeConflictHandler(); Handler conflictHandler = new Handler(Context, ee.Synchronizer, mergeConflictHandler); try { if (!PerformDryRun) { // Attach the conflict handler ee.Client.Conflict += new EventHandler<SvnConflictEventArgs>(conflictHandler.OnConflict); } // Attach the cancel handler ee.Client.Cancel += new EventHandler<SvnCancelEventArgs>(this.OnCancel); // Attach the notify handler ee.Client.Notify += new EventHandler<SvnNotifyEventArgs>(this.OnNotify); if (mergeType == MergeType.TwoDifferentTrees) { MergeSourceTwoDifferentTreesPage page = ((MergeSourceTwoDifferentTreesPage)mergeSourceTwoDifferentTreesPage); SvnDiffMergeArgs dArgs = new SvnDiffMergeArgs(); Uri fromUri; Uri toUri; // Set the proper depth dArgs.Depth = ((MergeOptionsPage)mergeOptionsPage).Depth; // Set whether or not unversioned obstructions should be allowed dArgs.Force = ((MergeOptionsPage)mergeOptionsPage).AllowUnversionedObstructions; // Set whether or not to ignore ancestry dArgs.IgnoreAncestry = ((MergeOptionsPage)mergeOptionsPage).IgnoreAncestry; // Set whether or not this is a dry run dArgs.DryRun = PerformDryRun; // Create 'From' uri Uri.TryCreate(page.MergeSourceOne, UriKind.Absolute, out fromUri); // Create 'To' uri if necessary if (page.HasSecondMergeSourceUrl) Uri.TryCreate(page.MergeSourceTwo, UriKind.Absolute, out toUri); else toUri = fromUri; ee.Client.DiffMerge(MergeTarget.FullPath, new SvnUriTarget(fromUri, (page.MergeFromRevision > -1 ? new SvnRevision(page.MergeFromRevision - 1) : SvnRevision.Head)), new SvnUriTarget(toUri, (page.MergeToRevision > -1 ? new SvnRevision(page.MergeToRevision) : SvnRevision.Head)), dArgs); } else if (mergeType == MergeType.Reintegrate) { SvnReintegrationMergeArgs args = new SvnReintegrationMergeArgs(); // Set whether or not this is a dry run args.DryRun = PerformDryRun; ee.Client.ReintegrationMerge(MergeTarget.FullPath, MergeSource.Target, args); } else { SvnMergeArgs args = new SvnMergeArgs(); // Set the proper depth args.Depth = mergeOptionsPage.Depth; // Set whether or not unversioned obstructions should be allowed args.Force = mergeOptionsPage.AllowUnversionedObstructions; // Set whether or not to ignore ancestry args.IgnoreAncestry = mergeOptionsPage.IgnoreAncestry; // Set whether or not this merge should just record the merge information args.RecordOnly = (mergeType == MergeType.ManuallyRecord || mergeType == MergeType.ManuallyRemove); // Set whether or not this is a dry run args.DryRun = PerformDryRun; //no need to continue with the merge operation since there are no revisions to merge if (MergeRevisions != null && EnumTools.GetFirst(MergeRevisions) == null) { throw new Exception(MergeStrings.NoLogItems); } if (MergeRevisions == null) { // Merge all eligible ee.Client.Merge( MergeTarget.FullPath, MergeSource.Target, new SvnRevisionRange(SvnRevision.Zero, SvnRevision.Head), args); } else { // Cherrypicking ee.Client.Merge( MergeTarget.FullPath, MergeSource.Target, new List<SvnRevisionRange>(MergeRevisions), args); } } } finally { if (!PerformDryRun) { // Detach the conflict handler ee.Client.Conflict -= new EventHandler<SvnConflictEventArgs>(conflictHandler.OnConflict); } // Detach the notify handler ee.Client.Notify -= new EventHandler<SvnNotifyEventArgs>(OnNotify); // Detach the cancel handler ee.Client.Cancel -= new EventHandler<SvnCancelEventArgs>(this.OnCancel); if (mergeConflictHandler != null) { _resolvedMergeConflicts = mergeConflictHandler.ResolvedMergedConflicts; mergeConflictHandler = null; } } }); }
public override void OnExecute(CommandEventArgs e) { SvnRevision updateTo; SvnDepth depth; List<string> files = new List<string>(); if (e.Command == AnkhCommand.UpdateItemSpecific) { IUIShell uiShell = e.GetService<IUIShell>(); PathSelectorInfo info = new PathSelectorInfo("Select Items to Update", e.Selection.GetSelectedSvnItems(true)); info.CheckedFilter += delegate(SvnItem item) { return item.IsVersioned; }; info.VisibleFilter += delegate(SvnItem item) { return item.IsVersioned; }; info.EnableRecursive = true; info.RevisionStart = SvnRevision.Head; info.Depth = SvnDepth.Infinity; PathSelectorResult result = !Shift ? uiShell.ShowPathSelector(info) : info.DefaultResult; if (!result.Succeeded) return; updateTo = result.RevisionStart; depth = result.Depth; List<SvnItem> dirs = new List<SvnItem>(); foreach (SvnItem item in result.Selection) { if (!item.IsVersioned) continue; if (item.IsDirectory) { if (result.Depth < SvnDepth.Infinity) { AnkhMessageBox mb = new AnkhMessageBox(e.Context); DialogResult dr = mb.Show(CommandStrings.CantUpdateDirectoriesNonRecursive, "", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Warning); if (dr != DialogResult.Yes) return; depth = SvnDepth.Infinity; } } bool found = false; foreach (SvnItem dir in dirs) { if (item.IsBelowPath(dir)) { found = true; break; } } if (found) continue; files.Add(item.FullPath); if (item.IsDirectory) dirs.Add(item); } } else { updateTo = SvnRevision.Head; depth = SvnDepth.Infinity; List<SvnItem> dirs = new List<SvnItem>(); foreach (SvnItem item in e.Selection.GetSelectedSvnItems(true)) { if (!item.IsVersioned) continue; bool found = false; foreach (SvnItem p in dirs) { if (item.IsBelowPath(p) && p.WorkingCopy == item.WorkingCopy) { found = true; break; } } if (found) continue; files.Add(item.FullPath); if (item.IsDirectory) dirs.Add(item); } } IAnkhOpenDocumentTracker tracker = e.GetService<IAnkhOpenDocumentTracker>(); tracker.SaveDocuments(e.Selection.GetSelectedFiles(true)); using (DocumentLock lck = tracker.LockDocuments(files, DocumentLockType.NoReload)) using (lck.MonitorChangesForReload()) { SvnUpdateResult ur; ProgressRunnerArgs pa = new ProgressRunnerArgs(); pa.CreateLog = true; e.GetService<IProgressRunner>().RunModal(CommandStrings.UpdatingTitle, pa, delegate(object sender, ProgressWorkerArgs ee) { SvnUpdateArgs ua = new SvnUpdateArgs(); ua.Depth = depth; ua.Revision = updateTo; e.GetService<IConflictHandler>(). RegisterConflictHandler(ua, ee.Synchronizer); ee.Client.Update(files, ua, out ur); }); } }
public void PerformMerge() { MergeType mergeType = GetPage <MergeTypePage>().SelectedMergeType; ProgressRunnerArgs runnerArgs = new ProgressRunnerArgs(); runnerArgs.CreateLog = !PerformDryRun; // Perform merge using IProgressRunner Context.GetService <IProgressRunner>().RunModal(MergeStrings.MergingTitle, runnerArgs, delegate(object sender, ProgressWorkerArgs ee) { _mergeActions = new List <SvnNotifyEventArgs>(); _resolvedMergeConflicts = new Dictionary <string, List <SvnConflictType> >(); MergeConflictHandler mergeConflictHandler = CreateMergeConflictHandler(); Handler conflictHandler = new Handler(Context, ee.Synchronizer, mergeConflictHandler); try { if (!PerformDryRun) { // Attach the conflict handler ee.Client.Conflict += new EventHandler <SvnConflictEventArgs>(conflictHandler.OnConflict); } // Attach the cancel handler ee.Client.Cancel += new EventHandler <SvnCancelEventArgs>(this.OnCancel); // Attach the notify handler ee.Client.Notify += new EventHandler <SvnNotifyEventArgs>(this.OnNotify); if (mergeType == MergeType.TwoDifferentTrees) { MergeSourceTwoDifferentTreesPage page = ((MergeSourceTwoDifferentTreesPage)mergeSourceTwoDifferentTreesPage); SvnDiffMergeArgs dArgs = new SvnDiffMergeArgs(); Uri fromUri; Uri toUri; // Set the proper depth dArgs.Depth = ((MergeOptionsPage)mergeOptionsPage).Depth; // Set whether or not unversioned obstructions should be allowed dArgs.Force = ((MergeOptionsPage)mergeOptionsPage).AllowUnversionedObstructions; // Set whether or not to ignore ancestry dArgs.IgnoreAncestry = ((MergeOptionsPage)mergeOptionsPage).IgnoreAncestry; // Set whether or not this is a dry run dArgs.DryRun = PerformDryRun; // Create 'From' uri Uri.TryCreate(page.MergeSourceOne, UriKind.Absolute, out fromUri); // Create 'To' uri if necessary if (page.HasSecondMergeSourceUrl) { Uri.TryCreate(page.MergeSourceTwo, UriKind.Absolute, out toUri); } else { toUri = fromUri; } ee.Client.DiffMerge(MergeTarget.FullPath, new SvnUriTarget(fromUri, (page.MergeFromRevision > -1 ? new SvnRevision(page.MergeFromRevision - 1) : SvnRevision.Head)), new SvnUriTarget(toUri, (page.MergeToRevision > -1 ? new SvnRevision(page.MergeToRevision) : SvnRevision.Head)), dArgs); } else if (mergeType == MergeType.Reintegrate) { SvnReintegrationMergeArgs args = new SvnReintegrationMergeArgs(); // Set whether or not this is a dry run args.DryRun = PerformDryRun; ee.Client.ReintegrationMerge(MergeTarget.FullPath, MergeSource.Target, args); } else { SvnMergeArgs args = new SvnMergeArgs(); // Set the proper depth args.Depth = mergeOptionsPage.Depth; // Set whether or not unversioned obstructions should be allowed args.Force = mergeOptionsPage.AllowUnversionedObstructions; // Set whether or not to ignore ancestry args.IgnoreAncestry = mergeOptionsPage.IgnoreAncestry; // Set whether or not this merge should just record the merge information args.RecordOnly = (mergeType == MergeType.ManuallyRecord || mergeType == MergeType.ManuallyRemove); // Set whether or not this is a dry run args.DryRun = PerformDryRun; //no need to continue with the merge operation since there are no revisions to merge if (MergeRevisions != null && EnumTools.GetFirst(MergeRevisions) == null) { throw new Exception(MergeStrings.NoLogItems); } if (MergeRevisions == null) { // Merge all eligible ee.Client.Merge( MergeTarget.FullPath, MergeSource.Target, new SvnRevisionRange(SvnRevision.Zero, SvnRevision.Head), args); } else { // Cherrypicking ee.Client.Merge( MergeTarget.FullPath, MergeSource.Target, new List <SvnRevisionRange>(MergeRevisions), args); } } } finally { if (!PerformDryRun) { // Detach the conflict handler ee.Client.Conflict -= new EventHandler <SvnConflictEventArgs>(conflictHandler.OnConflict); } // Detach the notify handler ee.Client.Notify -= new EventHandler <SvnNotifyEventArgs>(OnNotify); // Detach the cancel handler ee.Client.Cancel -= new EventHandler <SvnCancelEventArgs>(this.OnCancel); if (mergeConflictHandler != null) { _resolvedMergeConflicts = mergeConflictHandler.ResolvedMergedConflicts; mergeConflictHandler = null; } } }); }
public override void OnExecute(CommandEventArgs e) { IAnkhServiceEvents ci = e.GetService <IAnkhServiceEvents>(); if (ci != null) { ci.OnLastChanged(new LastChangedEventArgs(null, null)); } SvnRevision rev; bool allowUnversionedObstructions = false; bool updateExternals = true; bool setDepthInfinity = true; IAnkhSolutionSettings settings = e.GetService <IAnkhSolutionSettings>(); ISvnStatusCache cache = e.GetService <ISvnStatusCache>(); IProjectFileMapper mapper = e.GetService <IProjectFileMapper>(); Uri reposRoot = null; if (IsHeadCommand(e.Command) || e.DontPrompt) { rev = SvnRevision.Head; } else if (IsSolutionCommand(e.Command)) { SvnItem projectItem = settings.ProjectRootSvnItem; Debug.Assert(projectItem != null, "Has item"); using (UpdateDialog ud = new UpdateDialog()) { ud.ItemToUpdate = projectItem; ud.Revision = SvnRevision.Head; if (ud.ShowDialog(e.Context) != DialogResult.OK) { return; } rev = ud.Revision; allowUnversionedObstructions = ud.AllowUnversionedObstructions; updateExternals = ud.UpdateExternals; setDepthInfinity = ud.SetDepthInfinty; } } else if (IsFolderCommand(e.Command)) { SvnItem dirItem = EnumTools.GetFirst(e.Selection.GetSelectedSvnItems(false)); Debug.Assert(dirItem != null && dirItem.IsDirectory && dirItem.IsVersioned); using (UpdateDialog ud = new UpdateDialog()) { ud.Text = CommandStrings.UpdateFolder; ud.FolderLabelText = CommandStrings.UpdateFolderLabel; ud.ItemToUpdate = dirItem; ud.Revision = SvnRevision.Head; if (ud.ShowDialog(e.Context) != DialogResult.OK) { return; } rev = ud.Revision; allowUnversionedObstructions = ud.AllowUnversionedObstructions; updateExternals = ud.UpdateExternals; setDepthInfinity = ud.SetDepthInfinty; } } else { // We checked there was only a single repository to select a revision // from in OnUpdate, so we can suffice with only calculate the path SvnItem si = null; SvnOrigin origin = null; foreach (SccProject p in GetSelectedProjects(e)) { ISccProjectInfo pi = mapper.GetProjectInfo(p); if (pi == null || pi.ProjectDirectory == null) { continue; } SvnItem item = cache[pi.ProjectDirectory]; if (!item.IsVersioned) { continue; } if (si == null && origin == null) { si = item; origin = new SvnOrigin(item); reposRoot = item.WorkingCopy.RepositoryRoot; } else { si = null; string urlPath1 = origin.Uri.AbsolutePath; string urlPath2 = item.Uri.AbsolutePath; int i = 0; while (i < urlPath1.Length && i < urlPath2.Length && urlPath1[i] == urlPath2[i]) { i++; } while (i > 0 && urlPath1[i - 1] != '/') { i--; } origin = new SvnOrigin(new Uri(origin.Uri, urlPath1.Substring(0, i)), origin.RepositoryRoot); } } Debug.Assert(origin != null); using (UpdateDialog ud = new UpdateDialog()) { ud.Text = CommandStrings.UpdateProject; if (si != null) { ud.ItemToUpdate = si; } else { ud.SvnOrigin = origin; ud.SetMultiple(true); } ud.Revision = SvnRevision.Head; if (ud.ShowDialog(e.Context) != DialogResult.OK) { return; } rev = ud.Revision; allowUnversionedObstructions = ud.AllowUnversionedObstructions; updateExternals = ud.UpdateExternals; setDepthInfinity = ud.SetDepthInfinty; } } Dictionary <string, SvnItem> itemsToUpdate = new Dictionary <string, SvnItem>(StringComparer.OrdinalIgnoreCase); SortedList <string, UpdateGroup> groups = new SortedList <string, UpdateGroup>(StringComparer.OrdinalIgnoreCase); // Get a list of all documents below the specified paths that are open in editors inside VS HybridCollection <string> lockPaths = new HybridCollection <string>(StringComparer.OrdinalIgnoreCase); IAnkhOpenDocumentTracker documentTracker = e.GetService <IAnkhOpenDocumentTracker>(); foreach (SvnItem item in GetAllUpdateRoots(e)) { // GetAllUpdateRoots can (and probably will) return duplicates! if (itemsToUpdate.ContainsKey(item.FullPath) || !item.IsVersioned) { continue; } SvnWorkingCopy wc = item.WorkingCopy; if (!IsHeadCommand(e.Command) && reposRoot != null) { // Specific revisions are only valid on a single repository! if (wc != null && wc.RepositoryRoot != reposRoot) { continue; } } UpdateGroup group; if (!groups.TryGetValue(wc.FullPath, out group)) { group = new UpdateGroup(wc.FullPath); groups.Add(wc.FullPath, group); } group.Nodes.Add(item.FullPath); itemsToUpdate.Add(item.FullPath, item); foreach (string file in documentTracker.GetDocumentsBelow(item.FullPath)) { if (!lockPaths.Contains(file)) { lockPaths.Add(file); } } } documentTracker.SaveDocuments(lockPaths); // Make sure all files are saved before updating/merging! using (DocumentLock lck = documentTracker.LockDocuments(lockPaths, DocumentLockType.NoReload)) using (lck.MonitorChangesForReload()) { SvnUpdateResult updateResult = null; ProgressRunnerArgs pa = new ProgressRunnerArgs(); pa.CreateLog = true; string title; if (IsSolutionCommand(e.Command)) { title = CommandStrings.UpdatingSolution; } else if (IsFolderCommand(e.Command)) { title = CommandStrings.UpdatingFolder; } else { title = CommandStrings.UpdatingProject; } e.GetService <IProgressRunner>().RunModal(title, pa, delegate(object sender, ProgressWorkerArgs a) { PerformUpdate(e, a, rev, allowUnversionedObstructions, updateExternals, setDepthInfinity, groups.Values, out updateResult); }); if (ci != null && updateResult != null && IsSolutionCommand(e.Command)) { ci.OnLastChanged(new LastChangedEventArgs(CommandStrings.UpdatedToTitle, updateResult.Revision.ToString())); } } }
public override void OnExecute(CommandEventArgs e) { ILastChangeInfo ci = e.GetService<ILastChangeInfo>(); if (ci != null) ci.SetLastChange(null, null); SvnRevision rev; bool allowUnversionedObstructions = false; bool updateExternals = true; bool setDepthInfinity = true; IAnkhSolutionSettings settings = e.GetService<IAnkhSolutionSettings>(); IFileStatusCache cache = e.GetService<IFileStatusCache>(); IProjectFileMapper mapper = e.GetService<IProjectFileMapper>(); Uri reposRoot = null; if (IsHeadCommand(e.Command) || e.DontPrompt) rev = SvnRevision.Head; else if (IsSolutionCommand(e.Command)) { SvnItem projectItem = settings.ProjectRootSvnItem; Debug.Assert(projectItem != null, "Has item"); using (UpdateDialog ud = new UpdateDialog()) { ud.ItemToUpdate = projectItem; ud.Revision = SvnRevision.Head; if (ud.ShowDialog(e.Context) != DialogResult.OK) return; rev = ud.Revision; allowUnversionedObstructions = ud.AllowUnversionedObstructions; updateExternals = ud.UpdateExternals; setDepthInfinity = ud.SetDepthInfinty; } } else if (IsFolderCommand(e.Command)) { SvnItem dirItem = EnumTools.GetFirst(e.Selection.GetSelectedSvnItems(false)); Debug.Assert(dirItem != null && dirItem.IsDirectory && dirItem.IsVersioned); using (UpdateDialog ud = new UpdateDialog()) { ud.Text = CommandStrings.UpdateFolder; ud.FolderLabelText = CommandStrings.UpdateFolderLabel; ud.ItemToUpdate = dirItem; ud.Revision = SvnRevision.Head; if (ud.ShowDialog(e.Context) != DialogResult.OK) return; rev = ud.Revision; allowUnversionedObstructions = ud.AllowUnversionedObstructions; updateExternals = ud.UpdateExternals; setDepthInfinity = ud.SetDepthInfinty; } } else { // We checked there was only a single repository to select a revision // from in OnUpdate, so we can suffice with only calculate the path SvnItem si = null; SvnOrigin origin = null; foreach (SvnProject p in GetSelectedProjects(e)) { ISvnProjectInfo pi = mapper.GetProjectInfo(p); if (pi == null || pi.ProjectDirectory == null) continue; SvnItem item = cache[pi.ProjectDirectory]; if (!item.IsVersioned) continue; if (si == null && origin == null) { si = item; origin = new SvnOrigin(item); reposRoot = item.WorkingCopy.RepositoryRoot; } else { si = null; string urlPath1 = origin.Uri.AbsolutePath; string urlPath2 = item.Uri.AbsolutePath; int i = 0; while (i < urlPath1.Length && i < urlPath2.Length && urlPath1[i] == urlPath2[i]) { i++; } while (i > 0 && urlPath1[i - 1] != '/') i--; origin = new SvnOrigin(new Uri(origin.Uri, urlPath1.Substring(0, i)), origin.RepositoryRoot); } } Debug.Assert(origin != null); using (UpdateDialog ud = new UpdateDialog()) { ud.Text = CommandStrings.UpdateProject; if (si != null) ud.ItemToUpdate = si; else { ud.SvnOrigin = origin; ud.SetMultiple(true); } ud.Revision = SvnRevision.Head; if (ud.ShowDialog(e.Context) != DialogResult.OK) return; rev = ud.Revision; allowUnversionedObstructions = ud.AllowUnversionedObstructions; updateExternals = ud.UpdateExternals; setDepthInfinity = ud.SetDepthInfinty; } } Dictionary<string, SvnItem> itemsToUpdate = new Dictionary<string, SvnItem>(StringComparer.OrdinalIgnoreCase); Dictionary<string, List<string>> groups = new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase); // Get a list of all documents below the specified paths that are open in editors inside VS HybridCollection<string> lockPaths = new HybridCollection<string>(StringComparer.OrdinalIgnoreCase); IAnkhOpenDocumentTracker documentTracker = e.GetService<IAnkhOpenDocumentTracker>(); foreach (SvnItem item in GetAllUpdateRoots(e)) { // GetAllUpdateRoots can (and probably will) return duplicates! if (itemsToUpdate.ContainsKey(item.FullPath) || !item.IsVersioned) continue; SvnWorkingCopy wc = item.WorkingCopy; if (!IsHeadCommand(e.Command) && reposRoot != null) { // Specific revisions are only valid on a single repository! if (wc != null && wc.RepositoryRoot != reposRoot) continue; } List<string> inWc; if (!groups.TryGetValue(wc.FullPath, out inWc)) { inWc = new List<string>(); groups.Add(wc.FullPath, inWc); } inWc.Add(item.FullPath); itemsToUpdate.Add(item.FullPath, item); foreach (string file in documentTracker.GetDocumentsBelow(item.FullPath)) { if (!lockPaths.Contains(file)) lockPaths.Add(file); } } documentTracker.SaveDocuments(lockPaths); // Make sure all files are saved before updating/merging! using (DocumentLock lck = documentTracker.LockDocuments(lockPaths, DocumentLockType.NoReload)) using (lck.MonitorChangesForReload()) { SvnUpdateResult updateResult = null; ProgressRunnerArgs pa = new ProgressRunnerArgs(); pa.CreateLog = true; string title; if (IsSolutionCommand(e.Command)) title = CommandStrings.UpdatingSolution; else if (IsFolderCommand(e.Command)) title = CommandStrings.UpdatingFolder; else title = CommandStrings.UpdatingProject; e.GetService<IProgressRunner>().RunModal(title, pa, delegate(object sender, ProgressWorkerArgs a) { PerformUpdate(e, a, rev, allowUnversionedObstructions, updateExternals, setDepthInfinity, groups.Values, out updateResult); }); if (ci != null && updateResult != null && IsSolutionCommand(e.Command)) { ci.SetLastChange("Updated to:", updateResult.Revision.ToString()); } } }
public override void OnExecute(CommandEventArgs e) { GitPullArgs args = new GitPullArgs(); string repositoryRoot; var repositoryRoots = new HashSet<string>(FileSystemUtil.StringComparer); foreach (var projectRoot in GetAllRoots(e)) { if ( GitTools.TryGetRepositoryRoot(projectRoot.FullPath, out repositoryRoot) && !repositoryRoots.Contains(repositoryRoot) ) repositoryRoots.Add(repositoryRoot); } if (repositoryRoots.Count > 1) { throw new InvalidOperationException("Pulling of multiple repository roots is not supported"); } repositoryRoot = repositoryRoots.Single(); if (e.Command == VisualGitCommand.PendingChangesPullEx) { if (!QueryParameters(e, repositoryRoot, args)) return; } else { args.MergeStrategy = GitMergeStrategy.DefaultForBranch; } GitPullResult result = null; ProgressRunnerArgs pa = new ProgressRunnerArgs(); pa.CreateLog = true; pa.TransportClientArgs = args; // Get a list of all documents below the specified paths that are open in editors inside VS HybridCollection<string> lockPaths = new HybridCollection<string>(StringComparer.OrdinalIgnoreCase); IVisualGitOpenDocumentTracker documentTracker = e.GetService<IVisualGitOpenDocumentTracker>(); foreach (string file in documentTracker.GetDocumentsBelow(repositoryRoot)) { if (!lockPaths.Contains(file)) lockPaths.Add(file); } documentTracker.SaveDocuments(lockPaths); // Make sure all files are saved before merging! using (DocumentLock lck = documentTracker.LockDocuments(lockPaths, DocumentLockType.NoReload)) using (lck.MonitorChangesForReload()) { GitException exception = null; e.GetService<IProgressRunner>().RunModal(CommandStrings.PullingSolution, pa, delegate(object sender, ProgressWorkerArgs a) { e.GetService<IConflictHandler>().RegisterConflictHandler(args, a.Synchronizer); try { a.Client.Pull(repositoryRoot, args, out result); } catch (GitException ex) { exception = ex; } }); if (exception != null) { e.GetService<IVisualGitErrorHandler>().OnWarning(exception); } } }
private bool GetRemoteRefs(string remote, GitRemoteRefType types, GitRemoteRefsArgs args, out GitRemoteRefsResult result) { ProgressRunnerArgs pa = new ProgressRunnerArgs(); pa.CreateLog = true; pa.TransportClientArgs = args; GitRemoteRefsResult resultTmp = null; bool ok = false; GetService<IProgressRunner>().RunModal(CommandStrings.ListingRemoteBranches, pa, delegate(object sender, ProgressWorkerArgs a) { ok = a.Client.GetRemoteRefs(remote, types, args, out resultTmp); }); result = resultTmp; return ok; }
public override void OnFinish(System.ComponentModel.CancelEventArgs e) { WizardMessage newMsg = null; this.resultUri = null; EnablePageAndButtons(false); ScmUserNamePasswordEventArgs credentialsArgs = null; try { Uri uri = this.providerSelectionPage.Uri; if (uri == null && this.repositorySelectionPages != null) { ScmRepositoryProvider repoProvider = this.providerSelectionPage.SelectedRepositoryProvider; if (repoProvider != null) { RepositorySelectionPage repoSelectionPage; if (this.repositorySelectionPages.TryGetValue(repoProvider.Id, out repoSelectionPage)) { uri = repoSelectionPage.Uri; if (uri != null) { credentialsArgs = new ScmUserNamePasswordEventArgs(uri.AbsoluteUri); repoSelectionPage.FillUsernamePassword(credentialsArgs); if (credentialsArgs.Cancel) { credentialsArgs = null; } } } } } bool cancel = false; if (uri == null) { cancel = true; } else { Exception exc = null; if (credentialsArgs != null) { try { ProgressRunnerArgs runnerArgs = new ProgressRunnerArgs(); runnerArgs.CreateLog = false; // Make sure username and password is saved for future use ProgressRunnerResult result = Context.GetService <IProgressRunner>().RunModal("Checking repository", runnerArgs, delegate(object sender, ProgressWorkerArgs ee) { EnsureCredentials(credentialsArgs); }); cancel = !(result.Succeeded || result.Exception == null); exc = result.Exception; } catch (Exception runnere) { cancel = true; exc = runnere.InnerException == null ? runnere : runnere.InnerException; } } // TODO (BA) Should we validate here? /* * try * { * ProgressRunnerArgs runnerArgs = new ProgressRunnerArgs(); * runnerArgs.CreateLog = false; * // Check the validity of the specified repository location using IProgressRunner * ProgressRunnerResult result = Context.GetService<IProgressRunner>().RunModal("Checking URI", * runnerArgs, * delegate(object sender, ProgressWorkerArgs ee) * { CheckResult(uri); }); * cancel = !(result.Succeeded || result.Exception == null); * exc = result.Exception; * } * catch (Exception runnere) * { * cancel = true; * exc = runnere.InnerException == null ? runnere : runnere.InnerException; * } */ if (cancel && exc != null) { newMsg = new WizardMessage(exc.Message, WizardMessage.MessageType.Error); } } this.resultUri = cancel ? null : uri; DialogResult = cancel ? System.Windows.Forms.DialogResult.None : System.Windows.Forms.DialogResult.OK; if (CurrentPage.Message != newMsg) { CurrentPage.Message = newMsg; UpdateMessage(); } e.Cancel = cancel; } finally { EnablePageAndButtons(true); } }
public override void OnExecute(CommandEventArgs e) { SvnRevision updateTo; List <string> files = new List <string>(); if (e.Command == AnkhCommand.UpdateItemSpecific || e.Command == AnkhCommand.UpdateProjectFileSpecific) { updateTo = SvnRevision.Head; List <SvnItem> items = new List <SvnItem>(); foreach (SvnItem item in e.Selection.GetSelectedSvnItems(true)) { if (item.IsFile && item.IsVersioned) { items.Add(item); } } using (CommonFileSelectorDialog dlg = new CommonFileSelectorDialog()) { dlg.Text = CommandStrings.UpdateFilesTitle; dlg.Items = items; dlg.RevisionStart = updateTo; if (dlg.ShowDialog(e.Context) != DialogResult.OK) { return; } files.AddRange(SvnItem.GetPaths(dlg.GetCheckedItems())); updateTo = dlg.RevisionStart; } } else { updateTo = SvnRevision.Head; List <SvnItem> dirs = new List <SvnItem>(); foreach (SvnItem item in e.Selection.GetSelectedSvnItems(true)) { if (!item.IsVersioned) { continue; } bool found = false; foreach (SvnItem p in dirs) { if (item.IsBelowPath(p) && p.WorkingCopy == item.WorkingCopy) { found = true; break; } } if (found) { continue; } files.Add(item.FullPath); if (item.IsDirectory) { dirs.Add(item); } } } IAnkhOpenDocumentTracker tracker = e.GetService <IAnkhOpenDocumentTracker>(); tracker.SaveDocuments(e.Selection.GetSelectedFiles(true)); using (DocumentLock lck = tracker.LockDocuments(files, DocumentLockType.NoReload)) using (lck.MonitorChangesForReload()) { SvnUpdateResult ur; ProgressRunnerArgs pa = new ProgressRunnerArgs(); pa.CreateLog = true; e.GetService <IProgressRunner>().RunModal(CommandStrings.UpdatingTitle, pa, delegate(object sender, ProgressWorkerArgs ee) { SvnUpdateArgs ua = new SvnUpdateArgs(); ua.Depth = SvnDepth.Infinity; ua.Revision = updateTo; e.GetService <IConflictHandler>(). RegisterConflictHandler(ua, ee.Synchronizer); ee.Client.Update(files, ua, out ur); }); } }