libgit2 / libgit2sharp

Git + .NET = ❤
http://libgit2.github.com
MIT License
3.17k stars 886 forks source link

Add RevWalker #2038

Open jairbubbles opened 1 year ago

jairbubbles commented 1 year ago

This allows more flexibility than CommitLog and allows to traverse the repository multiple times more efficiently.

using var repository = new Repository(@"<repo_path>");
using var revWalker = new RevWalker(repository);

// Store commits in a cache to speed up multiple walks on same repository
var commitsCache = new Dictionary<ObjectId, Commit>();

revWalker.Reset();
revWalker.Sorting(CommitSortStrategies.Topological);

revWalker.PushGlob("refs/tags/*");

var commits = GetCommits().ToArray();

// Subsequent walk will reuse commits cache and internal RevWalker cache
revWalker.Reset();
revWalker.PushRef("HEAD");

commits = GetCommits().ToArray();

IEnumerable<Commit> GetCommits()
{
    while (true)
    {
        var objectId = revWalker.Next();
        if (objectId == null)
            break;

        if (!commitsCache.TryGetValue(objectId, out var commit))
        {
            commit = repository.Lookup<Commit>(objectId);
            commitsCache[objectId] = commit;
        }

        yield return commit;
    }
}