Skip to content

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

Open
@darkthread

Description

@darkthread

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions