Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7445d4c

Browse files
committed
Use pointers for git references
The public methods use the disposable wrapper so we don't have to mark them as unsafe.
1 parent e5aa4fb commit 7445d4c

11 files changed

+155
-123
lines changed

LibGit2Sharp/BranchCollection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ public virtual void Remove(Branch branch)
199199
{
200200
Ensure.ArgumentNotNull(branch, "branch");
201201

202-
using (ReferenceSafeHandle referencePtr = repo.Refs.RetrieveReferencePtr(branch.CanonicalName))
202+
using (GitReferenceHandle referencePtr = repo.Refs.RetrieveReferencePtr(branch.CanonicalName))
203203
{
204204
Proxy.git_branch_delete(referencePtr);
205205
}
@@ -267,7 +267,7 @@ public virtual Branch Rename(Branch branch, string newName, bool allowOverwrite)
267267
branch.FriendlyName);
268268
}
269269

270-
using (ReferenceSafeHandle referencePtr = repo.Refs.RetrieveReferencePtr(Reference.LocalBranchPrefix + branch.FriendlyName))
270+
using (GitReferenceHandle referencePtr = repo.Refs.RetrieveReferencePtr(Reference.LocalBranchPrefix + branch.FriendlyName))
271271
{
272272
using (Proxy.git_branch_move(referencePtr, newName, allowOverwrite))
273273
{ }
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System;
2+
3+
namespace LibGit2Sharp.Core.Handles
4+
{
5+
internal unsafe class GitReferenceHandle : IDisposable
6+
{
7+
git_reference* ptr;
8+
9+
internal GitReferenceHandle(git_reference* refPtr)
10+
{
11+
this.ptr = refPtr;
12+
}
13+
14+
~GitReferenceHandle()
15+
{
16+
Dispose();
17+
}
18+
19+
internal git_reference* ToPointer()
20+
{
21+
return ptr;
22+
}
23+
24+
internal bool IsNull
25+
{
26+
get
27+
{
28+
return ptr == null;
29+
}
30+
}
31+
32+
public void Dispose()
33+
{
34+
NativeMethods.git_reference_free(new IntPtr(ptr));
35+
ptr = null;
36+
}
37+
}
38+
}

LibGit2Sharp/Core/Handles/ReferenceSafeHandle.cs

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

LibGit2Sharp/Core/NativeMethods.cs

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -145,16 +145,16 @@ internal static extern int git_blob_filtered_content(
145145
internal static extern Int64 git_blob_rawsize(GitObjectSafeHandle blob);
146146

147147
[DllImport(libgit2)]
148-
internal static extern int git_branch_create_from_annotated(
149-
out ReferenceSafeHandle ref_out,
148+
internal static extern unsafe int git_branch_create_from_annotated(
149+
out git_reference* ref_out,
150150
RepositorySafeHandle repo,
151151
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string branch_name,
152152
GitAnnotatedCommitHandle target,
153153
[MarshalAs(UnmanagedType.Bool)] bool force);
154154

155155
[DllImport(libgit2)]
156-
internal static extern int git_branch_delete(
157-
ReferenceSafeHandle reference);
156+
internal static extern unsafe int git_branch_delete(
157+
git_reference* reference);
158158

159159
internal delegate int branch_foreach_callback(
160160
IntPtr branch_name,
@@ -172,15 +172,15 @@ internal static extern int git_branch_iterator_new(
172172
GitBranchType branch_type);
173173

174174
[DllImport(libgit2)]
175-
internal static extern int git_branch_move(
176-
out ReferenceSafeHandle ref_out,
177-
ReferenceSafeHandle reference,
175+
internal static extern unsafe int git_branch_move(
176+
out git_reference* ref_out,
177+
git_reference* reference,
178178
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string new_branch_name,
179179
[MarshalAs(UnmanagedType.Bool)] bool force);
180180

181181
[DllImport(libgit2)]
182182
internal static extern int git_branch_next(
183-
out ReferenceSafeHandle ref_out,
183+
out IntPtr ref_out,
184184
out GitBranchType type_out,
185185
BranchIteratorSafeHandle iter);
186186

@@ -741,10 +741,10 @@ internal static extern int git_merge_base_octopus(
741741
[In] GitOid[] input_array);
742742

743743
[DllImport(libgit2)]
744-
internal static extern int git_annotated_commit_from_ref(
744+
internal static extern unsafe int git_annotated_commit_from_ref(
745745
out GitAnnotatedCommitHandle annotatedCommit,
746746
RepositorySafeHandle repo,
747-
ReferenceSafeHandle reference);
747+
git_reference* reference);
748748

749749
[DllImport(libgit2)]
750750
internal static extern int git_annotated_commit_from_fetchhead(
@@ -984,17 +984,17 @@ internal static extern int git_packbuilder_write(
984984
internal static extern UInt32 git_packbuilder_written(PackBuilderSafeHandle packbuilder);
985985

986986
[DllImport(libgit2)]
987-
internal static extern int git_reference_create(
988-
out ReferenceSafeHandle reference,
987+
internal static extern unsafe int git_reference_create(
988+
out git_reference* reference,
989989
RepositorySafeHandle repo,
990990
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string name,
991991
ref GitOid oid,
992992
[MarshalAs(UnmanagedType.Bool)] bool force,
993993
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string log_message);
994994

995995
[DllImport(libgit2)]
996-
internal static extern int git_reference_symbolic_create(
997-
out ReferenceSafeHandle reference,
996+
internal static extern unsafe int git_reference_symbolic_create(
997+
out git_reference* reference,
998998
RepositorySafeHandle repo,
999999
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string name,
10001000
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string target,
@@ -1023,51 +1023,51 @@ internal static extern int git_reference_is_valid_name(
10231023
internal static extern int git_reference_list(out GitStrArray array, RepositorySafeHandle repo);
10241024

10251025
[DllImport(libgit2)]
1026-
internal static extern int git_reference_lookup(
1027-
out ReferenceSafeHandle reference,
1026+
internal static extern unsafe int git_reference_lookup(
1027+
out git_reference* reference,
10281028
RepositorySafeHandle repo,
10291029
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string name);
10301030

10311031
[DllImport(libgit2)]
10321032
[return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(LaxUtf8NoCleanupMarshaler))]
1033-
internal static extern string git_reference_name(ReferenceSafeHandle reference);
1033+
internal static extern unsafe string git_reference_name(git_reference* reference);
10341034

10351035
[DllImport(libgit2)]
10361036
internal static extern int git_reference_remove(
10371037
RepositorySafeHandle repo,
10381038
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string name);
10391039

10401040
[DllImport(libgit2)]
1041-
internal static extern OidSafeHandle git_reference_target(ReferenceSafeHandle reference);
1041+
internal static extern unsafe OidSafeHandle git_reference_target(git_reference* reference);
10421042

10431043
[DllImport(libgit2)]
1044-
internal static extern int git_reference_rename(
1045-
out ReferenceSafeHandle ref_out,
1046-
ReferenceSafeHandle reference,
1044+
internal static extern unsafe int git_reference_rename(
1045+
out git_reference* ref_out,
1046+
git_reference* reference,
10471047
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string newName,
10481048
[MarshalAs(UnmanagedType.Bool)] bool force,
10491049
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string log_message);
10501050

10511051
[DllImport(libgit2)]
1052-
internal static extern int git_reference_set_target(
1053-
out ReferenceSafeHandle ref_out,
1054-
ReferenceSafeHandle reference,
1052+
internal static extern unsafe int git_reference_set_target(
1053+
out git_reference* ref_out,
1054+
git_reference* reference,
10551055
ref GitOid id,
10561056
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string log_message);
10571057

10581058
[DllImport(libgit2)]
1059-
internal static extern int git_reference_symbolic_set_target(
1060-
out ReferenceSafeHandle ref_out,
1061-
ReferenceSafeHandle reference,
1059+
internal static extern unsafe int git_reference_symbolic_set_target(
1060+
out git_reference* ref_out,
1061+
git_reference* reference,
10621062
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string target,
10631063
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string log_message);
10641064

10651065
[DllImport(libgit2)]
10661066
[return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(LaxUtf8NoCleanupMarshaler))]
1067-
internal static extern string git_reference_symbolic_target(ReferenceSafeHandle reference);
1067+
internal static extern unsafe string git_reference_symbolic_target(git_reference* reference);
10681068

10691069
[DllImport(libgit2)]
1070-
internal static extern GitReferenceType git_reference_type(ReferenceSafeHandle reference);
1070+
internal static extern unsafe GitReferenceType git_reference_type(git_reference* reference);
10711071

10721072
[DllImport(libgit2)]
10731073
internal static extern int git_reference_ensure_log(
@@ -1442,9 +1442,9 @@ internal static extern int git_revert(
14421442
GitRevertOpts opts);
14431443

14441444
[DllImport(libgit2)]
1445-
internal static extern int git_revparse_ext(
1445+
internal static extern unsafe int git_revparse_ext(
14461446
out GitObjectSafeHandle obj,
1447-
out ReferenceSafeHandle reference,
1447+
out git_reference* reference,
14481448
RepositorySafeHandle repo,
14491449
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string spec);
14501450

LibGit2Sharp/Core/Opaques.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
namespace LibGit2Sharp.Core
44
{
55
internal struct git_tree_entry {}
6+
internal struct git_reference { }
67
}
78

0 commit comments

Comments
 (0)