libgit2 / libgit2/libgit2sharp

Please consider adding AOT support for .Diff.Compare<T>()

Open
#2,082 18 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
C#
Stars
3.5k
Forks
925
PR merge metrics
No merged PRs in 30d

Description

When utilizing libgit2sharp in combination with the .NET 8 PublishAot feature, all repository creation, file staging and committing operations are successful, however, the git diff function throws a NullReferenceException.

Is there a way to get this working under AOT?

Steps To Reproduce:
  1. Create a .NET 8 console project
    dotnet new console -o aot-test
    cd aot-test
    
  2. Adjust aot-test.csproj to include libgit2sharp reference and activate PublishAot feature
    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
    	<OutputType>Exe</OutputType>
    	<TargetFramework>net8.0</TargetFramework>
    	<RootNamespace>aot_test</RootNamespace>
    	<ImplicitUsings>enable</ImplicitUsings>
    	<Nullable>enable</Nullable>
    	<PublishAot>true</PublishAot>
      </PropertyGroup>
    
      <ItemGroup>
    	<PackageReference Include="libgit2sharp" Version="0.29.0" />
      </ItemGroup>
    
    </Project>
    
  3. Insert the following code into Progmram.cs:
using LibGit2Sharp;

var path = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
Directory.CreateDirectory(path);
Repository.Init(path, false);
var userName = "Tester";
var email = "tester@mail.net";
Func<Signature> getSignature = () => new Signature(userName, email, DateTimeOffset.Now);
using (var repo = new Repository(path))
{
    var fileName = "test.txt";
    var filePath = Path.Combine(path, fileName);
    File.WriteAllText(filePath, "Hello, World!");
    Commands.Stage(repo, fileName);
    var commit1 = repo.Commit("Initial commit", getSignature(), getSignature());
    File.AppendAllText(filePath, "\nAppended Line");
    Commands.Stage(repo, fileName);
    var commit2 = repo.Commit("Second commit", getSignature(), getSignature());
    Console.WriteLine($"Commits Count {repo.Commits.Count()}");
    var changes = repo.Diff.Compare<Patch>(commit1.Tree, commit2.Tree);
    Console.WriteLine($"Diff Changes Count = {changes.Count()}");
}
  1. Use dotnet run for testing, it will display:
Commits Count 2
Diff Changes Count = 1
  1. Use dotnet publish, .\bin\Release\net8.0\win-x64\publish\aot-test.exe to test the native AOT version, it throws an exception on repo.Diff.Compare<Patch>():
Commits Count 2
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
   at aot-test!<BaseAddress>+0x19af4c
   at aot-test!<BaseAddress>+0x199437
Current Behavior:

The native AOT functions for repository creation, file staging, and committing operations are functional, but the git diff function is not.

Anticipated Behavior:

Please consider adding AOT support for the git diff API.

Version of LibGit2Sharp (release number or SHA1)

0.29.0

Operating system(s) tested; .NET runtime tested
  • OS: Windows 11
  • .NET: 8.0.100

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the .NET 8 console project and its aot-test.csproj/Program.cs setup, then reproduce the failure with dotnet publish and repo.Diff.Compare(commit1.Tree, commit2.Tree). Done means the native AOT executable completes the diff call and reports one diff change instead of throwing NullReferenceException.

Written by the indexing model from the issue text.

Assessment

Tech stack
csharp
Domain
api
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.