예제 #1
0
        /// <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();
            }
        }
예제 #2
0
        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);
            }
        }