public void RevertReportsCheckoutNotification() { const string revertBranchName = "refs/heads/revert"; string repoPath = SandboxRevertTestRepo(); using (var repo = new Repository(repoPath)) { // Checkout the revert branch. Branch branch = repo.Checkout(revertBranchName); Assert.NotNull(branch); bool wasCalled = false; CheckoutNotifyFlags actualNotifyFlags = CheckoutNotifyFlags.None; RevertOptions options = new RevertOptions() { OnCheckoutNotify = (path, notificationType) => { wasCalled = true; actualNotifyFlags = notificationType; return(true); }, CheckoutNotifyFlags = CheckoutNotifyFlags.Updated, }; repo.Revert(repo.Head.Tip, Constants.Signature, options); Assert.True(wasCalled); } }
public void CanRevertMergeCommit(int mainline, string expectedId) { const string revertBranchName = "refs/heads/revert_merge"; const string commitIdToRevert = "2747045"; string repoPath = SandboxRevertTestRepo(); using (var repo = new Repository(repoPath)) { Branch branch = repo.Checkout(revertBranchName); Assert.NotNull(branch); Commit commitToRevert = repo.Lookup <Commit>(commitIdToRevert); Assert.NotNull(commitToRevert); RevertOptions options = new RevertOptions() { Mainline = mainline, }; RevertResult result = repo.Revert(commitToRevert, Constants.Signature, options); Assert.NotNull(result); Assert.Equal(RevertStatus.Reverted, result.Status); Assert.Equal(result.Commit.Sha, expectedId); if (mainline == 1) { // In this case, we expect "d_renamed.txt" to be reverted (deleted), // and a.txt to match the tip of the "revert" branch. Assert.Equal(FileStatus.Nonexistent, repo.RetrieveStatus("d_renamed.txt")); // This is the commit containing the expected contents of a.txt. Commit commit = repo.Lookup <Commit>("b6fbb29b625aabe0fb5736da6fd61d4147e4405e"); Assert.NotNull(commit); Assert.Equal(commit["a.txt"].Target.Id, repo.Index["a.txt"].Id); } else if (mainline == 2) { // In this case, we expect "d_renamed.txt" to be preset, // and a.txt to match the tip of the master branch. // In this case, we expect "d_renamed.txt" to be reverted (deleted), // and a.txt to match the tip of the "revert" branch. Assert.Equal(FileStatus.Unaltered, repo.RetrieveStatus("d_renamed.txt")); // This is the commit containing the expected contents of "d_renamed.txt". Commit commit = repo.Lookup <Commit>("c4b5cea70e4cd5b633ed0f10ae0ed5384e8190d8"); Assert.NotNull(commit); Assert.Equal(commit["d_renamed.txt"].Target.Id, repo.Index["d_renamed.txt"].Id); // This is the commit containing the expected contents of a.txt. commit = repo.Lookup <Commit>("cb4f7f0eca7a0114cdafd8537332aa17de36a4e9"); Assert.NotNull(commit); Assert.Equal(commit["a.txt"].Target.Id, repo.Index["a.txt"].Id); } } }
public void RevertWithFileConflictStrategyOption(CheckoutFileConflictStrategy conflictStrategy) { // The branch name to perform the revert on, // and the file which we expect conflicts as result of the revert. const string revertBranchName = "refs/heads/revert"; const string conflictedFilePath = "a.txt"; string path = SandboxRevertTestRepo(); using (var repo = new Repository(path)) { // Checkout the revert branch. Branch branch = repo.Checkout(revertBranchName); Assert.NotNull(branch); // Specify FileConflictStrategy. RevertOptions options = new RevertOptions() { FileConflictStrategy = conflictStrategy, }; RevertResult result = repo.Revert(repo.Head.Tip.Parents.First(), Constants.Signature, options); Assert.Equal(RevertStatus.Conflicts, result.Status); // Verify there is a conflict. Assert.False(repo.Index.IsFullyMerged); Conflict conflict = repo.Index.Conflicts[conflictedFilePath]; Assert.NotNull(conflict); Assert.NotNull(conflict); Assert.NotNull(conflict.Theirs); Assert.NotNull(conflict.Ours); // Get the blob containing the expected content. Blob expectedBlob = null; switch (conflictStrategy) { case CheckoutFileConflictStrategy.Theirs: expectedBlob = repo.Lookup <Blob>(conflict.Theirs.Id); break; case CheckoutFileConflictStrategy.Ours: expectedBlob = repo.Lookup <Blob>(conflict.Ours.Id); break; default: throw new Exception("Unexpected FileConflictStrategy"); } Assert.NotNull(expectedBlob); // Check the content of the file on disk matches what is expected. string expectedContent = expectedBlob.GetContentText(new FilteringOptions(conflictedFilePath)); Assert.Equal(expectedContent, File.ReadAllText(Path.Combine(repo.Info.WorkingDirectory, conflictedFilePath))); } }
public string RevertVersion(Guid networkId, string sha) { string repositoryPath = GetNetworkRepositoryPath(networkId); using (var repository = new Repository(repositoryPath)) { repository.Reset(ResetMode.Hard); Commit commit = repository.Commits.Single(c => c.Sha == sha); var signature = new Signature(SystemUserName, SystemUserEmail, DateTimeOffset.UtcNow); var options = new RevertOptions { CommitOnSuccess = true, MergeFileFavor = MergeFileFavor.Ours }; RevertResult result = repository.Revert(commit, signature, options); return(result.Commit.Sha); } }
public void RevertReportsCheckoutProgress() { const string revertBranchName = "refs/heads/revert"; string repoPath = SandboxRevertTestRepo(); using (var repo = new Repository(repoPath)) { // Checkout the revert branch. Branch branch = repo.Checkout(revertBranchName); Assert.NotNull(branch); bool wasCalled = false; RevertOptions options = new RevertOptions() { OnCheckoutProgress = (path, completed, total) => wasCalled = true }; repo.Revert(repo.Head.Tip, Constants.Signature, options); Assert.True(wasCalled); } }
public RevertResult Revert(Commit commit, Signature reverter, RevertOptions options) => repository.Revert(commit, reverter, options);
public void RevertFindsRenames(bool?findRenames) { // The environment is set up such that: // - file d.txt is edited in the commit that is to be reverted (commit A) // - file d.txt is renamed to d_renamed.txt // - commit A is reverted. // If rename detection is enabled, then the revert is applied // to d_renamed.txt. If rename detection is not enabled, // then the revert results in a conflict. const string revertBranchName = "refs/heads/revert_rename"; const string commitIdToRevert = "ca3e813"; const string expectedBlobId = "0ff3bbb9c8bba2291654cd64067fa417ff54c508"; const string modifiedFilePath = "d_renamed.txt"; string repoPath = SandboxRevertTestRepo(); using (var repo = new Repository(repoPath)) { Branch currentBranch = repo.Checkout(revertBranchName); Assert.NotNull(currentBranch); Commit commitToRevert = repo.Lookup <Commit>(commitIdToRevert); Assert.NotNull(currentBranch); RevertOptions options; if (findRenames.HasValue) { options = new RevertOptions() { FindRenames = findRenames.Value, }; } else { options = new RevertOptions(); } RevertResult result = repo.Revert(commitToRevert, Constants.Signature, options); Assert.NotNull(result); if (!findRenames.HasValue || findRenames.Value == true) { Assert.Equal(RevertStatus.Reverted, result.Status); Assert.NotNull(result.Commit); Blob expectedBlob = repo.Lookup <Blob>(expectedBlobId); Assert.NotNull(expectedBlob); GitObject blob = result.Commit.Tree[modifiedFilePath].Target as Blob; Assert.NotNull(blob); Assert.Equal(blob.Id, expectedBlob.Id); // Verify contents of workspace string fullPath = Path.Combine(repo.Info.WorkingDirectory, modifiedFilePath); Assert.Equal(expectedBlob.GetContentText(new FilteringOptions(modifiedFilePath)), File.ReadAllText(fullPath)); } else { Assert.Equal(RevertStatus.Conflicts, result.Status); Assert.Null(result.Commit); } } }
public RevertResult Revert(Commit commit, Signature reverter, RevertOptions options) { return(repositoryInstance.Revert(commit, reverter, options)); }
public RevertResult Revert(Commit commit, Signature reverter, RevertOptions options = null) { throw new NotImplementedException(); }
public void RevertWithFileConflictStrategyOption(CheckoutFileConflictStrategy conflictStrategy) { // The branch name to perform the revert on, // and the file which we expect conflicts as result of the revert. const string revertBranchName = "refs/heads/revert"; const string conflictedFilePath = "a.txt"; string path = SandboxRevertTestRepo(); using (var repo = new Repository(path)) { // Checkout the revert branch. Branch branch = Commands.Checkout(repo, revertBranchName); Assert.NotNull(branch); // Specify FileConflictStrategy. RevertOptions options = new RevertOptions() { FileConflictStrategy = conflictStrategy, }; RevertResult result = repo.Revert(repo.Head.Tip.Parents.First(), Constants.Signature, options); Assert.Equal(RevertStatus.Conflicts, result.Status); // Verify there is a conflict. Assert.False(repo.Index.IsFullyMerged); Conflict conflict = repo.Index.Conflicts[conflictedFilePath]; Assert.NotNull(conflict); Assert.NotNull(conflict); Assert.NotNull(conflict.Theirs); Assert.NotNull(conflict.Ours); // Get the blob containing the expected content. Blob expectedBlob = null; switch (conflictStrategy) { case CheckoutFileConflictStrategy.Theirs: expectedBlob = repo.Lookup<Blob>(conflict.Theirs.Id); break; case CheckoutFileConflictStrategy.Ours: expectedBlob = repo.Lookup<Blob>(conflict.Ours.Id); break; default: throw new Exception("Unexpected FileConflictStrategy"); } Assert.NotNull(expectedBlob); // Check the content of the file on disk matches what is expected. string expectedContent = expectedBlob.GetContentText(new FilteringOptions(conflictedFilePath)); Assert.Equal(expectedContent, File.ReadAllText(Path.Combine(repo.Info.WorkingDirectory, conflictedFilePath))); } }
public void RevertReportsCheckoutProgress() { const string revertBranchName = "refs/heads/revert"; string repoPath = SandboxRevertTestRepo(); using (var repo = new Repository(repoPath)) { // Checkout the revert branch. Branch branch = Commands.Checkout(repo, revertBranchName); Assert.NotNull(branch); bool wasCalled = false; RevertOptions options = new RevertOptions() { OnCheckoutProgress = (path, completed, total) => wasCalled = true }; repo.Revert(repo.Head.Tip, Constants.Signature, options); Assert.True(wasCalled); } }
public void RevertReportsCheckoutNotification() { const string revertBranchName = "refs/heads/revert"; string repoPath = SandboxRevertTestRepo(); using (var repo = new Repository(repoPath)) { // Checkout the revert branch. Branch branch = Commands.Checkout(repo, revertBranchName); Assert.NotNull(branch); bool wasCalled = false; CheckoutNotifyFlags actualNotifyFlags = CheckoutNotifyFlags.None; RevertOptions options = new RevertOptions() { OnCheckoutNotify = (path, notificationType) => { wasCalled = true; actualNotifyFlags = notificationType; return true; }, CheckoutNotifyFlags = CheckoutNotifyFlags.Updated, }; repo.Revert(repo.Head.Tip, Constants.Signature, options); Assert.True(wasCalled); Assert.Equal(CheckoutNotifyFlags.Updated, actualNotifyFlags); } }
public void RevertFindsRenames(bool? findRenames) { // The environment is set up such that: // - file d.txt is edited in the commit that is to be reverted (commit A) // - file d.txt is renamed to d_renamed.txt // - commit A is reverted. // If rename detection is enabled, then the revert is applied // to d_renamed.txt. If rename detection is not enabled, // then the revert results in a conflict. const string revertBranchName = "refs/heads/revert_rename"; const string commitIdToRevert = "ca3e813"; const string expectedBlobId = "0ff3bbb9c8bba2291654cd64067fa417ff54c508"; const string modifiedFilePath = "d_renamed.txt"; string repoPath = SandboxRevertTestRepo(); using (var repo = new Repository(repoPath)) { Branch currentBranch = Commands.Checkout(repo, revertBranchName); Assert.NotNull(currentBranch); Commit commitToRevert = repo.Lookup<Commit>(commitIdToRevert); Assert.NotNull(currentBranch); RevertOptions options; if (findRenames.HasValue) { options = new RevertOptions() { FindRenames = findRenames.Value, }; } else { options = new RevertOptions(); } RevertResult result = repo.Revert(commitToRevert, Constants.Signature, options); Assert.NotNull(result); if(!findRenames.HasValue || findRenames.Value == true) { Assert.Equal(RevertStatus.Reverted, result.Status); Assert.NotNull(result.Commit); Blob expectedBlob = repo.Lookup<Blob>(expectedBlobId); Assert.NotNull(expectedBlob); GitObject blob = result.Commit.Tree[modifiedFilePath].Target as Blob; Assert.NotNull(blob); Assert.Equal(blob.Id, expectedBlob.Id); // Verify contents of workspace string fullPath = Path.Combine(repo.Info.WorkingDirectory, modifiedFilePath); Assert.Equal(expectedBlob.GetContentText(new FilteringOptions(modifiedFilePath)), File.ReadAllText(fullPath)); } else { Assert.Equal(RevertStatus.Conflicts, result.Status); Assert.Null(result.Commit); } } }
public void CanRevertMergeCommit(int mainline, string expectedId) { const string revertBranchName = "refs/heads/revert_merge"; const string commitIdToRevert = "2747045"; string repoPath = SandboxRevertTestRepo(); using (var repo = new Repository(repoPath)) { Branch branch = Commands.Checkout(repo, revertBranchName); Assert.NotNull(branch); Commit commitToRevert = repo.Lookup<Commit>(commitIdToRevert); Assert.NotNull(commitToRevert); RevertOptions options = new RevertOptions() { Mainline = mainline, }; RevertResult result = repo.Revert(commitToRevert, Constants.Signature, options); Assert.NotNull(result); Assert.Equal(RevertStatus.Reverted, result.Status); Assert.Equal(result.Commit.Sha, expectedId); if(mainline == 1) { // In this case, we expect "d_renamed.txt" to be reverted (deleted), // and a.txt to match the tip of the "revert" branch. Assert.Equal(FileStatus.Nonexistent, repo.RetrieveStatus("d_renamed.txt")); // This is the commit containing the expected contents of a.txt. Commit commit = repo.Lookup<Commit>("b6fbb29b625aabe0fb5736da6fd61d4147e4405e"); Assert.NotNull(commit); Assert.Equal(commit["a.txt"].Target.Id, repo.Index["a.txt"].Id); } else if(mainline == 2) { // In this case, we expect "d_renamed.txt" to be preset, // and a.txt to match the tip of the master branch. // In this case, we expect "d_renamed.txt" to be reverted (deleted), // and a.txt to match the tip of the "revert" branch. Assert.Equal(FileStatus.Unaltered, repo.RetrieveStatus("d_renamed.txt")); // This is the commit containing the expected contents of "d_renamed.txt". Commit commit = repo.Lookup<Commit>("c4b5cea70e4cd5b633ed0f10ae0ed5384e8190d8"); Assert.NotNull(commit); Assert.Equal(commit["d_renamed.txt"].Target.Id, repo.Index["d_renamed.txt"].Id); // This is the commit containing the expected contents of a.txt. commit = repo.Lookup<Commit>("cb4f7f0eca7a0114cdafd8537332aa17de36a4e9"); Assert.NotNull(commit); Assert.Equal(commit["a.txt"].Target.Id, repo.Index["a.txt"].Id); } } }