Skip to content

Commit 653e9bb

Browse files
authored
Merge pull request #1908 from jairbubbles/set-get-supported-extensions
Set / get supported extensions
2 parents 4daf618 + 3c4473c commit 653e9bb

File tree

4 files changed

+94
-0
lines changed

4 files changed

+94
-0
lines changed

LibGit2Sharp.Tests/GlobalSettingsFixture.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,5 +83,29 @@ public void LoadFromSpecifiedPath(string architecture)
8383
DirectoryHelper.DeleteDirectory(tempDir);
8484
}
8585
}
86+
87+
[Fact]
88+
public void SetExtensions()
89+
{
90+
var extensions = GlobalSettings.GetExtensions();
91+
92+
// Assert that "noop" is supported by default
93+
Assert.Equal(new[] { "noop" }, extensions);
94+
95+
// Disable "noop" extensions
96+
GlobalSettings.SetExtensions("!noop");
97+
extensions = GlobalSettings.GetExtensions();
98+
Assert.Empty(extensions);
99+
100+
// Enable two new extensions (it will reset the configuration and "noop" will be enabled)
101+
GlobalSettings.SetExtensions("partialclone", "newext");
102+
extensions = GlobalSettings.GetExtensions();
103+
Assert.Equal(new[] { "noop", "partialclone", "newext" }, extensions);
104+
105+
// You can have multiple times the same extension
106+
GlobalSettings.SetExtensions("noop", "test", "test" );
107+
extensions = GlobalSettings.GetExtensions();
108+
Assert.Equal(new[] { "noop", "noop", "test", "test" }, extensions);
109+
}
86110
}
87111
}

LibGit2Sharp/Core/NativeMethods.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,14 @@ internal static extern int git_libgit2_opts(int option,
754754
// git_libgit2_opts(GIT_OPT_GET_USER_AGENT, git_buf *buf)
755755
[DllImport(libgit2, CallingConvention = CallingConvention.Cdecl)]
756756
internal static extern int git_libgit2_opts(int option, GitBuf buf);
757+
758+
// git_libgit2_opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len)
759+
[DllImport(libgit2, CallingConvention = CallingConvention.Cdecl)]
760+
internal static extern int git_libgit2_opts(int option, IntPtr extensions, UIntPtr len);
761+
762+
// git_libgit2_opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out)
763+
[DllImport(libgit2, CallingConvention = CallingConvention.Cdecl)]
764+
internal static extern int git_libgit2_opts(int option, out GitStrArray extensions);
757765
#endregion
758766

759767
[DllImport(libgit2, CallingConvention = CallingConvention.Cdecl)]

LibGit2Sharp/Core/Proxy.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3381,6 +3381,18 @@ private enum LibGit2Option
33813381
GetWindowsSharemode, // GIT_OPT_GET_WINDOWS_SHAREMODE
33823382
SetWindowsSharemode, // GIT_OPT_SET_WINDOWS_SHAREMODE
33833383
EnableStrictHashVerification, // GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION
3384+
SetAllocator, // GIT_OPT_SET_ALLOCATOR,
3385+
EnableUnsavedIndexSafety, // GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY,
3386+
GetPackMaxObject, // GIT_OPT_GET_PACK_MAX_OBJECTS,
3387+
SetPackMaxObjects, // GIT_OPT_SET_PACK_MAX_OBJECTS,
3388+
DisabledPackKeepFileChecks, // GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS,
3389+
EnableHttpExpectContinue, // GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE,
3390+
GetMWindowFileLimit, // GIT_OPT_GET_MWINDOW_FILE_LIMIT,
3391+
SetMWindowFileLimit, // GIT_OPT_SET_MWINDOW_FILE_LIMIT,
3392+
SetOdbPackedPriority, // GIT_OPT_SET_ODB_PACKED_PRIORITY,
3393+
SetOdbLoosePriority, // GIT_OPT_SET_ODB_LOOSE_PRIORITY,
3394+
GetExtensions, // GIT_OPT_GET_EXTENSIONS,
3395+
SetExtensions, // GIT_OPT_SET_EXTENSIONS
33843396
}
33853397

33863398
/// <summary>
@@ -3489,6 +3501,32 @@ public static string git_libgit2_opts_get_user_agent()
34893501
return userAgent;
34903502
}
34913503

3504+
public static void git_libgit2_opts_set_extensions(string[] extensions)
3505+
{
3506+
using (var array = GitStrArrayManaged.BuildFrom(extensions))
3507+
{
3508+
var res = NativeMethods.git_libgit2_opts((int)LibGit2Option.SetExtensions, array.Array.Strings, array.Array.Count);
3509+
Ensure.ZeroResult(res);
3510+
}
3511+
}
3512+
3513+
public static string[] git_libgit2_opts_get_extensions()
3514+
{
3515+
var array = new GitStrArrayNative();
3516+
3517+
try
3518+
{
3519+
var res = NativeMethods.git_libgit2_opts((int)LibGit2Option.GetExtensions, out array.Array);
3520+
Ensure.ZeroResult(res);
3521+
3522+
return array.ReadStrings();
3523+
}
3524+
finally
3525+
{
3526+
array.Dispose();
3527+
}
3528+
}
3529+
34923530
#endregion
34933531

34943532
#region git_worktree_

LibGit2Sharp/GlobalSettings.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,30 @@ public static void SetUserAgent(string userAgent)
383383
Proxy.git_libgit2_opts_set_user_agent(userAgent);
384384
}
385385

386+
/// <summary>
387+
/// Set that the given git extensions are supported by the caller.
388+
/// </summary>
389+
/// <remarks>
390+
/// Extensions supported by libgit2 may be negated by prefixing them with a `!`. For example: setting extensions to { "!noop", "newext" } indicates that the caller does not want
391+
/// to support repositories with the `noop` extension but does want to support repositories with the `newext` extension.
392+
/// </remarks>
393+
/// <param name="extensions">Supported extensions</param>
394+
public static void SetExtensions(params string[] extensions)
395+
{
396+
Proxy.git_libgit2_opts_set_extensions(extensions);
397+
}
398+
399+
/// <summary>
400+
/// Returns the list of git extensions that are supported.
401+
/// </summary>
402+
/// <remarks>
403+
/// This is the list of built-in extensions supported by libgit2 and custom extensions that have been added with `SetExtensions`. Extensions that have been negated will not be returned.
404+
/// </remarks>
405+
public static string[] GetExtensions()
406+
{
407+
return Proxy.git_libgit2_opts_get_extensions();
408+
}
409+
386410
/// <summary>
387411
/// Gets the user-agent string used by libgit2.
388412
/// <returns>

0 commit comments

Comments
 (0)