/// <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); } }
/// <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()); } }
/// <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()); } }
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; } }
/// <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); }
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); }
public void SelectRevision(IRevisionPointer revision) { Verify.Argument.IsNotNull(revision, "revision"); var rev = revision.Dereference(); RevisionListItem item; if (_itemLookupTable.TryGetValue(rev, out item)) { item.FocusAndSelect(); } }
/// <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()); } }
/// <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(); } }
/// <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); }
/// <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); }
/// <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(); }
/// <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(); }
/// <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()); }
public void SelectRevision(IRevisionPointer revision) { Verify.Argument.IsNotNull(revision, "revision"); var rev = revision.Dereference(); RevisionListItem item; if(_itemLookupTable.TryGetValue(rev, out item)) { item.FocusAndSelect(); } }
/// <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(); } }
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; } }
/// <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(); } }
/// <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(); }
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; }
/// <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(); }