Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions LibGit2Sharp.Tests/FilterBranchFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,34 @@ public void CanRewriteTrees()
Assert.True(repo.Head.Commits.All(c => c["README"] == null));
}

[Fact]
public void CanRewriteTreesByInjectingTreeEntry()
{
var commits = repo.Commits.QueryBy(new CommitFilter { Since = repo.Branches }).ToArray();

var currentReadme = repo.Head["README"];

repo.Refs.RewriteHistory(new RewriteHistoryOptions
{
OnError = OnError,
OnSucceeding = OnSucceeding,
CommitTreeRewriter =
c => c["README"] == null
? TreeDefinition.From(c)
: TreeDefinition.From(c)
.Add("README", currentReadme),
}, commits);

AssertSucceedingButNotError();

Assert.Equal(new Commit[0],
repo.Commits
.QueryBy(new CommitFilter {Since = repo.Branches})
.Where(c => c["README"] != null
&& c["README"].Target.Id != currentReadme.Target.Id)
.ToArray());
}

// git log --graph --oneline --name-status --decorate
//
// * 4c062a6 (HEAD, master) directory was added
Expand Down
56 changes: 56 additions & 0 deletions LibGit2Sharp.Tests/TreeDefinitionFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,13 @@ private static Mode ToMode(string expectedAttributes)
[Theory]
[InlineData("README", "README_TOO")]
[InlineData("README", "1/README")]
[InlineData("README", "1/2/README")]
[InlineData("1/branch_file.txt", "1/another_one.txt")]
[InlineData("1/branch_file.txt", "another_one.txt")]
[InlineData("1/branch_file.txt", "1/2/another_one.txt")]
[InlineData("1/branch_file.txt", "1/2/3/another_one.txt")]
[InlineData("1", "2")]
[InlineData("1", "2/3")]
public void CanAddAnExistingTreeEntryDefinition(string sourcePath, string targetPath)
{
using (var repo = new Repository(BareTestRepoPath))
Expand Down Expand Up @@ -132,6 +136,58 @@ public void CanAddAnExistingGitLinkTreeEntryDefinition()
}
}

[Theory]
[InlineData("README", "README_TOO")]
[InlineData("README", "1/README")]
[InlineData("README", "1/2/README")]
[InlineData("1/branch_file.txt", "1/another_one.txt")]
[InlineData("1/branch_file.txt", "another_one.txt")]
[InlineData("1/branch_file.txt", "1/2/another_one.txt")]
[InlineData("1/branch_file.txt", "1/2/3/another_one.txt")]
[InlineData("1", "2")]
[InlineData("1", "2/3")]
public void CanAddAnExistingTreeEntry(string sourcePath, string targetPath)
{
using (var repo = new Repository(BareTestRepoPath))
{
var tree = repo.Head.Tip.Tree;
var td = TreeDefinition.From(tree);
Assert.Null(td[targetPath]);

var te = tree[sourcePath];
td.Add(targetPath, te);

var fetched = td[targetPath];
Assert.NotNull(fetched);

Assert.Equal(te.Target.Id, fetched.TargetId);
}
}

[Theory]
[InlineData("sm_from_td")]
[InlineData("1/sm_from_td")]
[InlineData("1/2/sm_from_td")]
public void CanAddAnExistingGitLinkTreeEntry(string targetPath)
{
const string sourcePath = "sm_unchanged";

using (var repo = new Repository(SubmoduleTestRepoWorkingDirPath))
{
var tree = repo.Head.Tip.Tree;
var td = TreeDefinition.From(tree);
Assert.Null(td[targetPath]);

var te = tree[sourcePath];
td.Add(targetPath, te);

var fetched = td[targetPath];
Assert.NotNull(fetched);

Assert.Equal(te.Target.Id, fetched.TargetId);
}
}

[Theory]
[InlineData("a8233120f6ad708f843d861ce2b7228ec4e3dec6", "README_TOO")]
[InlineData("a8233120f6ad708f843d861ce2b7228ec4e3dec6", "1/README")]
Expand Down
17 changes: 16 additions & 1 deletion LibGit2Sharp/TreeDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public static TreeDefinition From(Tree tree)

foreach (TreeEntry treeEntry in tree)
{
td.AddEntry(treeEntry.Name, TreeEntryDefinition.From(treeEntry));
td.Add(treeEntry.Name, treeEntry);
}

return td;
Expand Down Expand Up @@ -137,6 +137,21 @@ public virtual TreeDefinition Add(string targetTreeEntryPath, TreeEntryDefinitio
return this;
}

/// <summary>
/// Adds or replaces a <see cref="TreeEntryDefinition"/>, built from the provided <see cref="TreeEntry"/>, at the specified <paramref name="targetTreeEntryPath"/> location.
/// </summary>
/// <param name="targetTreeEntryPath">The path within this <see cref="TreeDefinition"/>.</param>
/// <param name="treeEntry">The <see cref="TreeEntry"/> to be stored at the described location.</param>
/// <returns>The current <see cref="TreeDefinition"/>.</returns>
public virtual TreeDefinition Add(string targetTreeEntryPath, TreeEntry treeEntry)
{
Ensure.ArgumentNotNull(treeEntry, "treeEntry");

TreeEntryDefinition ted = TreeEntryDefinition.From(treeEntry);

return Add(targetTreeEntryPath, ted);
}

/// <summary>
/// Adds or replaces a <see cref="TreeEntryDefinition"/>, dynamically built from the provided <see cref="Blob"/>, at the specified <paramref name="targetTreeEntryPath"/> location.
/// </summary>
Expand Down