Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2sharp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2017-11-27 13:37:56 +0300
committerGitHub <noreply@github.com>2017-11-27 13:37:56 +0300
commit69578cace49fce517d48fb4969709b70e4f1e838 (patch)
tree39315bb19b1f76280e1336928104a9027aca3e11
parent53900ea76d89b77bd70ca8cb5c2168afe9e36f52 (diff)
parent4b720c5acedf3d5be4c59f7ed44acc6114faf3e4 (diff)
Merge pull request #1519 from libgit2/ethomson/tree_entries_by_id
TreeDefinition: allow `Add` a blob by ID
-rw-r--r--LibGit2Sharp.Tests/TreeDefinitionFixture.cs43
-rw-r--r--LibGit2Sharp/TreeDefinition.cs17
-rw-r--r--LibGit2Sharp/TreeEntryDefinition.cs15
3 files changed, 75 insertions, 0 deletions
diff --git a/LibGit2Sharp.Tests/TreeDefinitionFixture.cs b/LibGit2Sharp.Tests/TreeDefinitionFixture.cs
index 9011cad8..c31bd588 100644
--- a/LibGit2Sharp.Tests/TreeDefinitionFixture.cs
+++ b/LibGit2Sharp.Tests/TreeDefinitionFixture.cs
@@ -266,6 +266,49 @@ namespace LibGit2Sharp.Tests
}
}
+ [Theory]
+ [InlineData("a8233120f6ad708f843d861ce2b7228ec4e3dec6", "README_TOO")]
+ [InlineData("a8233120f6ad708f843d861ce2b7228ec4e3dec6", "1/README")]
+ [InlineData("45b983be36b73c0788dc9cbcb76cbb80fc7bb057", "1/another_one.txt")]
+ [InlineData("45b983be36b73c0788dc9cbcb76cbb80fc7bb057", "another_one.txt")]
+ public void CanAddBlobById(string blobSha, string targetPath)
+ {
+ string path = SandboxBareTestRepo();
+ using (var repo = new Repository(path))
+ {
+ TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
+ Assert.Null(td[targetPath]);
+
+ var objectId = new ObjectId(blobSha);
+
+ td.Add(targetPath, objectId, Mode.NonExecutableFile);
+
+ TreeEntryDefinition fetched = td[targetPath];
+ Assert.NotNull(fetched);
+
+ Assert.Equal(objectId, fetched.TargetId);
+ Assert.Equal(Mode.NonExecutableFile, fetched.Mode);
+ }
+ }
+
+ [Fact]
+ public void CannotAddTreeById()
+ {
+ const string treeSha = "7f76480d939dc401415927ea7ef25c676b8ddb8f";
+ const string targetPath = "1/2";
+
+ string path = SandboxBareTestRepo();
+ using (var repo = new Repository(path))
+ {
+ TreeDefinition td = TreeDefinition.From(repo.Head.Tip.Tree);
+ Assert.Null(td[targetPath]);
+
+ var objectId = new ObjectId(treeSha);
+
+ Assert.Throws<ArgumentException>(() => td.Add(targetPath, objectId, Mode.Directory));
+ }
+ }
+
[Fact]
public void CanAddAnExistingSubmodule()
{
diff --git a/LibGit2Sharp/TreeDefinition.cs b/LibGit2Sharp/TreeDefinition.cs
index 1830ed55..73c21aac 100644
--- a/LibGit2Sharp/TreeDefinition.cs
+++ b/LibGit2Sharp/TreeDefinition.cs
@@ -202,6 +202,23 @@ namespace LibGit2Sharp
}
/// <summary>
+ /// Adds or replaces a <see cref="TreeEntryDefinition"/> from an existing blob specified by its Object ID at the specified <paramref name="targetTreeEntryPath"/> location.
+ /// </summary>
+ /// <param name="targetTreeEntryPath">The path within this <see cref="TreeDefinition"/>.</param>
+ /// <param name="id">The object ID for this entry.</param>
+ /// <param name="mode">The file related <see cref="Mode"/> attributes.</param>
+ /// <returns>The current <see cref="TreeDefinition"/>.</returns>
+ public virtual TreeDefinition Add(string targetTreeEntryPath, ObjectId id, Mode mode)
+ {
+ Ensure.ArgumentNotNull(id, "id");
+ Ensure.ArgumentConformsTo(mode, m => m.HasAny(TreeEntryDefinition.BlobModes), "mode");
+
+ TreeEntryDefinition ted = TreeEntryDefinition.From(id, mode);
+
+ return Add(targetTreeEntryPath, ted);
+ }
+
+ /// <summary>
/// Adds or replaces a <see cref="TreeEntryDefinition"/>, dynamically built from the provided <see cref="Tree"/>, at the specified <paramref name="targetTreeEntryPath"/> location.
/// </summary>
/// <param name="targetTreeEntryPath">The path within this <see cref="TreeDefinition"/>.</param>
diff --git a/LibGit2Sharp/TreeEntryDefinition.cs b/LibGit2Sharp/TreeEntryDefinition.cs
index b89c5930..2a3ceb35 100644
--- a/LibGit2Sharp/TreeEntryDefinition.cs
+++ b/LibGit2Sharp/TreeEntryDefinition.cs
@@ -54,6 +54,8 @@ namespace LibGit2Sharp
internal static TreeEntryDefinition From(Blob blob, Mode mode)
{
+ Ensure.ArgumentNotNull(blob, "blob");
+
return new TreeEntryDefinition
{
Mode = mode,
@@ -63,6 +65,19 @@ namespace LibGit2Sharp
};
}
+ internal static TreeEntryDefinition From(ObjectId id, Mode mode)
+ {
+ Ensure.ArgumentNotNull(id, "id");
+ Ensure.ArgumentNotNull(mode, "mode");
+
+ return new TreeEntryDefinition
+ {
+ Mode = mode,
+ TargetType = TreeEntryTargetType.Blob,
+ TargetId = id
+ };
+ }
+
internal static TreeEntryDefinition TransientBlobFrom(string filePath, Mode mode)
{
Ensure.ArgumentConformsTo(mode, m => m.HasAny(BlobModes), "mode");