Skip to content

Commit 7e9a38c

Browse files
committed
Add ObjectDatabase.CreateGitLink()
Also, test manually adding new Submodule via TreeDefinition.
1 parent 05cc6bd commit 7e9a38c

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

LibGit2Sharp.Tests/ObjectDatabaseFixture.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,52 @@ public void CanCreateATreeContainingABlobFromAFileInTheWorkingDirectory()
244244
}
245245
}
246246

247+
[Fact]
248+
public void CanCreateATreeContainingAGitLinkFromAnUntrackedSubmoduleInTheWorkingDirectory()
249+
{
250+
string path = CloneSubmoduleTestRepo();
251+
using (var repo = new Repository(path))
252+
{
253+
const string submodulePath = "sm_added_and_uncommited";
254+
255+
/* Unexpected behavior: test fails if this is uncommented... libgit2 caching?
256+
var submoduleBefore = repo.Submodules[submodulePath];
257+
Assert.NotNull(submoduleBefore);
258+
Assert.Null(submoduleBefore.HeadCommitId);
259+
/**/
260+
261+
var gitLink = repo.ObjectDatabase.CreateGitLink((ObjectId)"480095882d281ed676fe5b863569520e54a7d5c0");
262+
263+
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree)
264+
.Add(submodulePath, gitLink);
265+
266+
TreeEntryDefinition ted = td[submodulePath];
267+
Assert.NotNull(ted);
268+
Assert.Equal(Mode.GitLink, ted.Mode);
269+
Assert.Equal(gitLink.Id, ted.TargetId);
270+
Assert.Equal(GitObjectType.Commit, ted.Type);
271+
272+
Tree tree = repo.ObjectDatabase.CreateTree(td);
273+
274+
TreeEntry te = tree[submodulePath];
275+
Assert.NotNull(te.Target);
276+
Assert.IsType<GitLink>(te.Target);
277+
Assert.Equal(gitLink.Id, te.Target.Id);
278+
279+
var commitWithSubmodule = repo.ObjectDatabase.CreateCommit("Submodule!", DummySignature, DummySignature, tree,
280+
new[] { repo.Head.Tip });
281+
repo.Reset(ResetOptions.Soft, commitWithSubmodule);
282+
283+
var submodule = repo.Submodules[submodulePath];
284+
Assert.NotNull(submodule);
285+
Assert.Equal(submodulePath, submodule.Name);
286+
Assert.Equal(submodulePath, submodule.Path);
287+
288+
// This fails with HeadCommitId == null if lines above are uncommented
289+
Assert.Equal(gitLink.Id, submodule.HeadCommitId);
290+
}
291+
}
292+
247293
[Fact]
248294
public void CannotCreateATreeContainingABlobFromARelativePathAgainstABareRepository()
249295
{

LibGit2Sharp/ObjectDatabase.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,16 @@ public virtual Blob CreateBlob(BinaryReader reader, string hintpath = null)
118118
return repo.Lookup<Blob>(id);
119119
}
120120

121+
/// <summary>
122+
/// Creates a gitlink referencing the commit identified by <paramref name="objectId"/> in another repository.
123+
/// </summary>
124+
/// <param name="objectId">Identifier of the commit.</param>
125+
/// <returns>The created <see cref = "GitLink"/>.</returns>
126+
public virtual GitLink CreateGitLink(ObjectId objectId)
127+
{
128+
return new GitLink(repo, objectId);
129+
}
130+
121131
/// <summary>
122132
/// Inserts a <see cref = "Tree"/> into the object database, created from a <see cref = "TreeDefinition"/>.
123133
/// </summary>

0 commit comments

Comments
 (0)