I checked code in BlobFixture.cs and found some tests about reading file's contents like below.
using (var repo = new Repository(BareTestRepoPath))
{
    var blob = repo.Lookup<Blob>("a8233120f6ad708f843d861ce2b7228ec4e3dec6");
    var contentStream = blob.GetContentStream();
    Assert.Equal(blob.Size, contentStream.Length);
    using (var tr = new StreamReader(contentStream, Encoding.UTF8))
    {
        string content = tr.ReadToEnd();
        Assert.Equal("hey there\n", content);
    }
}
But I cannot find a test that getting file's contents based on file's name. Is it possible to do that, if so how?
Each Tree holds a collection of TreeEntry. A TreeEntry holds some metadata (name, mode, oid, ...) about a pointed at GitObject. The GitObject can be accessed through the Target property of a TreeEntry instance.
Most of the time, a TreeEntry will point to a Blob or another Tree.
The Tree type exposes an indexer which accepts a path to easily retrieve the finally pointed at TreeEntry. As a convenience method, the Commit exposes such an indexer as well.
Thus your code could be expressed this way.
using (var repo = new Repository(BareTestRepoPath))
{
    var commit = repo.Lookup<Commit>("deadbeefcafe"); // or any other way to retreive a specific commit
    var treeEntry = commit["path/to/my/file.txt");
    Debug.Assert(treeEntry.TargetType == TreeEntryTargetType.Blob);
    var blob = (Blob)treeEntry.Target;
    var contentStream = blob.GetContentStream();
    Assert.Equal(blob.Size, contentStream.Length);
    using (var tr = new StreamReader(contentStream, Encoding.UTF8))
    {
        string content = tr.ReadToEnd();
        Assert.Equal("hey there\n", content);
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With