Skip to content

Conversation

jairbubbles
Copy link
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
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants