libgit2 / libgit2/libgit2sharp

OutOfMemory Error with Repository.Diff.Compare<Patch>(...)

Ouverte
#1,411 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
C#
Étoiles
3.5k
Forks
925
Métriques de merge des PR
Aucune PR mergée en 30 j

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.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par suivre le chemin d’appel signalé à travers Core/Ensure.cs, Core/Proxy.cs, PatchStats.cs et Diff.cs, puis examinez la discussion Stack Overflow liée. Reproduisez l’échec avec Repository.Diff.Compare sur un dépôt ayant un historique de commits comparable et déterminez quelle opération conserve une quantité excessive de mémoire. Le travail est considéré comme terminé lorsque la comparaison s’achève sans l’OutOfMemoryException signalée et qu’une couverture de régression est ajoutée pour le cas en échec.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
csharp, git
Domaine
devtools, performance
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.