public static void DumpGraph(string workingDirectory, Action <string> writer = null, int?maxCommits = null) { var output = new StringBuilder(); try { ProcessHelper.Run( o => output.AppendLine(o), e => output.AppendLineFormat("ERROR: {0}", e), null, "git", GitRepositoryHelper.CreateGitLogArgs(maxCommits), workingDirectory); } catch (FileNotFoundException exception) { if (exception.FileName != "git") { throw; } output.AppendLine("Could not execute 'git log' due to the following error:"); output.AppendLine(exception.ToString()); } if (writer != null) { writer(output.ToString()); } else { Console.Write(output.ToString()); } }
public void UpdatesCurrentBranch() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit(); fixture.Repository.Checkout(fixture.Repository.CreateBranch("develop")); fixture.Repository.MakeACommit(); fixture.Repository.Checkout("master"); using (var localFixture = fixture.CloneRepository()) { // Advance remote fixture.Repository.Checkout("develop"); var advancedCommit = fixture.Repository.MakeACommit(); Commands.Fetch((Repository)localFixture.Repository, localFixture.Repository.Network.Remotes["origin"].Name, new string[0], null, null); localFixture.Repository.Checkout(advancedCommit.Sha); localFixture.Repository.DumpGraph(); GitRepositoryHelper.NormalizeGitDirectory(localFixture.RepositoryPath, new AuthenticationInfo(), noFetch: false, currentBranch: "ref/heads/develop"); var normalisedBranch = localFixture.Repository.FindBranch("develop"); normalisedBranch.ShouldNotBe(null); fixture.Repository.DumpGraph(); localFixture.Repository.DumpGraph(); normalisedBranch.Tip.Sha.ShouldBe(advancedCommit.Sha); localFixture.Repository.Head.Tip.Sha.ShouldBe(advancedCommit.Sha); } } }
public void GivenARemoteGitRepositoryWithCommitsAndBranches_ThenClonedLocalShouldMatchRemoteVersion() { using (var fixture = new RemoteRepositoryFixture( path => { Repository.Init(path); Console.WriteLine("Created git repository at '{0}'", path); var repo = new Repository(path); repo.MakeCommits(5); repo.CreateBranch("develop"); repo.CreateBranch("release-1.0"); Commands.Checkout(repo, "release-1.0"); repo.MakeCommits(5); return(repo); })) { GitRepositoryHelper.NormalizeGitDirectory(fixture.LocalRepositoryFixture.RepositoryPath, new AuthenticationInfo(), noFetch: false, currentBranch: string.Empty); fixture.AssertFullSemver("1.0.0-beta.1+5"); fixture.AssertFullSemver("1.0.0-beta.1+5", fixture.LocalRepositoryFixture.Repository); } }
public void ShouldNotChangeBranchWhenNormalizingTheDirectory() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeATaggedCommit("v1.0.0"); fixture.Repository.Checkout(fixture.Repository.CreateBranch("develop")); var lastCommitOnDevelop = fixture.Repository.MakeACommit(); fixture.Repository.Checkout(fixture.Repository.CreateBranch("feature/foo")); fixture.Repository.MakeACommit(); using (var localFixture = fixture.CloneRepository()) { localFixture.Repository.Checkout("origin/develop"); // Another commit on feature/foo will force an update fixture.Checkout("feature/foo"); fixture.Repository.MakeACommit(); GitRepositoryHelper.NormalizeGitDirectory(localFixture.RepositoryPath, new AuthenticationInfo(), noFetch: false, currentBranch: null); localFixture.Repository.DumpGraph(); localFixture.Repository.Head.Tip.Sha.ShouldBe(lastCommitOnDevelop.Sha); } } }
public void NormalisationOfTag() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit(); Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("feature/foo")); fixture.Repository.MakeACommit(); fixture.BranchTo("release/2.0.0"); fixture.MakeACommit(); fixture.MakeATaggedCommit("2.0.0-rc.1"); fixture.Checkout("master"); fixture.MergeNoFF("release/2.0.0"); fixture.Repository.Branches.Remove(fixture.Repository.Branches["release/2.0.0"]); var remoteTagSha = fixture.Repository.Tags["2.0.0-rc.1"].Target.Sha; using (var localFixture = fixture.CloneRepository()) { localFixture.Checkout(remoteTagSha); GitRepositoryHelper.NormalizeGitDirectory(localFixture.RepositoryPath, new AuthenticationInfo(), noFetch: false, currentBranch: string.Empty); localFixture.Repository.Head.FriendlyName.ShouldBe("(no branch)"); localFixture.Repository.Head.Tip.Sha.ShouldBe(remoteTagSha); } } }
public void CheckedOutShaShouldNotChanged() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit(); var commitToBuild = fixture.Repository.MakeACommit(); fixture.Repository.MakeACommit(); using (var localFixture = fixture.CloneRepository()) { Commands.Checkout(localFixture.Repository, commitToBuild); GitRepositoryHelper.NormalizeGitDirectory(localFixture.RepositoryPath, new AuthenticationInfo(), noFetch: false, currentBranch: "refs/heads/master"); var normalisedBranch = localFixture.Repository.Branches["master"]; normalisedBranch.Tip.Sha.ShouldBe(commitToBuild.Sha); } } }
public void NormalisationOfPullRequestsWithoutFetch() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit(); fixture.Repository.Checkout(fixture.Repository.CreateBranch("feature/foo")); fixture.Repository.MakeACommit(); var commit = fixture.Repository.CreatePullRequestRef("feature/foo", "master", prNumber: 3, allowFastFowardMerge: true); using (var localFixture = fixture.CloneRepository()) { localFixture.Checkout(commit.Sha); GitRepositoryHelper.NormalizeGitDirectory(localFixture.RepositoryPath, new AuthenticationInfo(), noFetch: true, currentBranch: "refs/pull/3/merge"); var normalisedPullBranch = localFixture.Repository.FindBranch("pull/3/merge"); normalisedPullBranch.ShouldNotBe(null); } } }
public void NormalisationOfPullRequestsWithFetch() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit(); Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("feature/foo")); fixture.Repository.MakeACommit(); var commit = fixture.Repository.CreatePullRequestRef("feature/foo", "master", prNumber: 3); using (var localFixture = fixture.CloneRepository()) { localFixture.Checkout(commit.Sha); GitRepositoryHelper.NormalizeGitDirectory(localFixture.RepositoryPath, new AuthenticationInfo(), noFetch: false, currentBranch: string.Empty); var normalisedPullBranch = localFixture.Repository.Branches["pull/3/merge"]; normalisedPullBranch.ShouldNotBe(null); } } }
public void UpdatesLocalBranchesWhen() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit(); fixture.Repository.Checkout(fixture.Repository.CreateBranch("feature/foo")); fixture.Repository.MakeACommit(); using (var localFixture = fixture.CloneRepository()) { localFixture.Checkout("feature/foo"); // Advance remote var advancedCommit = fixture.Repository.MakeACommit(); GitRepositoryHelper.NormalizeGitDirectory(localFixture.RepositoryPath, new AuthenticationInfo(), noFetch: false, currentBranch: null); var normalisedBranch = localFixture.Repository.FindBranch("feature/foo"); normalisedBranch.ShouldNotBe(null); normalisedBranch.Tip.Sha.ShouldBe(advancedCommit.Sha); } } }
public void ShouldNotMoveLocalBranchWhenRemoteAdvances() { using (var fixture = new EmptyRepositoryFixture()) { fixture.Repository.MakeACommit(); Commands.Checkout(fixture.Repository, fixture.Repository.CreateBranch("feature/foo")); fixture.Repository.MakeACommit(); using (var localFixture = fixture.CloneRepository()) { localFixture.Checkout("feature/foo"); var expectedTip = localFixture.Repository.Head.Tip; // Advance remote fixture.Repository.MakeACommit(); GitRepositoryHelper.NormalizeGitDirectory(localFixture.RepositoryPath, new AuthenticationInfo(), noFetch: false, currentBranch: null); var normalisedBranch = localFixture.Repository.Branches["feature/foo"]; normalisedBranch.ShouldNotBe(null); normalisedBranch.Tip.Sha.ShouldBe(expectedTip.Sha); } } }