Skip to content

Commit 73b239b

Browse files
committed
return filter regsitration object
1 parent 275afda commit 73b239b

File tree

9 files changed

+82
-74
lines changed

9 files changed

+82
-74
lines changed

LibGit2Sharp.Tests/FilterFixture.cs

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,22 @@ public void CanRegisterAndUnregisterTheSameFilter()
3030
{
3131
var filter = new EmptyFilter(FilterName + 1, attributes);
3232

33-
GlobalSettings.RegisterFilter(filter);
34-
GlobalSettings.DeregisterFilter(filter.Name);
33+
var registration = GlobalSettings.RegisterFilter(filter);
34+
GlobalSettings.DeregisterFilter(registration);
3535

36-
GlobalSettings.RegisterFilter(filter);
37-
GlobalSettings.DeregisterFilter(filter.Name);
36+
var secondRegistration = GlobalSettings.RegisterFilter(filter);
37+
GlobalSettings.DeregisterFilter(secondRegistration);
3838
}
3939

4040
[Fact]
4141
public void CanRegisterAndDeregisterAfterGarbageCollection()
4242
{
4343
var filter = new EmptyFilter(FilterName + 2, attributes);
44-
GlobalSettings.RegisterFilter(filter);
44+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
4545

4646
GC.Collect();
4747

48-
GlobalSettings.DeregisterFilter(filter.Name);
48+
GlobalSettings.DeregisterFilter(filterRegistration);
4949
}
5050

5151
[Fact]
@@ -90,14 +90,14 @@ public void CheckCallbackMadeWhenFileStaged()
9090

9191
var filter = new FakeFilter(FilterName + 5, attributes, checkCallBack);
9292

93-
GlobalSettings.RegisterFilter(filter);
93+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
9494
using (var repo = CreateTestRepository(repoPath))
9595
{
9696
StageNewFile(repo);
9797
Assert.True(called);
9898
}
9999

100-
GlobalSettings.DeregisterFilter(filter.Name);
100+
GlobalSettings.DeregisterFilter(filterRegistration);
101101
}
102102

103103
[Fact]
@@ -114,13 +114,13 @@ public void ApplyCallbackMadeWhenCheckCallbackReturnsZero()
114114
string repoPath = InitNewRepository();
115115
var filter = new FakeFilter(FilterName + 6, attributes, checkSuccess, applyCallback);
116116

117-
GlobalSettings.RegisterFilter(filter);
117+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
118118
using (var repo = CreateTestRepository(repoPath))
119119
{
120120
StageNewFile(repo);
121121
}
122122

123-
GlobalSettings.DeregisterFilter(filter.Name);
123+
GlobalSettings.DeregisterFilter(filterRegistration);
124124

125125
Assert.True(called);
126126
}
@@ -139,13 +139,13 @@ public void ApplyCallbackNotMadeWhenCheckCallbackReturnsPassThrough()
139139
string repoPath = InitNewRepository();
140140
var filter = new FakeFilter(FilterName + 7, attributes, checkPassThrough, applyCallback);
141141

142-
GlobalSettings.RegisterFilter(filter);
142+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
143143
using (var repo = CreateTestRepository(repoPath))
144144
{
145145
StageNewFile(repo);
146146
}
147147

148-
GlobalSettings.DeregisterFilter(filter.Name);
148+
GlobalSettings.DeregisterFilter(filterRegistration);
149149

150150
Assert.False(called);
151151
}
@@ -166,11 +166,11 @@ public void InitCallbackNotMadeWhenFilterNeverUsed()
166166
successCallback,
167167
initializeCallback);
168168

169-
GlobalSettings.RegisterFilter(filter);
169+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
170170

171171
Assert.False(called);
172172

173-
GlobalSettings.DeregisterFilter(filter.Name);
173+
GlobalSettings.DeregisterFilter(filterRegistration);
174174
}
175175

176176
[Fact]
@@ -189,7 +189,7 @@ public void InitCallbackMadeWhenUsingTheFilter()
189189
successCallback,
190190
initializeCallback);
191191

192-
GlobalSettings.RegisterFilter(filter);
192+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
193193
Assert.False(called);
194194

195195
string repoPath = InitNewRepository();
@@ -199,7 +199,7 @@ public void InitCallbackMadeWhenUsingTheFilter()
199199
Assert.True(called);
200200
}
201201

202-
GlobalSettings.DeregisterFilter(filter.Name);
202+
GlobalSettings.DeregisterFilter(filterRegistration);
203203
}
204204

205205
[Fact]
@@ -220,7 +220,7 @@ public void WhenStagingFileCheckIsCalledWithCleanForCorrectPath()
220220

221221
var filter = new FakeFilter(FilterName + 13, attributes, callback);
222222

223-
GlobalSettings.RegisterFilter(filter);
223+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
224224

225225
using (var repo = CreateTestRepository(repoPath))
226226
{
@@ -231,7 +231,7 @@ public void WhenStagingFileCheckIsCalledWithCleanForCorrectPath()
231231
Assert.Equal(attributes, actualAttributes);
232232
}
233233

234-
GlobalSettings.DeregisterFilter(filter.Name);
234+
GlobalSettings.DeregisterFilter(filterRegistration);
235235
}
236236

237237

@@ -254,14 +254,14 @@ public void WhenCheckingOutAFileFileCheckIsCalledWithSmudgeForCorrectPath()
254254

255255
var filter = new FakeFilter(FilterName + 14, attributes, callback);
256256

257-
GlobalSettings.RegisterFilter(filter);
257+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
258258

259259
FileInfo expectedFile = CheckoutFileForSmudge(repoPath, branchName, "hello");
260260
Assert.Equal(FilterMode.Smudge, calledWithMode);
261261
Assert.Equal(expectedFile.FullName, actualPath);
262262
Assert.Equal(attributes, actualAttributes);
263263

264-
GlobalSettings.DeregisterFilter(filter.Name);
264+
GlobalSettings.DeregisterFilter(filterRegistration);
265265
}
266266

267267
[Fact]
@@ -277,15 +277,15 @@ public void WhenStagingFileApplyIsCalledWithCleanForCorrectPath()
277277
};
278278
var filter = new FakeFilter(FilterName + 15, attributes, checkSuccess, clean);
279279

280-
GlobalSettings.RegisterFilter(filter);
280+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
281281

282282
using (var repo = CreateTestRepository(repoPath))
283283
{
284284
StageNewFile(repo);
285285
Assert.True(called);
286286
}
287287

288-
GlobalSettings.DeregisterFilter(filter.Name);
288+
GlobalSettings.DeregisterFilter(filterRegistration);
289289
}
290290

291291
[Fact]
@@ -300,7 +300,7 @@ public void CleanFilterWritesOutputToObjectTree()
300300

301301
var filter = new FakeFilter(FilterName + 16, attributes, checkSuccess, cleanCallback);
302302

303-
GlobalSettings.RegisterFilter(filter);
303+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
304304

305305
using (var repo = CreateTestRepository(repoPath))
306306
{
@@ -313,7 +313,7 @@ public void CleanFilterWritesOutputToObjectTree()
313313
Assert.Equal(encodedInput, textDetected);
314314
}
315315

316-
GlobalSettings.DeregisterFilter(filter.Name);
316+
GlobalSettings.DeregisterFilter(filterRegistration);
317317
}
318318

319319

@@ -329,15 +329,15 @@ public void WhenCheckingOutAFileFileSmudgeWritesCorrectFileToWorkingDirectory()
329329
Func<Stream, Stream, int> smudgeCallback = SubstitutionCipherFilter.RotateByThirteenPlaces;
330330

331331
var filter = new FakeFilter(FilterName + 17, attributes, checkSuccess, null, smudgeCallback);
332-
GlobalSettings.RegisterFilter(filter);
332+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
333333

334334
FileInfo expectedFile = CheckoutFileForSmudge(repoPath, branchName, encodedInput);
335335

336336
string combine = Path.Combine(repoPath, "..", expectedFile.Name);
337337
string readAllText = File.ReadAllText(combine);
338338
Assert.Equal(decodedInput, readAllText);
339339

340-
GlobalSettings.DeregisterFilter(filter.Name);
340+
GlobalSettings.DeregisterFilter(filterRegistration);
341341
}
342342

343343
[Fact]
@@ -363,14 +363,14 @@ public void FilterStreamsAreCoherent()
363363

364364
var filter = new FakeFilter(FilterName + 18, attributes, checkSuccess, assertor, assertor);
365365

366-
GlobalSettings.RegisterFilter(filter);
366+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
367367

368368
using (var repo = CreateTestRepository(repoPath))
369369
{
370370
StageNewFile(repo);
371371
}
372372

373-
GlobalSettings.DeregisterFilter(filter.Name);
373+
GlobalSettings.DeregisterFilter(filterRegistration);
374374

375375
Assert.True(inputCanRead.HasValue);
376376
Assert.True(inputCanWrite.HasValue);

LibGit2Sharp.Tests/SubstitutionCipherFilterFixture.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void CorrectlyEncodesAndDecodesInput()
1616

1717
var attributes = new List<string> { ".rot13" };
1818
var filter = new SubstitutionCipherFilter("ROT13", attributes);
19-
GlobalSettings.RegisterFilter(filter);
19+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
2020

2121
string repoPath = InitNewRepository();
2222
string fileName = Guid.NewGuid() + ".rot13";
@@ -44,7 +44,7 @@ public void CorrectlyEncodesAndDecodesInput()
4444
Assert.Equal(decodedInput, fileContents);
4545
}
4646

47-
GlobalSettings.DeregisterFilter(filter.Name);
47+
GlobalSettings.DeregisterFilter(filterRegistration);
4848
}
4949

5050
[Fact]
@@ -54,7 +54,7 @@ public void WhenAttributesDoNotMatchFileIsNotFilterd()
5454

5555
var attributes = new List<string> { ".rot13" };
5656
var filter = new SubstitutionCipherFilter("ROT13", attributes);
57-
GlobalSettings.RegisterFilter(filter);
57+
var filterRegistration = GlobalSettings.RegisterFilter(filter);
5858

5959
string repoPath = InitNewRepository();
6060
string fileName = Guid.NewGuid() + ".rot131";
@@ -70,7 +70,7 @@ public void WhenAttributesDoNotMatchFileIsNotFilterd()
7070
Assert.Equal(1, filter.CheckCalledCount);
7171
}
7272

73-
GlobalSettings.DeregisterFilter(filter.Name);
73+
GlobalSettings.DeregisterFilter(filterRegistration);
7474
}
7575

7676
private static string ReadTextFromFile(Repository repo, string fileName)

LibGit2Sharp/Core/Handles/GitFilterSafeHandle.cs

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

LibGit2Sharp/Core/NativeMethods.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ internal static extern int git_diff_find_similar(
530530
[DllImport(libgit2)]
531531
internal static extern int git_filter_register(
532532
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(StrictUtf8Marshaler))] string name,
533-
GitFilterSafeHandle gitFilter, int priority);
533+
IntPtr gitFilter, int priority);
534534

535535
[DllImport(libgit2)]
536536
internal static extern int git_filter_unregister(

LibGit2Sharp/Core/Proxy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -836,7 +836,7 @@ public static GitDiffDelta git_diff_get_delta(DiffSafeHandle diff, int idx)
836836

837837
#region git_filter_
838838

839-
public static void git_filter_register(string name, GitFilterSafeHandle filter, int priority)
839+
public static void git_filter_register(string name, IntPtr filter, int priority)
840840
{
841841
using (ThreadAffinity())
842842
{

LibGit2Sharp/Filter.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System.Linq;
55
using System.Text;
66
using LibGit2Sharp.Core;
7-
using LibGit2Sharp.Core.Handles;
87

98
namespace LibGit2Sharp
109
{
@@ -55,13 +54,6 @@ private Filter(string name, string attributes)
5554
};
5655
}
5756

58-
internal Filter(string name, GitFilterSafeHandle filterPtr)
59-
{
60-
this.name = name;
61-
managedFilter = filterPtr.MarshalFromNative();
62-
attributes = EncodingMarshaler.FromNative(Encoding.UTF8, managedFilter.attributes);
63-
}
64-
6557
/// <summary>
6658
/// The name that this filter was registered with
6759
/// </summary>

LibGit2Sharp/FilterRegistration.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using System.Runtime.InteropServices;
3+
using LibGit2Sharp.Core;
4+
5+
namespace LibGit2Sharp
6+
{
7+
/// <summary>
8+
/// An object representing the registration of a Filter type with libgit2
9+
/// </summary>
10+
public sealed class FilterRegistration
11+
{
12+
internal FilterRegistration(Filter filter)
13+
{
14+
Ensure.ArgumentNotNull(filter, "filter");
15+
Name = filter.Name;
16+
17+
FilterPointer = Marshal.AllocHGlobal(Marshal.SizeOf(filter.ManagedFilter));
18+
Marshal.StructureToPtr(filter.ManagedFilter, FilterPointer, false);
19+
}
20+
21+
/// <summary>
22+
/// The name of the filter in the libgit2 registry
23+
/// </summary>
24+
public string Name { get; private set; }
25+
26+
internal IntPtr FilterPointer { get; private set; }
27+
28+
internal void Free()
29+
{
30+
Marshal.FreeHGlobal(FilterPointer);
31+
FilterPointer = IntPtr.Zero;
32+
}
33+
}
34+
}

LibGit2Sharp/GlobalSettings.cs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,27 +114,33 @@ public static LogConfiguration LogConfiguration
114114
/// Register a filter globally with a default priority of 200 allowing the custom filter
115115
/// to imitate a core Git filter driver. It will be run last on checkout and first on checkin.
116116
/// </summary>
117-
public static void RegisterFilter(Filter filter)
117+
public static FilterRegistration RegisterFilter(Filter filter)
118118
{
119-
RegisterFilter(filter, 200);
119+
return RegisterFilter(filter, 200);
120120
}
121121
/// <summary>
122122
/// Register a filter globally with given priority for execution.
123123
/// A filter with the priority of 200 will be run last on checkout and first on checkin.
124124
/// A filter with the priority of 0 will be run first on checkout and last on checkin.
125125
/// </summary>
126-
public static void RegisterFilter(Filter filter, int priority)
126+
public static FilterRegistration RegisterFilter(Filter filter, int priority)
127127
{
128-
var nativeFilter = new GitFilterSafeHandle(filter.ManagedFilter);
129-
Proxy.git_filter_register(filter.Name, nativeFilter, priority);
128+
var registration = new FilterRegistration(filter);
129+
130+
Proxy.git_filter_register(filter.Name, registration.FilterPointer, priority);
131+
132+
return registration;
130133
}
131134

132135
/// <summary>
133136
/// Remove the filter from the registry, and frees the native heap allocation.
134137
/// </summary>
135-
public static void DeregisterFilter(string name)
138+
public static void DeregisterFilter(FilterRegistration registration)
136139
{
137-
Proxy.git_filter_unregister(name);
140+
Ensure.ArgumentNotNull(registration, "registration");
141+
142+
Proxy.git_filter_unregister(registration.Name);
143+
registration.Free();
138144
}
139145
}
140146
}

0 commit comments

Comments
 (0)