Exemplo n.º 1
0
        /// <summary>Called after marking this <see cref="Reference"/> as deleted.</summary>
        protected override void OnDeleted()
        {
            var rev = _pointer.Dereference();

            LeavePointer(_pointer);
            if (rev != null)
            {
                LeaveRevision(rev);
            }
        }
Exemplo n.º 2
0
        /// <summary>Create <see cref="Reference"/>.</summary>
        /// <param name="repository">Host <see cref="Repository"/>.</param>
        /// <param name="name">Reference name.</param>
        /// <param name="pointer">Referenced object.</param>
        internal Reference(Repository repository, string name, IRevisionPointer pointer)
            : base(repository, name)
        {
            Verify.Argument.IsNotNull(pointer, "pointer");

            _pointer = PrepareInputPointer(pointer);
            _reflogSync = new object();
            EnterPointer(_pointer);
            var rev = _pointer.Dereference();
            if(rev != null)
            {
                EnterRevision(_pointer.Dereference());
            }
        }
Exemplo n.º 3
0
        /// <summary>Create <see cref="Reference"/>.</summary>
        /// <param name="repository">Host <see cref="Repository"/>.</param>
        /// <param name="name">Reference name.</param>
        /// <param name="pointer">Referenced object.</param>
        internal Reference(Repository repository, string name, IRevisionPointer pointer)
            : base(repository, name)
        {
            Verify.Argument.IsNotNull(pointer, "pointer");

            _pointer    = PrepareInputPointer(pointer);
            _reflogSync = new object();
            EnterPointer(_pointer);
            var rev = _pointer.Dereference();

            if (rev != null)
            {
                EnterRevision(_pointer.Dereference());
            }
        }
Exemplo n.º 4
0
        public RevertDialog(IRevisionPointer revisionPointer)
        {
            Verify.Argument.IsValidRevisionPointer(revisionPointer, "revisionPointer");

            _revisionPointer = revisionPointer;

            InitializeComponent();

            Text = Resources.StrRevertCommit;

            _lblRevision.Text = Resources.StrRevision.AddColon();
            _txtRevision.Text = revisionPointer.Pointer;
            _grpMainlineParentCommit.Text = Resources.StrMainlineParentCommit;
            _grpOptions.Text = Resources.StrOptions;
            _chkNoCommit.Text = Resources.StrsNoCommit;
            ToolTipService.Register(_chkNoCommit, Resources.TipRevertNoCommit);

            _txtRevision.Text = _revisionPointer.Pointer;

            GitterApplication.FontManager.InputFont.Apply(_txtRevision);

            var revision = revisionPointer.Dereference();
            if(!revision.IsLoaded)
            {
                revision.Load();
            }
            if(revision.Parents.Count > 1)
            {
                _lstCommits.Style = GitterApplication.DefaultStyle;
                bool first = true;
                foreach(var parent in revision.Parents)
                {
                    if(!parent.IsLoaded)
                    {
                        parent.Load();
                    }
                    if(first)
                    {
                        first = false;
                    }
                    else
                    {
                        _lstCommits.Panels.Add(new FlowPanelSeparator() { Height = 10 });
                    }
                    _lstCommits.Panels.Add(
                        new RevisionHeaderPanel()
                        {
                            Revision = parent,
                            IsSelectable = true,
                            IsSelected = _lstCommits.Panels.Count == 0,
                        });
                }
            }
            else
            {
                _pnlMainlineParentCommit.Visible = false;
                Height -= _pnlMainlineParentCommit.Height + _pnlOptions.Margin.Top;
                Width = 385;
            }
        }
Exemplo n.º 5
0
        /// <summary>Create branch.</summary>
        /// <param name="name">Branch name.</param>
        /// <param name="startingRevision">Starting revision.</param>
        /// <param name="tracking">Tracking mode.</param>
        /// <param name="createRefLog">Create branch's reflog.</param>
        /// <param name="checkout">Set to <c>true</c> to checkout branch after creation.</param>
        /// <param name="orphan">Set to <c>true</c> to create orphan branch.</param>
        /// <returns>Created branch.</returns>
        /// <exception cref="T:gitter.Git.GitException">Failed to dereference <paramref name="startingRevision"/> or create a branch.</exception>
        private Branch CreateBranchCore(string name, IRevisionPointer startingRevision, BranchTrackingMode tracking, bool createRefLog, bool checkout, bool orphan)
        {
            var rev = startingRevision.Dereference();

            var notifications = checkout ?
                                new[] { RepositoryNotifications.Checkout, RepositoryNotifications.BranchChanged } :
            new[] { RepositoryNotifications.BranchChanged };

            using (Repository.Monitor.BlockNotifications(notifications))
            {
                Repository.Accessor.CreateBranch.Invoke(new CreateBranchParameters(
                                                            name, startingRevision.Pointer, checkout, orphan, createRefLog, tracking));
            }

            var branch = new Branch(Repository, name, rev);

            AddObject(branch);

            if (checkout)
            {
                Repository.Head.Pointer = branch;
            }

            return(branch);
        }
Exemplo n.º 6
0
        public Revision Merge(IRevisionPointer branch, bool noCommit, bool noFastForward, bool squash, string message)
        {
            Verify.Argument.IsValidRevisionPointer(branch, Repository, nameof(branch));
            Verify.State.IsFalse(IsEmpty,
                                 Resources.ExcCantDoOnEmptyRepository.UseAsFormat("merge"));

            var oldRev        = branch.Dereference();
            var currentBranch = CurrentBranch;

            using (Repository.Monitor.BlockNotifications(
                       RepositoryNotifications.Checkout,
                       RepositoryNotifications.IndexUpdated,
                       RepositoryNotifications.WorktreeUpdated,
                       RepositoryNotifications.BranchChanged))
            {
                try
                {
                    Repository.Accessor.Merge.Invoke(
                        new MergeParameters(branch.FullName)
                    {
                        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 || headRev != oldRev)                //not fast-forwarded
                {
                    Repository.OnCommitCreated(headRev);
                }
            }
            NotifyRelogRecordAdded();
            return(headRev);
        }
Exemplo n.º 7
0
        public void SelectRevision(IRevisionPointer revision)
        {
            Verify.Argument.IsNotNull(revision, "revision");

            var rev = revision.Dereference();
            RevisionListItem item;

            if (_itemLookupTable.TryGetValue(rev, out item))
            {
                item.FocusAndSelect();
            }
        }
Exemplo n.º 8
0
        /// <summary>Filter <see cref="IRevisionPointer"/> to types supported by this <see cref="Reference"/>.</summary>
        /// <param name="pointer">Raw pointer.</param>
        /// <returns>Valid pointer.</returns>
        protected override IRevisionPointer PrepareInputPointer(IRevisionPointer pointer)
        {
            Verify.Argument.IsNotNull(pointer, nameof(pointer));

            switch (pointer.Type)
            {
            case ReferenceType.None:
            case ReferenceType.LocalBranch:
                return(pointer);

            default:
                return(pointer.Dereference());
            }
        }
Exemplo n.º 9
0
        /// <summary>
        /// Reset this branch to position specified by <paramref name="revision"/>.
        /// </summary>
        /// <param name="revision">New branch position.</param>
        /// <exception cref="T:System.ArgumentNullException">
        /// <paramref name="branch"/> == null or <paramref name="revision"/> == null.
        /// </exception>
        /// <exception cref="T:System.ArgumentException">
        /// <paramref name="branch"/> is not handled by this <see cref="Repository"/> or it is deleted;
        /// <paramref name="revision"/> is not handled by this <see cref="Repository"/> or it is deleted.
        /// </exception>
        /// <exception cref="T:gitter.Git.GitException">
        /// Failed to dereference <paramref name="revision"/> or git reset failed.
        /// </exception>
        public void Reset(IRevisionPointer revision)
        {
            Verify.Argument.IsValidRevisionPointer(revision, Repository, nameof(revision));
            Verify.State.IsNotDeleted(this);

            var rev = revision.Dereference();

            if (Revision != rev)
            {
                using (Repository.Monitor.BlockNotifications(
                           RepositoryNotifications.BranchChanged))
                {
                    Repository.Accessor.ResetBranch.Invoke(
                        new ResetBranchParameters(Name, revision.Pointer));
                }
                Pointer = rev;
                NotifyRelogRecordAdded();
            }
        }
Exemplo n.º 10
0
        /// <summary>Creates lightweight tag <paramref name="name"/> at commit pointed by <paramref name="revision"/>.</summary>
        /// <param name="name">Tag name.</param>
        /// <param name="revision">Revision which is being tagged.</param>
        /// <returns>Created tag.</returns>
        /// <exception cref="T:System.ArgumentNullException"><paramref name="name"/> == null or <paramref name="revision"/> == <c>null</c>.</exception>
        /// <exception cref="T:System.ArgumentException">
        /// <paramref name="revision"/> is not handled by this repository or deleted.
        /// <paramref name="name"/> is not a valid reference name.
        /// <paramref name="name"/> already exists.
        /// </exception>
        /// <exception cref="T:gitter.Git.GitException">Failed to dereference <paramref name="revision"/> or failed to create a tag.</exception>
        public Tag Create(string name, IRevisionPointer revision)
        {
            Verify.Argument.IsValidReferenceName(name, ReferenceType.Tag, nameof(name));
            Verify.Argument.IsValidRevisionPointer(revision, Repository, nameof(revision));
            Verify.Argument.IsFalse(ContainsObjectName(name), nameof(name),
                                    Resources.ExcObjectWithThisNameAlreadyExists.UseAsFormat("Tag"));

            var rev = revision.Dereference();

            using (Repository.Monitor.BlockNotifications(
                       RepositoryNotifications.TagChanged))
            {
                Repository.Accessor.CreateTag.Invoke(
                    new CreateTagParameters(name, revision.Pointer));
            }
            var tag = new Tag(Repository, name, rev, TagType.Lightweight);

            AddObject(tag);
            return(tag);
        }
Exemplo n.º 11
0
        /// <summary>Creates annotated tag <paramref name="name"/> at commit pointed by <paramref name="revision"/>.</summary>
        /// <param name="name">Tag name.</param>
        /// <param name="revision">Revision which is being tagged.</param>
        /// <param name="message">Message.</param>
        /// <param name="sign">Create tag signed by default email key.</param>
        /// <returns>Created tag.</returns>
        /// <exception cref="T:System.ArgumentNullException">
        /// <paramref name="name"/> == null or <paramref name="revision"/> == null or <paramref name="message"/> == null.
        /// </exception>
        /// <exception cref="T:System.ArgumentException">
        /// <paramref name="revision"/> is not handled by this repository or deleted.
        /// <paramref name="name"/> is not a valid reference name.
        /// <paramref name="name"/> already exists.
        /// </exception>
        /// <exception cref="T:gitter.Git.GitException">Failed to dereference <paramref name="revision"/> or failed to create a tag.</exception>
        public Tag Create(string name, IRevisionPointer revision, string message, bool sign)
        {
            Verify.Argument.IsValidReferenceName(name, ReferenceType.Tag, "name");
            Verify.Argument.IsValidRevisionPointer(revision, Repository, "revision");
            Verify.Argument.IsFalse(ContainsObjectName(name), "name",
                                    Resources.ExcObjectWithThisNameAlreadyExists.UseAsFormat("Tag"));
            Verify.Argument.IsNotNull(message, "message");

            var rev = revision.Dereference();

            using (Repository.Monitor.BlockNotifications(
                       RepositoryNotifications.TagChanged))
            {
                Repository.Accessor.CreateTag.Invoke(
                    new CreateTagParameters(name, revision.Pointer, message, sign));
            }
            var tag = new Tag(Repository, name, rev, TagType.Annotated);

            AddObject(tag);
            return(tag);
        }
Exemplo n.º 12
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();
        }
Exemplo n.º 13
0
        /// <summary>Checks out <paramref name="revision"/>. Checking out a non-branch revision will result in detached HEAD.</summary>
        /// <param name="revision">Reference to checkout.</param>
        /// <param name="force">Throw away local changes.</param>
        /// <exception cref="T:System.ArgumentNullException"><paramref name="revision"/> == <c>null</c>.</exception>
        /// <exception cref="T:System.ArgumentException">
        /// <paramref name="revision"/> is deleted.
        /// </exception>
        /// <exception cref="T:gitter.Git.GitException">Failed to dereference <paramref name="revision"/> or failed to checkout.</exception>
        public static void Checkout(this IRevisionPointer revision, bool force = false)
        {
            Verify.Argument.IsValidRevisionPointer(revision, "revision");

            var repository = revision.Repository;

            if (repository.Head == revision)
            {
                return;
            }
            bool revisionIsLocalBranch = (revision is Branch);

            if (!revisionIsLocalBranch && repository.Head.IsDetached)
            {
                var rev = revision.Dereference();
                if (rev == repository.Head.Revision)
                {
                    return;
                }
            }

            var pointer = revisionIsLocalBranch ? revision.Pointer : revision.FullName;

            using (repository.Monitor.BlockNotifications(
                       RepositoryNotifications.Checkout,
                       RepositoryNotifications.WorktreeUpdated,
                       RepositoryNotifications.IndexUpdated))
            {
                repository.Accessor.Checkout.Invoke(
                    new CheckoutParameters(pointer, force));
            }

            repository.Head.Pointer = revision;
            repository.Head.NotifyRelogRecordAdded();

            repository.Status.Refresh();
        }
Exemplo n.º 14
0
        /// <summary>Filter <see cref="IRevisionPointer"/> to types supported by this <see cref="Reference"/>.</summary>
        /// <param name="pointer">Raw pointer.</param>
        /// <returns>Valid pointer.</returns>
        protected override IRevisionPointer PrepareInputPointer(IRevisionPointer pointer)
        {
            Verify.Argument.IsNotNull(pointer, "pointer");

            return(pointer.Dereference());
        }
Exemplo n.º 15
0
        public void SelectRevision(IRevisionPointer revision)
        {
            Verify.Argument.IsNotNull(revision, "revision");

            var rev = revision.Dereference();
            RevisionListItem item;
            if(_itemLookupTable.TryGetValue(rev, out item))
            {
                item.FocusAndSelect();
            }
        }
Exemplo n.º 16
0
        /// <summary>
        /// Reset this branch to position specified by <paramref name="revision"/>.
        /// </summary>
        /// <param name="revision">New branch position.</param>
        /// <exception cref="T:System.ArgumentNullException">
        /// <paramref name="branch"/> == null or <paramref name="revision"/> == null.
        /// </exception>
        /// <exception cref="T:System.ArgumentException">
        /// <paramref name="branch"/> is not handled by this <see cref="Repository"/> or it is deleted;
        /// <paramref name="revision"/> is not handled by this <see cref="Repository"/> or it is deleted.
        /// </exception>
        /// <exception cref="T:gitter.Git.GitException">
        /// Failed to dereference <paramref name="revision"/> or git reset failed.
        /// </exception>
        public void Reset(IRevisionPointer revision)
        {
            Verify.Argument.IsValidRevisionPointer(revision, Repository, "revision");
            Verify.State.IsNotDeleted(this);

            var rev = revision.Dereference();
            if(Revision != rev)
            {
                using(Repository.Monitor.BlockNotifications(
                    RepositoryNotifications.BranchChanged))
                {
                    Repository.Accessor.ResetBranch.Invoke(
                        new ResetBranchParameters(Name, revision.Pointer));
                }
                Pointer = rev;
                NotifyRelogRecordAdded();
            }
        }
Exemplo n.º 17
0
        public RevertDialog(IRevisionPointer revisionPointer)
        {
            Verify.Argument.IsValidRevisionPointer(revisionPointer, "revisionPointer");

            _revisionPointer = revisionPointer;

            InitializeComponent();

            Text = Resources.StrRevertCommit;

            _lblRevision.Text             = Resources.StrRevision.AddColon();
            _txtRevision.Text             = revisionPointer.Pointer;
            _grpMainlineParentCommit.Text = Resources.StrMainlineParentCommit;
            _grpOptions.Text  = Resources.StrOptions;
            _chkNoCommit.Text = Resources.StrsNoCommit;
            ToolTipService.Register(_chkNoCommit, Resources.TipRevertNoCommit);

            _txtRevision.Text = _revisionPointer.Pointer;

            GitterApplication.FontManager.InputFont.Apply(_txtRevision);

            var revision = revisionPointer.Dereference();

            if (!revision.IsLoaded)
            {
                revision.Load();
            }
            if (revision.Parents.Count > 1)
            {
                _lstCommits.Style = GitterApplication.DefaultStyle;
                bool first = true;
                foreach (var parent in revision.Parents)
                {
                    if (!parent.IsLoaded)
                    {
                        parent.Load();
                    }
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        _lstCommits.Panels.Add(new FlowPanelSeparator()
                        {
                            Height = 10
                        });
                    }
                    _lstCommits.Panels.Add(
                        new RevisionHeaderPanel()
                    {
                        Revision     = parent,
                        IsSelectable = true,
                        IsSelected   = _lstCommits.Panels.Count == 0,
                    });
                }
            }
            else
            {
                _pnlMainlineParentCommit.Visible = false;
                Height -= _pnlMainlineParentCommit.Height + _pnlOptions.Margin.Top;
                Width   = 385;
            }
        }
Exemplo n.º 18
0
Arquivo: Head.cs Projeto: Kuzq/gitter
        /// <summary>Filter <see cref="IRevisionPointer"/> to types supported by this <see cref="Reference"/>.</summary>
        /// <param name="pointer">Raw pointer.</param>
        /// <returns>Valid pointer.</returns>
        protected override IRevisionPointer PrepareInputPointer(IRevisionPointer pointer)
        {
            Verify.Argument.IsNotNull(pointer, "pointer");

            switch(pointer.Type)
            {
                case ReferenceType.None:
                case ReferenceType.LocalBranch:
                    return pointer;
                default:
                    return pointer.Dereference();
            }
        }
Exemplo n.º 19
0
Arquivo: Head.cs Projeto: Kuzq/gitter
        /// <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, "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();
        }
Exemplo n.º 20
0
Arquivo: Head.cs Projeto: Kuzq/gitter
        public Revision Merge(IRevisionPointer branch, bool noCommit, bool noFastForward, bool squash, string message)
        {
            Verify.Argument.IsValidRevisionPointer(branch, Repository, "branch");
            Verify.State.IsFalse(IsEmpty,
                Resources.ExcCantDoOnEmptyRepository.UseAsFormat("merge"));

            var oldRev = branch.Dereference();
            var currentBranch = CurrentBranch;
            using(Repository.Monitor.BlockNotifications(
                RepositoryNotifications.Checkout,
                RepositoryNotifications.IndexUpdated,
                RepositoryNotifications.WorktreeUpdated,
                RepositoryNotifications.BranchChanged))
            {
                try
                {
                    Repository.Accessor.Merge.Invoke(
                        new MergeParameters(branch.FullName)
                        {
                            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 || headRev != oldRev) //not fast-forwarded
                {
                    Repository.OnCommitCreated(headRev);
                }
            }
            NotifyRelogRecordAdded();
            return headRev;
        }
Exemplo n.º 21
0
        /// <summary>Filter <see cref="IRevisionPointer"/> to types supported by this <see cref="BranchBase"/>.</summary>
        /// <param name="pointer">Raw pointer.</param>
        /// <returns>Valid pointer.</returns>
        protected override IRevisionPointer PrepareInputPointer(IRevisionPointer pointer)
        {
            Verify.Argument.IsNotNull(pointer, "pointer");

            return pointer.Dereference();
        }