libgit2 / libgit2/libgit2sharp
OutOfMemory Error with Repository.Diff.Compare<Patch>(...)
Nobody has claimed this yet.
- Dominant language
- C#
- Stars
- 3.5k
- Forks
- 925
- PR merge metrics
- No merged PRs in 30d
Description
I get an OutOfMemoryException from Repository.Diff with v0.22.0:
LibGit2Sharp.LibGit2SharpException: Out of memory
at LibGit2Sharp.Core.Ensure.HandleError(Int32 result) in c:\Git\libgit2sharp\LibGit2Sharp\Core\Ensure.cs:line 160
at LibGit2Sharp.Core.Proxy.git_patch_from_diff(DiffSafeHandle diff, Int32 idx) in c:\Git\libgit2sharp\LibGit2Sharp\Core\Proxy.cs:line 1555
at LibGit2Sharp.PatchStats..ctor(DiffSafeHandle diff) in c:\Git\libgit2sharp\LibGit2Sharp\PatchStats.cs:line 31
at LibGit2Sharp.Diff.<.cctor>b__1d(DiffSafeHandle diff) in c:\Git\libgit2sharp\LibGit2Sharp\Diff.cs:line 106
at LibGit2Sharp.Diff.BuildDiffResult[T](DiffSafeHandle diff) in c:\Git\libgit2sharp\LibGit2Sharp\Diff.cs:line 120
at LibGit2Sharp.Diff.Compare[T](Tree oldTree, Tree newTree, IEnumerable`1 paths, ExplicitPathsOptions explicitPathsOptions, CompareOptions compareOptions) in c:\Git\libgit2sharp\LibGit2Sharp\Diff.cs:line 246
at LibGit2Sharp.Diff.Compare[T](Tree oldTree, Tree newTree) in c:\Git\libgit2sharp\LibGit2Sharp\Diff.cs:line 157
at ABB.QueryManager.Models.Git.GitCodeChurnToCsvConverter.<GetRowData>d__7.MoveNext() in C:\Workspace\Source\TeamMetrics\QueryManager\QueryManager\Models\Git\GitCodeChurnToCsvConverter.cs:line 52
I'm trying to produce some basic code churn statistics from a Git repository. As some context, I'm implementing this in an ASP.NET application in a Hangfire job.
For each branch, I'm iterating over all of the commits and comparing them to their predecessor. I generate a patch per commit, and generate data for each file path in the commit. Here is the code I'm using:
foreach (var branch in repo.Branches.Where(b => b.Tip.Committer.When >= startDate))
{
Commit nextCommit = null;
foreach (var currentCommit in branch.Commits.Where(c => c.Committer.When >= startDate))
{
if(null == nextCommit)
{
foreach (var change in repo.Diff.Compare<Patch>(currentCommit.Tree, nextCommit.Tree))
{
var data = new string[]
{
nextCommit.Id.Sha,
branch.FriendlyName,
change.Path,
change.Status.ToString(),
change.IsBinaryComparison.ToString(),
GetFileSize(nextCommit, change.Path).ToString(),
GetLineCount(nextCommit, change.Path).ToString(),
change.LinesAdded.ToString(),
change.LinesDeleted.ToString()
}
yield return data;
}
}
nextCommit = currentCommit;
}
}
I found this related Stack Overflow question: libgit2sharp.Patch outofmemory. I tried changing my code to produce both a TreeChanges and a PatchStats, but it fails as well.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by tracing the reported call path through Core/Ensure.cs, Core/Proxy.cs, PatchStats.cs, and Diff.cs, then review the linked Stack Overflow discussion. Reproduce the failure with Repository.Diff.Compare on a repository with comparable commit history and determine which operation retains excessive memory. Done means the comparison completes without the reported OutOfMemoryException and regression coverage is added for the failing case.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- csharp, git
- Domain
- devtools, performance
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100