8000 Add TreeDefinition.AddGitLink() · freevoid/libgit2sharp@0058041 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0058041

Browse files
committed
Add TreeDefinition.AddGitLink()
1 parent 6d5efba commit 0058041

File tree

4 files changed

+195
-0
lines changed

4 files changed

+195
-0
lines changed

LibGit2Sharp.Tests/ObjectDatabaseFixture.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,48 @@ 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+
var submoduleBefore = repo.Submodules[submodulePath];
256+
Assert.NotNull(submoduleBefore);
257+
Assert.Null(submoduleBefore.HeadCommitId);
258+
259+
var objectId = (ObjectId)"480095882d281ed676fe5b863569520e54a7d5c0";
260+
261+
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree)
262+
.AddGitLink(submodulePath, objectId);
263+
264+
TreeEntryDefinition ted = td[submodulePath];
265+
Assert.NotNull(ted);
266+
Assert.Equal(Mode.GitLink, ted.Mode);
267+
Assert.Equal(objectId, ted.TargetId);
268+
Assert.Equal(GitObjectType.Commit, ted.Type);
269+
270+
Tree tree = repo.ObjectDatabase.CreateTree(td);
271+
272+
TreeEntry te = tree[submodulePath];
273+
Assert.NotNull(te.Target);
274+
Assert 10000 .IsType<GitLink>(te.Target);
275+
Assert.Equal(objectId, te.Target.Id);
276+
277+
var commitWithSubmodule = repo.ObjectDatabase.CreateCommit("Submodule!", DummySignature, DummySignature, tree,
278+
new[] { repo.Head.Tip });
279+
repo.Reset(ResetOptions.Soft, commitWithSubmodule);
280+
281+
var submodule = repo.Submodules[submodulePath];
282+
Assert.NotNull(submodule);
283+
Assert.Equal(submodulePath, submodule.Name);
284+
Assert.Equal(submodulePath, submodule.Path);
285+
Assert.Equal(objectId, submodule.HeadCommitId);
286+
}
287+
}
288+
247289
[Fact]
248290
public void CannotCreateATreeContainingABlobFromARelativePathAgainstABareRepository()
249291
{

LibGit2Sharp.Tests/TreeDefinitionFixture.cs

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,27 @@ public void CanAddAnExistingTreeEntryDefinition(string sourcePath, string target
111111
}
112112
}
113113

114+
[Fact]
115+
public void CanAddAnExistingGitLinkTreeEntryDefinition()
116+
{
117+
const string sourcePath = "sm_unchanged";
118+
const string targetPath = "sm_from_td";
119+
120+
using (var repo = new Repository(SubmoduleTestRepoWorkingDirPath))
121+
{
122+
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
123+
Assert.Null(td[targetPath]);
124+
125+
TreeEntryDefinition ted = td[sourcePath];
126+
td.Add(targetPath, ted);
127+
128+
TreeEntryDefinition fetched = td[targetPath];
129+
Assert.NotNull(fetched);
130+
131+
Assert.Equal(ted, fetched);
132+
}
133+
}
134+
114135
[Theory]
115136
[InlineData("a8233120f6ad708f843d861ce2b7228ec4e3dec6", "README_TOO")]
116137
[InlineData("a8233120f6ad708f843d861ce2b7228ec4e3dec6", "1/README")]
@@ -217,6 +238,109 @@ public void CanReplaceAnExistingBlobWithATree(string targetPath)
217238
}
218239
}
219240

241+
[Fact]
242+
public void CanReplaceAnExistingTreeWithAGitLink()
243+
{
244+
var commitId = (ObjectId)"480095882d281ed676fe5b863569520e54a7d5c0";
245+
const string targetPath = "just_a_dir";
246+
247+
using (var repo = new Repository(SubmoduleTestRepoWorkingDirPath))
248+
{
249+
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
250+
Assert.Equal(GitObjectType.Tree, td[targetPath].Type);
251+
252+
Assert.NotNull(td["just_a_dir/contents"]);
253+
254+
td.AddGitLink(targetPath, commitId);
255+
256+
TreeEntryDefinition fetched = td[targetPath];
257+
Assert.NotNull(fetched);
258+
259+
Assert.Equal(commitId, fetched.TargetId);
260+
Assert.Equal(GitObjectType.Commit, fetched.Type);
261+
Assert.Equal(Mode.GitLink, fetched.Mode);
262+
263+
Assert.Null(td["just_a_dir/contents"]);
264+
}
265+
}
266+
267+
[Fact]
268+
public void CanReplaceAnExistingGitLinkWithATree()
269+
{
270+
const string treeSha = "607d96653d4d0a4f733107f7890c2e67b55b620d";
271+
const string targetPath = "sm_unchanged";
272+
273+
using (var repo = new Repository(SubmoduleTestRepoWorkingDirPath))
274+
{
275+
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
276+
Assert.NotNull(td[targetPath]);
277+
Assert.Equal(GitObjectType.Commit, td[targetPath].Type);
278+
Assert.Equal(Mode.GitLink, td[targetPath].Mode);
279+
280+
var objectId = new ObjectId(treeSha);
281+
var tree = repo.Lookup<Tree>(objectId);
282+
283+
td.Add(targetPath, tree);
284+
285+
TreeEntryDefinition fetched = td[targetPath];
286+
Assert.NotNull(fetched);
287+
288+
Assert.Equal(objectId, fetched.TargetId);
289+
Assert.Equal(GitObjectType.Tree, fetched.Type);
290+
Assert.Equal(Mode.Directory, fetched.Mode);
291+
}
292+
}
293+
294+
[Fact]
295+
public void CanReplaceAnExistingBlobWithAGitLink()
296+
{
297+
var commitId = (ObjectId)"480095882d281ed676fe5b863569520e54a7d5c0";
298+
const string targetPath = "just_a_file";
299+
300+
using (var repo = new Repository(SubmoduleTestRepoWorkingDirPath))
301+
{
302+
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
303+
Assert.NotNull(td[targetPath]);
304+
Assert.Equal(GitObjectType.Blob, td[targetPath].Type);
305+
306+
td.AddGitLink(targetPath, commitId);
307+
308+
TreeEntryDefinition fetched = td[targetPath];
309+
Assert.NotNull(fetched);
310+
311+
Assert.Equal(GitObjectType.Commit, td[targetPath].Type);
312+
Assert.Equal(commitId, fetched.TargetId);
313+
Assert.Equal(Mode.GitLink, fetched.Mode);
314+
}
315+
}
316+
317+
[Fact]
318+
public void CanReplaceAnExistingGitLinkWithABlob()
319+
{
320+
const string blobSha = "42cfb95cd01bf9225b659b5ee3edcc78e8eeb478";
321+
const string targetPath = "sm_unchanged";
322+
323+
using (var repo = new Repository(SubmoduleTestRepoWorkingDirPath))
324+
{
325+
TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
326+
Assert.NotNull(td[targetPath]);
327+
Assert.Equal(GitObjectType.Commit, td[targetPath].Type);
328+
Assert.Equal(Mode.GitLink, td[targetPath].Mode);
329+
330+
var objectId = new ObjectId(blobSha);
331+
var blob = repo.Lookup<Blob>(objectId);
332+
333+
td.Add(targetPath, blob, Mode.NonExecutableFile);
334+
335+
TreeEntryDefinition fetched = td[targetPath];
336+
Assert.NotNull(fetched);
337+
338+
Assert.Equal(objectId, fetched.TargetId);
339+
Assert.Equal(GitObjectType.Blob, fetched.Type);
340+
Assert.Equal(Mode.NonExecutableFile, fetched.Mode);
341+
}
342+
}
343+
220344
[Fact]
221345
public void CanNotReplaceAnExistingTreeWithATreeBeingAssembled()
222346
{

LibGit2Sharp/TreeDefinition.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,23 @@ public virtual TreeDefinition Add(string targetTreeEntryPath, Tree tree)
174174
return Add(targetTreeEntryPath, ted);
175175
}
176176

177+
/// <summary>
178+
/// Adds or replaces a gitlink <see cref="TreeEntryDefinition"/>,
179+
/// referencing the commit identified by <paramref name="objectId"/>,
180+
/// at the specified <paramref name="targetTreeEntryPath"/> location.
181+
/// </summary>
182+
/// <param name="targetTreeEntryPath">The path within this <see cref="TreeDefinition"/>.</param>
183+
/// <param name="objectId">The <see cref="ObjectId"/> of the commit to be linked at the described location.</param>
184+
/// <returns>The current <see cref="TreeDefinition"/>.</returns>
185+
public virtual TreeDefinition AddGitLink(string targetTreeEntryPath, ObjectId objectId)
186+
{
187+
Ensure.ArgumentNotNull(objectId, "objectId");
188+
189+
var ted = TreeEntryDefinition.From(objectId);
190+
191+
return Add(targetTreeEntryPath, ted);
192+
}
193+
177194
private TreeDefinition RetrieveOrBuildTreeDefinition(string treeName, bool shouldOverWrite)
178195
{
179196
TreeDefinition td;
@@ -195,6 +212,7 @@ private TreeDefinition RetrieveOrBuildTreeDefinition(string treeName, bool shoul
195212
break;
196213

197214
case GitObjectType.Blob:
215+
case GitObjectType.Commit:
198216
if (shouldOverWrite)
199217
{
200218
td = new TreeDefinition();

LibGit2Sharp/TreeEntryDefinition.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,17 @@ internal static TreeEntryDefinition TransientBlobFrom(string filePath, Mode mode
7676
};
7777
}
7878

79+
internal static TreeEntryDefinition From(ObjectId objectId)
80+
{
81+
return new TreeEntryDefinition
82+
{
83+
Mode = Mode.GitLink,
84+
Type = GitObjectType.Commit,
85+
TargetId = objectId,
86+
target = new Lazy<GitObject>(() => { throw new InvalidOperationException("Shouldn't be necessary."); }),
87+
};
88+
}
89+
7990
internal static TreeEntryDefinition From(Tree tree)
8091
{
8192
return new TreeEntryDefinition

0 commit comments

Comments
 (0)
0