public void Rebase (string upstreamRef, GitUpdateOptions options, IProgressMonitor monitor) { StashCollection stashes = GitUtil.GetStashes (RootRepository); Stash stash = null; NGit.Api.Git git = new NGit.Api.Git (RootRepository); try { monitor.BeginTask (GettextCatalog.GetString ("Rebasing"), 5); List<string> UpdateSubmodules = new List<string> (); // TODO: Fix stash so we don't have to do update before the main repo update. if ((options & GitUpdateOptions.UpdateSubmodules) == GitUpdateOptions.UpdateSubmodules) { monitor.Log.WriteLine (GettextCatalog.GetString ("Checking repository submodules")); if (!GetSubmodulesToUpdate (UpdateSubmodules)) return; monitor.Log.WriteLine (GettextCatalog.GetString ("Updating repository submodules")); var submoduleUpdate = git.SubmoduleUpdate (); foreach (var submodule in UpdateSubmodules) submoduleUpdate.AddPath (submodule); submoduleUpdate.Call (); monitor.Step (1); } if ((options & GitUpdateOptions.SaveLocalChanges) != GitUpdateOptions.SaveLocalChanges) { const VersionStatus unclean = VersionStatus.Modified | VersionStatus.ScheduledAdd | VersionStatus.ScheduledDelete; bool modified = false; if (GetDirectoryVersionInfo (RootPath, false, true).Any (v => (v.Status & unclean) != VersionStatus.Unversioned)) modified = true; if (modified) { if (MessageService.GenericAlert ( MonoDevelop.Ide.Gui.Stock.Question, GettextCatalog.GetString ("You have uncommitted changes"), GettextCatalog.GetString ("What do you want to do?"), AlertButton.Cancel, new AlertButton ("Stash")) == AlertButton.Cancel) return; options |= GitUpdateOptions.SaveLocalChanges; } } if ((options & GitUpdateOptions.SaveLocalChanges) == GitUpdateOptions.SaveLocalChanges) { monitor.Log.WriteLine (GettextCatalog.GetString ("Saving local changes")); using (var gm = new GitMonitor (monitor)) stash = stashes.Create (gm, GetStashName ("_tmp_")); monitor.Step (1); } RebaseCommand rebase = git.Rebase (); rebase.SetOperation (RebaseCommand.Operation.BEGIN); rebase.SetUpstream (upstreamRef); var gmonitor = new GitMonitor (monitor); rebase.SetProgressMonitor (gmonitor); bool aborted = false; try { var result = rebase.Call (); while (!aborted && result.GetStatus () == RebaseResult.Status.STOPPED) { rebase = git.Rebase (); rebase.SetProgressMonitor (gmonitor); rebase.SetOperation (RebaseCommand.Operation.CONTINUE); bool commitChanges = true; var conflicts = GitUtil.GetConflictedFiles (RootRepository); foreach (string conflictFile in conflicts) { ConflictResult res = ResolveConflict (RootRepository.FromGitPath (conflictFile)); if (res == ConflictResult.Abort) { aborted = true; commitChanges = false; rebase.SetOperation (RebaseCommand.Operation.ABORT); break; } else if (res == ConflictResult.Skip) { rebase.SetOperation (RebaseCommand.Operation.SKIP); commitChanges = false; break; } } if (commitChanges) { NGit.Api.AddCommand cmd = git.Add (); foreach (string conflictFile in conflicts) cmd.AddFilepattern (conflictFile); cmd.Call (); } result = rebase.Call (); } if ((options & GitUpdateOptions.UpdateSubmodules) == GitUpdateOptions.UpdateSubmodules) { monitor.Log.WriteLine (GettextCatalog.GetString ("Updating repository submodules")); var submoduleUpdate = git.SubmoduleUpdate (); foreach (var submodule in UpdateSubmodules) submoduleUpdate.AddPath (submodule); submoduleUpdate.Call (); } } catch { if (!aborted) { rebase = git.Rebase (); rebase.SetOperation (RebaseCommand.Operation.ABORT); rebase.SetProgressMonitor (gmonitor); rebase.Call (); } throw; } finally { gmonitor.Dispose (); } } finally { if ((options & GitUpdateOptions.SaveLocalChanges) == GitUpdateOptions.SaveLocalChanges) monitor.Step (1); // Restore local changes if (stash != null) { monitor.Log.WriteLine (GettextCatalog.GetString ("Restoring local changes")); using (var gm = new GitMonitor (monitor)) stash.Apply (gm); stashes.Remove (stash); } monitor.EndTask (); } }
public void Rebase (string upstreamRef, bool saveLocalChanges, IProgressMonitor monitor) { StashCollection stashes = GitUtil.GetStashes (RootRepository); Stash stash = null; try { if (saveLocalChanges) { monitor.BeginTask (GettextCatalog.GetString ("Rebasing"), 3); monitor.Log.WriteLine (GettextCatalog.GetString ("Saving local changes")); using (var gm = new GitMonitor (monitor)) stash = stashes.Create (gm, GetStashName ("_tmp_")); monitor.Step (1); } NGit.Api.Git git = new NGit.Api.Git (RootRepository); RebaseCommand rebase = git.Rebase (); rebase.SetOperation (RebaseCommand.Operation.BEGIN); rebase.SetUpstream (upstreamRef); var gmonitor = new GitMonitor (monitor); rebase.SetProgressMonitor (gmonitor); bool aborted = false; try { var result = rebase.Call (); while (!aborted && result.GetStatus () == RebaseResult.Status.STOPPED) { rebase = git.Rebase (); rebase.SetProgressMonitor (gmonitor); rebase.SetOperation (RebaseCommand.Operation.CONTINUE); bool commitChanges = true; var conflicts = GitUtil.GetConflictedFiles (RootRepository); foreach (string conflictFile in conflicts) { ConflictResult res = ResolveConflict (RootRepository.FromGitPath (conflictFile)); if (res == ConflictResult.Abort) { aborted = true; commitChanges = false; rebase.SetOperation (RebaseCommand.Operation.ABORT); break; } else if (res == ConflictResult.Skip) { rebase.SetOperation (RebaseCommand.Operation.SKIP); commitChanges = false; break; } } if (commitChanges) { NGit.Api.AddCommand cmd = git.Add (); foreach (string conflictFile in conflicts) cmd.AddFilepattern (conflictFile); cmd.Call (); } result = rebase.Call (); } } catch { if (!aborted) { rebase = git.Rebase (); rebase.SetOperation (RebaseCommand.Operation.ABORT); rebase.SetProgressMonitor (gmonitor); rebase.Call (); } throw; } finally { gmonitor.Dispose (); } } finally { if (saveLocalChanges) monitor.Step (1); // Restore local changes if (stash != null) { monitor.Log.WriteLine (GettextCatalog.GetString ("Restoring local changes")); using (var gm = new GitMonitor (monitor)) stash.Apply (gm); stashes.Remove (stash); monitor.EndTask (); } } }
public void Rebase (string upstreamRef, GitUpdateOptions options, IProgressMonitor monitor) { StashCollection stashes = GitUtil.GetStashes (RootRepository); Stash stash = null; NGit.Api.Git git = new NGit.Api.Git (RootRepository); try { monitor.BeginTask (GettextCatalog.GetString ("Rebasing"), 5); List<string> UpdateSubmodules = new List<string> (); // TODO: Fix stash so we don't have to do update before the main repo update. if ((options & GitUpdateOptions.UpdateSubmodules) == GitUpdateOptions.UpdateSubmodules) { monitor.Log.WriteLine (GettextCatalog.GetString ("Checking repository submodules")); if (!GetSubmodulesToUpdate (UpdateSubmodules)) return; monitor.Log.WriteLine (GettextCatalog.GetString ("Updating repository submodules")); var submoduleUpdate = git.SubmoduleUpdate (); foreach (var submodule in UpdateSubmodules) submoduleUpdate.AddPath (submodule); submoduleUpdate.Call (); monitor.Step (1); } if ((options & GitUpdateOptions.SaveLocalChanges) == GitUpdateOptions.SaveLocalChanges) { monitor.Log.WriteLine (GettextCatalog.GetString ("Saving local changes")); using (var gm = new GitMonitor (monitor)) stash = stashes.Create (gm, GetStashName ("_tmp_")); monitor.Step (1); } RebaseCommand rebase = git.Rebase (); rebase.SetOperation (RebaseCommand.Operation.BEGIN); rebase.SetUpstream (upstreamRef); var gmonitor = new GitMonitor (monitor); rebase.SetProgressMonitor (gmonitor); bool aborted = false; try { var result = rebase.Call (); while (!aborted && result.GetStatus () == RebaseResult.Status.STOPPED) { rebase = git.Rebase (); rebase.SetProgressMonitor (gmonitor); rebase.SetOperation (RebaseCommand.Operation.CONTINUE); bool commitChanges = true; var conflicts = GitUtil.GetConflictedFiles (RootRepository); foreach (string conflictFile in conflicts) { ConflictResult res = ResolveConflict (RootRepository.FromGitPath (conflictFile)); if (res == ConflictResult.Abort) { aborted = true; commitChanges = false; rebase.SetOperation (RebaseCommand.Operation.ABORT); break; } else if (res == ConflictResult.Skip) { rebase.SetOperation (RebaseCommand.Operation.SKIP); commitChanges = false; break; } } if (commitChanges) { NGit.Api.AddCommand cmd = git.Add (); foreach (string conflictFile in conflicts) cmd.AddFilepattern (conflictFile); cmd.Call (); } result = rebase.Call (); } if ((options & GitUpdateOptions.UpdateSubmodules) == GitUpdateOptions.UpdateSubmodules) { monitor.Log.WriteLine (GettextCatalog.GetString ("Updating repository submodules")); var submoduleUpdate = git.SubmoduleUpdate (); foreach (var submodule in UpdateSubmodules) submoduleUpdate.AddPath (submodule); submoduleUpdate.Call (); monitor.Step (1); } } catch { if (!aborted) { rebase = git.Rebase (); rebase.SetOperation (RebaseCommand.Operation.ABORT); rebase.SetProgressMonitor (gmonitor); rebase.Call (); } throw; } finally { gmonitor.Dispose (); } } finally { if ((options & GitUpdateOptions.SaveLocalChanges) == GitUpdateOptions.SaveLocalChanges) monitor.Step (1); // Restore local changes if (stash != null) { monitor.Log.WriteLine (GettextCatalog.GetString ("Restoring local changes")); using (var gm = new GitMonitor (monitor)) stash.Apply (gm); stashes.Remove (stash); } monitor.EndTask (); } }