8000 Use pointers for git references · Svengali/libgit2sharp@7445d4c · GitHub
[go: up one dir, main page]

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)
0