Skip to content

Commit 1f50a0f

Browse files
committed
Get rid of StatusEntrySafeHandle
This includes using pointers for some diff entries, which this uses.
1 parent 707bbc7 commit 1f50a0f

13 files changed

+67
-116
lines changed

LibGit2Sharp/ContentChanges.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class ContentChanges
2020
protected ContentChanges()
2121
{ }
2222

23-
internal ContentChanges(Repository repo, Blob oldBlob, Blob newBlob, GitDiffOptions options)
23+
internal unsafe ContentChanges(Repository repo, Blob oldBlob, Blob newBlob, GitDiffOptions options)
2424
{
2525
Proxy.git_diff_blobs(repo.Handle,
2626
oldBlob != null ? oldBlob.Id : null,
@@ -64,9 +64,9 @@ public virtual string Patch
6464
/// </summary>
6565
public virtual bool IsBinaryComparison { get; private set; }
6666

67-
private int FileCallback(GitDiffDelta delta, float progress, IntPtr payload)
67+
private unsafe int FileCallback(git_diff_delta* delta, float progress, IntPtr payload)
6868
{
69-
IsBinaryComparison = delta.IsBinary();
69+
IsBinaryComparison = delta->flags.HasFlag(GitDiffFlags.GIT_DIFF_FLAG_BINARY);
7070

7171
if (!IsBinaryComparison)
7272
{
@@ -78,15 +78,15 @@ private int FileCallback(GitDiffDelta delta, float progress, IntPtr payload)
7878
return 0;
7979
}
8080

81-
private int HunkCallback(GitDiffDelta delta, GitDiffHunk hunk, IntPtr payload)
81+
private unsafe int HunkCallback(git_diff_delta* delta, GitDiffHunk hunk, IntPtr payload)
8282
{
8383
string decodedContent = LaxUtf8Marshaler.FromBuffer(hunk.Header, (int)hunk.HeaderLen);
8484

8585
AppendToPatch(decodedContent);
8686
return 0;
8787
}
8888

89-
private int LineCallback(GitDiffDelta delta, GitDiffHunk hunk, GitDiffLine line, IntPtr payload)
89+
private unsafe int LineCallback(git_diff_delta* delta, GitDiffHunk hunk, GitDiffLine line, IntPtr payload)
9090
{
9191
string decodedContent = LaxUtf8Marshaler.FromNative(line.content, (int)line.contentLen);
9292

LibGit2Sharp/Core/GitDiff.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -235,24 +235,24 @@ internal enum GitDiffFlags
235235
}
236236

237237
[StructLayout(LayoutKind.Sequential)]
238-
internal class GitDiffFile
238+
internal unsafe struct git_diff_file
239239
{
240-
public GitOid Id;
241-
public IntPtr Path;
240+
public git_oid Id;
241+
public char* Path;
242242
public Int64 Size;
243243
public GitDiffFlags Flags;
244244
public UInt16 Mode;
245245
}
246246

247247
[StructLayout(LayoutKind.Sequential)]
248-
internal class GitDiffDelta
248+
internal unsafe struct git_diff_delta
249249
{
250-
public ChangeKind Status;
251-
public GitDiffFlags Flags;
252-
public UInt16 Similarity;
253-
public UInt16 NumberOfFiles;
254-
public GitDiffFile OldFile;
255-
public GitDiffFile NewFile;
250+
public ChangeKind status;
251+
public GitDiffFlags flags;
252+
public UInt16 similarity;
253+
public UInt16 nfiles;
254+
public git_diff_file old_file;
255+
public git_diff_file new_file;
256256
}
257257

258258
[StructLayout(LayoutKind.Sequential)]

LibGit2Sharp/Core/GitDiffExtensions.cs

Lines changed: 0 additions & 10 deletions
This file was deleted.

LibGit2Sharp/Core/GitStatusEntry.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,21 @@ namespace LibGit2Sharp.Core
77
/// A status entry from libgit2.
88
/// </summary>
99
[StructLayout(LayoutKind.Sequential)]
10-
internal class GitStatusEntry
10+
internal unsafe struct git_status_entry
1111
{
1212
/// <summary>
1313
/// Calculated status of a filepath in the working directory considering the current <see cref = "Repository.Index" /> and the <see cref="Repository.Head" />.
1414
/// </summary>
15-
public FileStatus Status;
15+
public FileStatus status;
1616

1717
/// <summary>
1818
/// The difference between the <see cref="Repository.Head" /> and <see cref = "Repository.Index" />.
1919
/// </summary>
20-
public IntPtr HeadToIndexPtr;
20+
public git_diff_delta* head_to_index;
2121

2222
/// <summary>
2323
/// The difference between the <see cref = "Repository.Index" /> and the working directory.
2424
/// </summary>
25-
public IntPtr IndexToWorkDirPtr;
25+
public git_diff_delta* index_to_workdir;
2626
}
2727
}

LibGit2Sharp/Core/Handles/StatusEntrySafeHandle.cs

Lines changed: 0 additions & 23 deletions
This file was deleted.

LibGit2Sharp/Core/NativeMethods.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -512,24 +512,24 @@ internal static extern unsafe int git_diff_tree_to_workdir(
512512
GitObjectSafeHandle oldTree,
513513
GitDiffOptions options);
514514

515-
internal delegate int git_diff_file_cb(
516-
[In] GitDiffDelta delta,
515+
internal unsafe delegate int git_diff_file_cb(
516+
[In] git_diff_delta* delta,
517517
float progress,
518518
IntPtr payload);
519519

520-
internal delegate int git_diff_hunk_cb(
521-
[In] GitDiffDelta delta,
520+
internal unsafe delegate int git_diff_hunk_cb(
521+
[In] git_diff_delta* delta,
522522
[In] GitDiffHunk hunk,
523523
IntPtr payload);
524524

525-
internal delegate int git_diff_line_cb(
526-
[In] GitDiffDelta delta,
525+
internal unsafe delegate int git_diff_line_cb(
526+
[In] git_diff_delta* delta,
527527
[In] GitDiffHunk hunk,
528528
[In] GitDiffLine line,
529529
IntPtr payload);
530530

531-
internal delegate int git_diff_binary_cb(
532-
[In] GitDiffDelta delta,
531+
internal unsafe delegate int git_diff_binary_cb(
532+
[In] git_diff_delta* delta,
533533
[In] GitDiffBinary binary,
534534
IntPtr payload);
535535

@@ -564,7 +564,7 @@ internal static extern int git_diff_find_similar(
564564
internal static extern UIntPtr git_diff_num_deltas(DiffSafeHandle diff);
565565

566566
[DllImport(libgit2)]
567-
internal static extern IntPtr git_diff_get_delta(DiffSafeHandle diff, UIntPtr idx);
567+
internal static extern unsafe git_diff_delta* git_diff_get_delta(DiffSafeHandle diff, UIntPtr idx);
568568

569569
[DllImport(libgit2)]
570570
internal static extern int git_filter_register(
@@ -1543,7 +1543,7 @@ internal static extern int git_status_list_entrycount(
15431543
StatusListSafeHandle statusList);
15441544

15451545
[DllImport(libgit2)]
1546-
internal static extern StatusEntrySafeHandle git_status_byindex(
1546+
internal static extern unsafe git_status_entry* git_status_byindex(
15471547
StatusListSafeHandle list,
15481548
UIntPtr idx);
15491549

LibGit2Sharp/Core/Proxy.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -819,9 +819,9 @@ public static int git_diff_num_deltas(DiffSafeHandle diff)
819819
return (int)NativeMethods.git_diff_num_deltas(diff);
820820
}
821821

822-
public static GitDiffDelta git_diff_get_delta(DiffSafeHandle diff, int idx)
822+
public static unsafe git_diff_delta* git_diff_get_delta(DiffSafeHandle diff, int idx)
823823
{
824-
return NativeMethods.git_diff_get_delta(diff, (UIntPtr)idx).MarshalAs<GitDiffDelta>(false);
824+
return NativeMethods.git_diff_get_delta(diff, (UIntPtr)idx);
825825
}
826826

827827
#endregion
@@ -2853,7 +2853,7 @@ public static int git_status_list_entrycount(StatusListSafeHandle list)
28532853
return res;
28542854
}
28552855

2856-
public static StatusEntrySafeHandle git_status_byindex(StatusListSafeHandle list, long idx)
2856+
public static unsafe git_status_entry* git_status_byindex(StatusListSafeHandle list, long idx)
28572857
{
28582858
return NativeMethods.git_status_byindex(list, (UIntPtr)idx);
28592859
}

LibGit2Sharp/LibGit2Sharp.csproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,6 @@
158158
<Compile Include="RefSpecDirection.cs" />
159159
<Compile Include="Core\GitStatusEntry.cs" />
160160
<Compile Include="Core\GitStatusOptions.cs" />
161-
<Compile Include="Core\Handles\StatusEntrySafeHandle.cs" />
162161
<Compile Include="Core\Handles\StatusListSafeHandle.cs" />
163162
<Compile Include="RenameDetails.cs" />
164163
<Compile Include="RevertResult.cs" />
@@ -267,7 +266,6 @@
267266
<Compile Include="ChangeKind.cs" />
268267
<Compile Include="Core\GitBranchType.cs" />
269268
<Compile Include="Core\GitDiff.cs" />
270-
<Compile Include="Core\GitDiffExtensions.cs" />
271269
<Compile Include="Core\GitDirection.cs" />
272270
<Compile Include="Core\GitError.cs" />
273271
<Compile Include="Core\GitErrorCategory.cs" />

LibGit2Sharp/Patch.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class Patch : IEnumerable<PatchEntryChanges>, IDiffResult
3030
protected Patch()
3131
{ }
3232

33-
internal Patch(DiffSafeHandle diff)
33+
internal unsafe Patch(DiffSafeHandle diff)
3434
{
3535
int count = Proxy.git_diff_num_deltas(diff);
3636
for (int i = 0; i < count; i++)
@@ -44,22 +44,22 @@ internal Patch(DiffSafeHandle diff)
4444
}
4545
}
4646

47-
private void AddFileChange(GitDiffDelta delta)
47+
private unsafe void AddFileChange(git_diff_delta* delta)
4848
{
4949
var treeEntryChanges = new TreeEntryChanges(delta);
5050

51-
changes.Add(treeEntryChanges.Path, new PatchEntryChanges(delta.IsBinary(), treeEntryChanges));
51+
changes.Add(treeEntryChanges.Path, new PatchEntryChanges(delta->flags.HasFlag(GitDiffFlags.GIT_DIFF_FLAG_BINARY), treeEntryChanges));
5252
}
5353

54-
private int PrintCallBack(GitDiffDelta delta, GitDiffHunk hunk, GitDiffLine line, IntPtr payload)
54+
private unsafe int PrintCallBack(git_diff_delta* delta, GitDiffHunk hunk, GitDiffLine line, IntPtr payload)
5555
{
5656
string patchPart = LaxUtf8Marshaler.FromNative(line.content, (int)line.contentLen);
5757

5858
// Deleted files mean no "new file" path
5959

60-
var pathPtr = delta.NewFile.Path != IntPtr.Zero
61-
? delta.NewFile.Path
62-
: delta.OldFile.Path;
60+
var pathPtr = delta->new_file.Path != null
61+
? delta->new_file.Path
62+
: delta->old_file.Path;
6363
var filePath = LaxFilePathMarshaler.FromNative(pathPtr);
6464

6565
PatchEntryChanges currentChange = this[filePath];

LibGit2Sharp/PatchStats.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ public class PatchStats : IEnumerable<ContentChangeStats>, IDiffResult
2525
protected PatchStats()
2626
{ }
2727

28-
internal PatchStats(DiffSafeHandle diff)
28+
internal unsafe PatchStats(DiffSafeHandle diff)
2929
{
3030
int count = Proxy.git_diff_num_deltas(diff);
3131
for (int i = 0; i < count; i++)
3232
{
3333
using (var patch = Proxy.git_patch_from_diff(diff, i))
3434
{
3535
var delta = Proxy.git_diff_get_delta(diff, i);
36-
var pathPtr = delta.NewFile.Path != IntPtr.Zero ? delta.NewFile.Path : delta.OldFile.Path;
36+
var pathPtr = delta->new_file.Path != null ? delta->new_file.Path : delta->old_file.Path;
3737
var newFilePath = LaxFilePathMarshaler.FromNative(pathPtr);
3838

3939
var stats = Proxy.git_patch_line_stats(patch);

LibGit2Sharp/RepositoryStatus.cs

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ private static IDictionary<FileStatus, Action<RepositoryStatus, StatusEntry>> Bu
5353
protected RepositoryStatus()
5454
{ }
5555

56-
internal RepositoryStatus(Repository repo, StatusOptions options)
56+
internal unsafe RepositoryStatus(Repository repo, StatusOptions options)
5757
{
5858
statusEntries = new List<StatusEntry>();
5959

@@ -64,22 +64,8 @@ internal RepositoryStatus(Repository repo, StatusOptions options)
6464

6565
for (int i = 0; i < count; i++)
6666
{
67-
StatusEntrySafeHandle e = Proxy.git_status_byindex(list, i);
68-
GitStatusEntry entry = e.MarshalAsGitStatusEntry();
69-
70-
GitDiffDelta deltaHeadToIndex = null;
71-
GitDiffDelta deltaIndexToWorkDir = null;
72-
73-
if (entry.HeadToIndexPtr != IntPtr.Zero)
74-
{
75-
deltaHeadToIndex = entry.HeadToIndexPtr.MarshalAs<GitDiffDelta>();
76-
}
77-
if (entry.IndexToWorkDirPtr != IntPtr.Zero)
78-
{
79-
deltaIndexToWorkDir = entry.IndexToWorkDirPtr.MarshalAs<GitDiffDelta>();
80-
}
81-
82-
AddStatusEntryForDelta(entry.Status, deltaHeadToIndex, deltaIndexToWorkDir);
67+
git_status_entry *entry = Proxy.git_status_byindex(list, i);
68+
AddStatusEntryForDelta(entry->status, entry->head_to_index, entry->index_to_workdir);
8369
}
8470

8571
isDirty = statusEntries.Any(entry => entry.State != FileStatus.Ignored && entry.State != FileStatus.Unaltered);
@@ -144,30 +130,30 @@ private static GitStatusOptions CreateStatusOptions(StatusOptions options)
144130
return coreOptions;
145131
}
146132

147-
private void AddStatusEntryForDelta(FileStatus gitStatus, GitDiffDelta deltaHeadToIndex, GitDiffDelta deltaIndexToWorkDir)
133+
private unsafe void AddStatusEntryForDelta(FileStatus gitStatus, git_diff_delta* deltaHeadToIndex, git_diff_delta* deltaIndexToWorkDir)
148134
{
149135
RenameDetails headToIndexRenameDetails = null;
150136
RenameDetails indexToWorkDirRenameDetails = null;
151137

152138
if ((gitStatus & FileStatus.RenamedInIndex) == FileStatus.RenamedInIndex)
153139
{
154140
headToIndexRenameDetails =
155-
new RenameDetails(LaxFilePathMarshaler.FromNative(deltaHeadToIndex.OldFile.Path).Native,
156-
LaxFilePathMarshaler.FromNative(deltaHeadToIndex.NewFile.Path).Native,
157-
(int)deltaHeadToIndex.Similarity);
141+
new RenameDetails(LaxFilePathMarshaler.FromNative(deltaHeadToIndex->old_file.Path),
142+
LaxFilePathMarshaler.FromNative(deltaHeadToIndex->new_file.Path),
143+
(int)deltaHeadToIndex->similarity);
158144
}
159145

160146
if ((gitStatus & FileStatus.RenamedInWorkdir) == FileStatus.RenamedInWorkdir)
161147
{
162148
indexToWorkDirRenameDetails =
163-
new RenameDetails(LaxFilePathMarshaler.FromNative(deltaIndexToWorkDir.OldFile.Path).Native,
164-
LaxFilePathMarshaler.FromNative(deltaIndexToWorkDir.NewFile.Path).Native,
165-
(int)deltaIndexToWorkDir.Similarity);
149+
new RenameDetails(LaxFilePathMarshaler.FromNative(deltaIndexToWorkDir->old_file.Path),
150+
LaxFilePathMarshaler.FromNative(deltaIndexToWorkDir->new_file.Path),
151+
(int)deltaIndexToWorkDir->similarity);
166152
}
167153

168154
var filePath = (deltaIndexToWorkDir != null)
169-
? LaxFilePathMarshaler.FromNative(deltaIndexToWorkDir.NewFile.Path).Native
170-
: LaxFilePathMarshaler.FromNative(deltaHeadToIndex.NewFile.Path).Native;
155+
? LaxFilePathMarshaler.FromNative(deltaIndexToWorkDir->new_file.Path)
156+
: LaxFilePathMarshaler.FromNative(deltaHeadToIndex->new_file.Path);
171157

172158
StatusEntry statusEntry = new StatusEntry(filePath, gitStatus, headToIndexRenameDetails, indexToWorkDirRenameDetails);
173159

LibGit2Sharp/TreeChanges.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,18 @@ private static IDictionary<ChangeKind, Action<TreeChanges, TreeEntryChanges>> Bu
5050
protected TreeChanges()
5151
{ }
5252

53-
internal TreeChanges(DiffSafeHandle diff)
53+
internal unsafe TreeChanges(DiffSafeHandle diff)
5454
{
5555
Proxy.git_diff_foreach(diff, FileCallback, null, null);
5656
}
5757

58-
private int FileCallback(GitDiffDelta delta, float progress, IntPtr payload)
58+
private unsafe int FileCallback(git_diff_delta* delta, float progress, IntPtr payload)
5959
{
6060
AddFileChange(delta);
6161
return 0;
6262
}
6363

64-
private void AddFileChange(GitDiffDelta delta)
64+
private unsafe void AddFileChange(git_diff_delta* delta)
6565
{
6666
var treeEntryChanges = new TreeEntryChanges(delta);
6767

0 commit comments

Comments
 (0)