Skip to content

Commit 4c5c088

Browse files
committed
Get rid of SignatureSafeHandle
1 parent 1f50a0f commit 4c5c088

File tree

12 files changed

+147
-95
lines changed

12 files changed

+147
-95
lines changed

LibGit2Sharp/BlameHunk.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class BlameHunk : IEquatable<BlameHunk>
2020
x => x.InitialCommit);
2121

2222

23-
internal BlameHunk(IRepository repository, GitBlameHunk rawHunk)
23+
internal unsafe BlameHunk(IRepository repository, GitBlameHunk rawHunk)
2424
{
2525
finalCommit = new Lazy<Commit>(() => repository.Lookup<Commit>(rawHunk.FinalCommitId));
2626
origCommit = new Lazy<Commit>(() => repository.Lookup<Commit>(rawHunk.OrigCommitId));
@@ -36,12 +36,12 @@ internal BlameHunk(IRepository repository, GitBlameHunk rawHunk)
3636
InitialStartLineNumber = rawHunk.OrigStartLineNumber - 1;
3737

3838
// Signature objects need to have ownership of their native pointers
39-
if (rawHunk.FinalSignature != IntPtr.Zero)
39+
if (rawHunk.FinalSignature != null)
4040
{
4141
FinalSignature = new Signature(Proxy.git_signature_dup(rawHunk.FinalSignature));
4242
}
4343

44-
if (rawHunk.OrigSignature != IntPtr.Zero)
44+
if (rawHunk.OrigSignature != null)
4545
{
4646
InitialSignature = new Signature(Proxy.git_signature_dup(rawHunk.OrigSignature));
4747
}

LibGit2Sharp/Core/GitBlame.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,18 @@ internal class GitBlameOptions
5353
}
5454

5555
[StructLayout(LayoutKind.Sequential)]
56-
internal class GitBlameHunk
56+
internal unsafe class GitBlameHunk
5757
{
5858
public ushort LinesInHunk;
5959

6060
public GitOid FinalCommitId;
6161
public ushort FinalStartLineNumber;
62-
public IntPtr FinalSignature;
62+
public git_signature* FinalSignature;
6363

6464
public GitOid OrigCommitId;
6565
public IntPtr OrigPath;
6666
public ushort OrigStartLineNumber;
67-
public IntPtr OrigSignature;
67+
public git_signature* OrigSignature;
6868

6969
public byte Boundary;
7070
}

LibGit2Sharp/Core/GitSignature.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
namespace LibGit2Sharp.Core
55
{
66
[StructLayout(LayoutKind.Sequential)]
7-
internal class GitSignature
7+
internal unsafe struct git_signature
88
{
9-
public IntPtr Name;
10-
public IntPtr Email;
11-
public GitTime When;
9+
public char* name;
10+
public char* email;
11+
public git_time when;
1212
}
1313
}

LibGit2Sharp/Core/GitTime.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
namespace LibGit2Sharp.Core
44
{
55
[StructLayout(LayoutKind.Sequential)]
6-
internal class GitTime
6+
internal unsafe struct git_time
77
{
8-
public long Time;
9-
public int Offset;
8+
public long time;
9+
public int offset;
1010
}
1111
}

LibGit2Sharp/Core/Handles/Objects.cs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,4 +211,73 @@ public void Dispose()
211211
}
212212
}
213213

214+
internal unsafe class SignatureHandle : IDisposable
215+
{
216+
git_signature* ptr;
217+
internal git_signature* Handle
218+
{
219+
get
220+
{
221+
return ptr;
222+
}
223+
}
224+
225+
bool owned;
226+
bool disposed;
227+
228+
public unsafe SignatureHandle(git_signature* handle, bool owned)
229+
{
230+
this.ptr = handle;
231+
this.owned = owned;
232+
}
233+
234+
public unsafe SignatureHandle(IntPtr ptr, bool owned)
235+
{
236+
this.ptr = (git_signature*) ptr.ToPointer();
237+
this.owned = owned;
238+
}
239+
240+
~SignatureHandle()
241+
{
242+
Dispose(false);
243+
}
244+
245+
internal bool IsNull
246+
{
247+
get
248+
{
249+
return ptr == null;
250+
}
251+
}
252+
253+
internal IntPtr AsIntPtr()
254+
{
255+
return new IntPtr(ptr);
256+
}
257+
258+
void Dispose(bool disposing)
259+
{
260+
if (!disposed)
261+
{
262+
if (owned)
263+
{
264+
NativeMethods.git_signature_free(ptr);
265+
ptr = null;
266+
}
267+
}
268+
269+
disposed = true;
270+
}
271+
272+
public void Dispose()
273+
{
274+
Dispose(true);
275+
}
276+
277+
public static implicit operator git_signature*(SignatureHandle handle)
278+
{
279+
return handle.Handle;
280+
}
281+
}
282+
214283
}

LibGit2Sharp/Core/Handles/Objects.tt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ var cNames = new[] {
1515
"git_tree_entry",
1616
"git_reference",
1717
"git_repository",
18+
"git_signature",
1819
};
1920

2021
var csNames = new[] {
2122
"TreeEntryHandle",
2223
"ReferenceHandle",
2324
"RepositoryHandle",
25+
"SignatureHandle",
2426
};
2527

2628
for (var i = 0; i < cNames.Length; i++)

LibGit2Sharp/Core/Handles/SignatureSafeHandle.cs

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

LibGit2Sharp/Core/NativeMethods.cs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,11 @@ internal static extern int git_rebase_next(
224224
RebaseSafeHandle rebase);
225225

226226
[DllImport(libgit2)]
227-
internal static extern int git_rebase_commit(
227+
internal static extern unsafe int git_rebase_commit(
228228
ref GitOid id,
229229
RebaseSafeHandle rebase,
230-
SignatureSafeHandle author,
231-
SignatureSafeHandle committer,
230+
git_signature* author,
231+
git_signature* committer,
232232
IntPtr message_encoding,
233233
IntPtr message);
234234

@@ -237,9 +237,9 @@ internal static extern int git_rebase_abort(
237237
RebaseSafeHandle rebase);
238238

239239
[DllImport(libgit2)]
240-
internal static extern int git_rebase_finish(
240+
internal static extern unsafe int git_rebase_finish(
241241
RebaseSafeHandle repo,
242-
SignatureSafeHandle signature);
242+
git_signature* signature);
243243

244244
[DllImport(libgit2)]
245245
internal static extern void git_rebase_free(
@@ -285,18 +285,18 @@ internal static extern unsafe int git_clone(
285285
ref GitCloneOptions opts);
286286

287287
[DllImport(libgit2)]
288-
internal static extern IntPtr git_commit_author(GitObjectSafeHandle commit);
288+
internal static extern unsafe git_signature* git_commit_author(GitObjectSafeHandle commit);
289289

290290
[DllImport(libgit2)]
291-
internal static extern IntPtr git_commit_committer(GitObjectSafeHandle commit);
291+
internal static extern unsafe git_signature* git_commit_committer(GitObjectSafeHandle commit);
292292

293293
[DllImport(libgit2)]
294294
internal static extern unsafe int git_commit_create_from_ids(
295295
out GitOid id,
296296
git_repository* repo,
297297
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string updateRef,
298-
SignatureSafeHandle author,
299-
SignatureSafeHandle committer,
298+
git_signature* author,
299+
git_signature* committer,
300300
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string encoding,
301301
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string message,
302302
ref GitOid tree,
@@ -810,8 +810,8 @@ internal static extern unsafe int git_note_create(
810810
out GitOid noteOid,
811811
git_repository* repo,
812812
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string notes_ref,
813-
SignatureSafeHandle author,
814-
SignatureSafeHandle committer,
813+
git_signature* author,
814+
git_signature* committer,
815815
ref GitOid oid,
816816
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string note,
817817
int force);
@@ -837,8 +837,8 @@ internal static extern unsafe int git_note_read(
837837
internal static extern unsafe int git_note_remove(
838838
git_repository* repo,
839839
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string notes_ref,
840-
SignatureSafeHandle author,
841-
SignatureSafeHandle committer,
840+
git_signature* author,
841+
git_signature* committer,
842842
ref GitOid oid);
843843

844844
[DllImport(libgit2)]
@@ -1102,7 +1102,7 @@ internal static extern ReflogEntrySafeHandle git_reflog_entry_byindex(
11021102
SafeHandle entry);
11031103

11041104
[DllImport(libgit2)]
1105-
internal static extern IntPtr git_reflog_entry_committer(
1105+
internal static extern unsafe git_signature* git_reflog_entry_committer(
11061106
SafeHandle entry);
11071107

11081108
[DllImport(libgit2)]
@@ -1471,30 +1471,30 @@ internal static extern unsafe int git_revparse_ext(
14711471
internal static extern void git_revwalk_simplify_first_parent(RevWalkerSafeHandle walk);
14721472

14731473
[DllImport(libgit2)]
1474-
internal static extern void git_signature_free(IntPtr signature);
1474+
internal static extern unsafe void git_signature_free(git_signature* signature);
14751475

14761476
[DllImport(libgit2)]
1477-
internal static extern int git_signature_new(
1478-
out SignatureSafeHandle signature,
1477+
internal static extern unsafe int git_signature_new(
1478+
out git_signature* signature,
14791479
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string name,
14801480
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string email,
14811481
long time,
14821482
int offset);
14831483

14841484
[DllImport(libgit2)]
1485-
internal static extern int git_signature_now(
1486-
out SignatureSafeHandle signature,
1485+
internal static extern unsafe int git_signature_now(
1486+
out git_signature* signature,
14871487
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string name,
14881488
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string email);
14891489

14901490
[DllImport(libgit2)]
1491-
internal static extern int git_signature_dup(out IntPtr dest, IntPtr sig);
1491+
internal static extern unsafe int git_signature_dup(out git_signature* dest, git_signature* sig);
14921492

14931493
[DllImport(libgit2)]
14941494
internal static extern unsafe int git_stash_save(
14951495
out GitOid id,
14961496
git_repository* repo,
1497-
SignatureSafeHandle stasher,
1497+
git_signature* stasher,
14981498
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string message,
14991499
StashModifiers flags);
15001500

@@ -1650,7 +1650,7 @@ internal static extern unsafe int git_tag_annotation_create(
16501650
git_repository* repo,
16511651
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string name,
16521652
GitObjectSafeHandle target,
1653-
SignatureSafeHandle signature,
1653+
git_signature* signature,
16541654
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string message);
16551655

16561656
[DllImport(libgit2)]
@@ -1659,7 +1659,7 @@ internal static extern unsafe int git_tag_create(
16591659
git_repository* repo,
16601660
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string name,
16611661
GitObjectSafeHandle target,
1662-
SignatureSafeHandle signature,
1662+
git_signature* signature,
16631663
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string message,
16641664
[MarshalAs(UnmanagedType.Bool)]
16651665
bool force);
@@ -1690,7 +1690,7 @@ internal static extern unsafe int git_tag_delete(
16901690
internal static extern string git_tag_name(GitObjectSafeHandle tag);
16911691

16921692
[DllImport(libgit2)]
1693-
internal static extern IntPtr git_tag_tagger(GitObjectSafeHandle tag);
1693+
internal static extern unsafe git_signature* git_tag_tagger(GitObjectSafeHandle tag);
16941694

16951695
[DllImport(libgit2)]
16961696
internal static extern unsafe git_oid* git_tag_target_id(GitObjectSafeHandle tag);

0 commit comments

Comments
 (0)