/// <summary>Performs a cherry-pick operation on <paramref name="revision"/>.</summary> /// <param name="revision">Commit to cherry-pick.</param> /// <param name="mainline">Mainline parent commit.</param> /// <param name="noCommit">Do not commit.</param> public static void CherryPick(this IRevisionPointer revision, int mainline, bool noCommit) { Verify.Argument.IsValidRevisionPointer(revision, "revision"); Verify.Argument.IsNotNegative(mainline, "mainline"); var repository = revision.Repository; Verify.State.IsFalse(repository.Head.IsEmpty, Resources.ExcCantDoOnEmptyRepository.UseAsFormat("cherry-pick")); var rev = repository.Head.Revision; var cb = repository.Head.Pointer as Branch; var parameters = new CherryPickParameters(revision.Pointer, noCommit); if (mainline > 0) { parameters.Mainline = mainline; } try { using (repository.Monitor.BlockNotifications( RepositoryNotifications.IndexUpdated, RepositoryNotifications.WorktreeUpdated, RepositoryNotifications.BranchChanged, RepositoryNotifications.Checkout)) { repository.Accessor.CherryPick.Invoke(parameters); if (cb != null) { cb.Refresh(); var branchTip = cb.Revision; if (branchTip != rev) { repository.OnCommitCreated(branchTip); } } else { repository.Head.Refresh(); var headRev = repository.Head.Revision; if (headRev != rev) { repository.OnCommitCreated(headRev); } } repository.Head.NotifyRelogRecordAdded(); } } catch (GitException) { repository.OnStateChanged(); throw; } finally { repository.Status.Refresh(); } }
public Command GetCherryPickCommand(CherryPickParameters parameters) { Assert.IsNotNull(parameters); if(parameters.Control.HasValue) { switch(parameters.Control.Value) { case CherryPickControl.Continue: return new CherryPickCommand(CherryPickCommand.Continue()); case CherryPickControl.Quit: return new CherryPickCommand(CherryPickCommand.Quit()); case CherryPickControl.Abort: return new CherryPickCommand(CherryPickCommand.Abort()); default: throw new ArgumentException("Unknown enum value.", "control"); } } else { var args = new List<ICommandArgument>(); if(parameters.NoCommit) { args.Add(CherryPickCommand.NoCommit()); } if(parameters.Mainline > 0) { args.Add(CherryPickCommand.Mainline(parameters.Mainline)); } if(parameters.SignOff) { args.Add(CherryPickCommand.SignOff()); } if(parameters.FastForward) { args.Add(CherryPickCommand.FastForward()); } if(parameters.AllowEmpty) { args.Add(CherryPickCommand.AllowEmpty()); } if(parameters.AllowEmptyMessage) { args.Add(CherryPickCommand.AllowEmptyMessage()); } if(parameters.KeepRedundantCommits) { args.Add(CherryPickCommand.KeepRedundantCommits()); } foreach(var rev in parameters.Revisions) { args.Add(new CommandParameter(rev)); } return new CherryPickCommand(args); } }