Skip to content

Add RevWalker - #2038

Open
jairbubbles wants to merge 33 commits into
libgit2:masterfrom
jairbubbles:add-revwalker
Open

Add RevWalker#2038
jairbubbles wants to merge 33 commits into
libgit2:masterfrom
jairbubbles:add-revwalker

Conversation

@jairbubbles

Copy link
Copy Markdown
Contributor

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;
    }
}
 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

3 participants