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(); } }
/// <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(); }
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); }
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); }