public static void Revert(this IEnumerable <IRevisionPointer> revisions, bool noCommit)
        {
            Verify.Argument.IsValidRevisionPointerSequence(revisions, nameof(revisions));

            var        list       = new List <string>();
            Repository repository = null;

            foreach (var rev in revisions)
            {
                list.Add(rev.Pointer);
                repository = rev.Repository;
            }
            Verify.Argument.IsTrue(list.Count != 0, "revisions",
                                   Resources.ExcCollectionMustContainAtLeastOneObject.UseAsFormat("revision"));

            var oldHeadRev = repository.Head.Revision;

            try
            {
                repository.Accessor.Revert.Invoke(
                    new RevertParameters(list, noCommit));
                if (!noCommit)
                {
                    if (repository.Head.Pointer is Branch currentBranch)
                    {
                        currentBranch.Refresh();
                    }
                    else
                    {
                        repository.Head.Refresh();
                    }
                    var newHeadRev = repository.Head.Revision;
                    if (newHeadRev != oldHeadRev)
                    {
                        repository.OnUpdated();
                        repository.Head.NotifyRelogRecordAdded();
                    }
                }
            }
            catch (GitException)
            {
                repository.OnStateChanged();
                throw;
            }
            finally
            {
                repository.Status.Refresh();
            }
        }
Exemple #2
0
        /// <summary>Reset HEAD to <paramref name="pointer"/>.</summary>
        /// <param name="mode">Reset mode</param>
        /// <param name="pointer">HEAD's new position.</param>
        /// <exception cref="T:System.ArgumentNullException"><paramref name="pointer"/> == <c>null</c>.</exception>
        /// <exception cref="T:System.ArgumentException">
        /// <paramref name="pointer"/> is not handled by this <see cref="Repository"/> or it is deleted.
        /// </exception>
        /// <exception cref="T:gitter.Git.GitException">
        /// Failed to dereference <paramref name="pointer"/> or git reset failed.
        /// </exception>
        public void Reset(IRevisionPointer pointer, ResetMode mode)
        {
            Verify.Argument.IsValidRevisionPointer(pointer, Repository, nameof(pointer));

            var pos = Pointer.Dereference();
            var rev = pointer.Dereference();

            var currentBranch = Pointer as Branch;

            using (Repository.Monitor.BlockNotifications(
                       RepositoryNotifications.BranchChanged,
                       RepositoryNotifications.Checkout,
                       RepositoryNotifications.IndexUpdated,
                       RepositoryNotifications.WorktreeUpdated,
                       RepositoryNotifications.SubmodulesChanged))
            {
                Repository.Accessor.Reset.Invoke(
                    new ResetParameters(rev.Hash.ToString(), mode));
            }

            if (currentBranch != null)
            {
                currentBranch.Pointer = rev;
            }
            else
            {
                Pointer = rev;
            }

            if (pos != rev)
            {
                NotifyRelogRecordAdded();
            }

            Repository.Status.Refresh();
            Repository.Submodules.Refresh();
            Repository.OnStateChanged();
        }
Exemple #3
0
        public Revision Commit(string message, bool amend)
        {
            Verify.Argument.IsNotNull(message, "message");

            var currentBranch = Repository.Head.Pointer as Branch;

            using (Repository.Monitor.BlockNotifications(
                       RepositoryNotifications.IndexUpdated,
                       RepositoryNotifications.BranchChanged,
                       RepositoryNotifications.Checkout))
            {
                var fileName = Path.Combine(
                    Repository.GitDirectory,
                    GitConstants.CommitMessageFileName);
                File.WriteAllText(fileName, message);
                bool commitSuccess = false;
                try
                {
                    Repository.Accessor.Commit.Invoke(
                        new CommitParameters()
                    {
                        MessageFileName = Path.Combine(
                            Repository.GitDirectory, GitConstants.CommitMessageFileName),
                        Amend = amend,
                    });
                    commitSuccess = true;
                }
                finally
                {
                    if (commitSuccess)
                    {
                        try
                        {
                            File.Delete(fileName);
                        }
                        catch (Exception exc)
                        {
                            if (exc.IsCritical())
                            {
                                throw;
                            }
                        }
                    }
                }
            }

            Revision commit = null;

            if (currentBranch != null)
            {
                var oldHeadRev = currentBranch.Revision;
                currentBranch.Refresh();
                commit = currentBranch.Revision;
                if (commit != oldHeadRev)
                {
                    Repository.OnCommitCreated(commit);
                }
            }
            else
            {
                var oldHeadRev = Repository.Head.Revision;
                Repository.Head.Refresh();
                commit = Repository.Head.Revision;
                if (commit != oldHeadRev)
                {
                    Repository.OnCommitCreated(commit);
                }
            }
            Repository.Head.NotifyRelogRecordAdded();
            Repository.OnStateChanged();
            Refresh();
            return(commit);
        }
Exemple #4
0
        public Revision Merge(ICollection <IRevisionPointer> branches, bool noCommit, bool noFastForward, bool squash, string message)
        {
            Verify.Argument.IsValidRevisionPointerSequence(branches, Repository, nameof(branches));
            Verify.Argument.IsTrue(branches.Count != 0, nameof(branches),
                                   Resources.ExcCollectionMustContainAtLeastOneObject.UseAsFormat("branch"));
            Verify.State.IsFalse(IsEmpty,
                                 Resources.ExcCantDoOnEmptyRepository.UseAsFormat("merge"));

            if (branches.Count == 1)
            {
                foreach (var branch in branches)
                {
                    return(Merge(branch, noCommit, noFastForward, squash, message));
                }
            }
            var oldRevs     = new List <Revision>(branches.Count);
            var branchNames = new List <string>(branches.Count);

            foreach (var branch in branches)
            {
                oldRevs.Add(branch.Dereference());
                branchNames.Add(branch.FullName);
            }

            var currentBranch = CurrentBranch;

            using (Repository.Monitor.BlockNotifications(
                       RepositoryNotifications.Checkout,
                       RepositoryNotifications.WorktreeUpdated,
                       RepositoryNotifications.IndexUpdated,
                       RepositoryNotifications.BranchChanged))
            {
                try
                {
                    Repository.Accessor.Merge.Invoke(
                        new MergeParameters(branchNames)
                    {
                        NoCommit      = noCommit,
                        NoFastForward = noFastForward,
                        Squash        = squash,
                        Message       = message,
                    });
                }
                catch (AutomaticMergeFailedException)
                {
                    Repository.OnStateChanged();
                    Repository.Status.Refresh();
                    throw;
                }
            }

            if (currentBranch != null)
            {
                currentBranch.Refresh();
            }
            else
            {
                Refresh();
            }

            var headRev = Revision;

            if (noCommit)
            {
                Repository.OnStateChanged();
                Repository.Status.Refresh();
            }
            else
            {
                if (noFastForward || !oldRevs.Contains(headRev))                //not fast-forwarded
                {
                    Repository.OnCommitCreated(headRev);
                }
            }
            NotifyRelogRecordAdded();
            return(headRev);
        }