From f192fc75081cc10a041dc49a9586ef8b4ae78787 Mon Sep 17 00:00:00 2001 From: yorah Date: Thu, 28 Mar 2013 17:47:09 +0100 Subject: [PATCH] Show how to clone/commit/push from a local bare repository Linked to http://stackoverflow.com/questions/15656086 --- LibGit2Sharp.Tests/CloneFixture.cs | 45 ++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/LibGit2Sharp.Tests/CloneFixture.cs b/LibGit2Sharp.Tests/CloneFixture.cs index f5f005d19..fa08a000a 100644 --- a/LibGit2Sharp.Tests/CloneFixture.cs +++ b/LibGit2Sharp.Tests/CloneFixture.cs @@ -50,6 +50,51 @@ private void AssertLocalClone(string path) } } + [Fact] + public void CanLocallyCloneAndCommitAndPush() + { + var scd = BuildSelfCleaningDirectory(); + using (var originalRepo = new Repository(BuildTemporaryCloneOfTestRepo(BareTestRepoPath).RepositoryPath)) + using (Repository clonedRepo = Repository.Clone(originalRepo.Info.Path, scd.RootedDirectoryPath)) + { + Remote remote = clonedRepo.Network.Remotes["origin"]; + + // Compare before + Assert.Equal(originalRepo.Refs["HEAD"].ResolveToDirectReference().TargetIdentifier, + clonedRepo.Refs["HEAD"].ResolveToDirectReference().TargetIdentifier); + Assert.Equal(clonedRepo.Network.ListReferences(remote).Single(r => r.CanonicalName == "refs/heads/master"), + clonedRepo.Refs.Head.ResolveToDirectReference()); + + // Change local state (commit) + const string relativeFilepath = "new_file.txt"; + string filePath = Path.Combine(clonedRepo.Info.WorkingDirectory, relativeFilepath); + File.WriteAllText(filePath, "__content__"); + clonedRepo.Index.Stage(relativeFilepath); + clonedRepo.Commit("__commit_message__", DummySignature, DummySignature); + + // Assert local state has changed + Assert.NotEqual(originalRepo.Refs["HEAD"].ResolveToDirectReference().TargetIdentifier, + clonedRepo.Refs["HEAD"].ResolveToDirectReference().TargetIdentifier); + Assert.NotEqual(clonedRepo.Network.ListReferences(remote).Single(r => r.CanonicalName == "refs/heads/master"), + clonedRepo.Refs.Head.ResolveToDirectReference()); + + // Push the change upstream (remote state is supposed to change) + clonedRepo.Network.Push(remote, "HEAD", @"refs/heads/master", OnPushStatusError); + + // Assert that both local and remote repos are in sync + Assert.Equal(originalRepo.Refs["HEAD"].ResolveToDirectReference().TargetIdentifier, + clonedRepo.Refs["HEAD"].ResolveToDirectReference().TargetIdentifier); + Assert.Equal(clonedRepo.Network.ListReferences(remote).Single(r => r.CanonicalName == "refs/heads/master"), + clonedRepo.Refs.Head.ResolveToDirectReference()); + } + } + + private void OnPushStatusError(PushStatusError pushStatusErrors) + { + Assert.True(false, string.Format("Failed to update reference '{0}': {1}", + pushStatusErrors.Reference, pushStatusErrors.Message)); + } + [Fact] public void CanCloneALocalRepositoryFromALocalUri() {