From 44a1f22ffac7a22ce78579de9240b574fde4085e Mon Sep 17 00:00:00 2001 From: Julien Richard Date: Sat, 11 Sep 2021 20:14:57 +0200 Subject: [PATCH 1/6] Set / get supported extensions --- LibGit2Sharp.Tests/GlobalSettingsFixture.cs | 19 +++++++++++ LibGit2Sharp/Core/NativeMethods.cs | 8 +++++ LibGit2Sharp/Core/Proxy.cs | 35 +++++++++++++++++++++ LibGit2Sharp/GlobalSettings.cs | 24 ++++++++++++++ LibGit2Sharp/LibGit2Sharp.csproj | 2 +- 5 files changed, 87 insertions(+), 1 deletion(-) diff --git a/LibGit2Sharp.Tests/GlobalSettingsFixture.cs b/LibGit2Sharp.Tests/GlobalSettingsFixture.cs index 8f1aa9d0b..7a701ab8c 100644 --- a/LibGit2Sharp.Tests/GlobalSettingsFixture.cs +++ b/LibGit2Sharp.Tests/GlobalSettingsFixture.cs @@ -83,5 +83,24 @@ public void LoadFromSpecifiedPath(string architecture) DirectoryHelper.DeleteDirectory(tempDir); } } + + [Fact] + public void SetExtensions() + { + var extensions = GlobalSettings.GetExtensions(); + + // Assert that "noop" is supported by default + Assert.Equal(new[] { "noop" }, extensions); + + // Disable "noop" extensions + GlobalSettings.SetExtensions(new[] { "!noop" }); + extensions = GlobalSettings.GetExtensions(); + Assert.Empty(extensions); + + // Enable two new extensions (it will reset the configuration and "noop" will be enabled) + GlobalSettings.SetExtensions(new[] { "partialclone", "newext" }); + extensions = GlobalSettings.GetExtensions(); + Assert.Equal(new[] { "noop", "partialclone", "newext" }, extensions); + } } } diff --git a/LibGit2Sharp/Core/NativeMethods.cs b/LibGit2Sharp/Core/NativeMethods.cs index 809a77309..a32325c56 100644 --- a/LibGit2Sharp/Core/NativeMethods.cs +++ b/LibGit2Sharp/Core/NativeMethods.cs @@ -754,6 +754,14 @@ internal static extern int git_libgit2_opts(int option, // git_libgit2_opts(GIT_OPT_GET_USER_AGENT, git_buf *buf) [DllImport(libgit2, CallingConvention = CallingConvention.Cdecl)] internal static extern int git_libgit2_opts(int option, GitBuf buf); + + // git_libgit2_opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) + [DllImport(libgit2, CallingConvention = CallingConvention.Cdecl)] + internal static extern int git_libgit2_opts(int option, string[] extensions, int len); + + // git_libgit2_opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) + [DllImport(libgit2, CallingConvention = CallingConvention.Cdecl)] + internal static extern int git_libgit2_opts(int option, out GitStrArray extensions); #endregion [DllImport(libgit2, CallingConvention = CallingConvention.Cdecl)] diff --git a/LibGit2Sharp/Core/Proxy.cs b/LibGit2Sharp/Core/Proxy.cs index ca9a69f6d..659138b1f 100644 --- a/LibGit2Sharp/Core/Proxy.cs +++ b/LibGit2Sharp/Core/Proxy.cs @@ -3381,6 +3381,18 @@ private enum LibGit2Option GetWindowsSharemode, // GIT_OPT_GET_WINDOWS_SHAREMODE SetWindowsSharemode, // GIT_OPT_SET_WINDOWS_SHAREMODE EnableStrictHashVerification, // GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION + SetAllocator, // GIT_OPT_SET_ALLOCATOR, + EnableUnsavedIndexSafety, // GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY, + GetPackMaxObject, // GIT_OPT_GET_PACK_MAX_OBJECTS, + SetPackMaxObjects, // GIT_OPT_SET_PACK_MAX_OBJECTS, + DisabledPackKeepFileChecks, // GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS, + EnableHttpExpectContinue, // GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE, + GetMWindowFileLimit, // GIT_OPT_GET_MWINDOW_FILE_LIMIT, + SetMWindowFileLimit, // GIT_OPT_SET_MWINDOW_FILE_LIMIT, + SetOdbPackedPriority, // GIT_OPT_SET_ODB_PACKED_PRIORITY, + SetOdbLoosePriority, // GIT_OPT_SET_ODB_LOOSE_PRIORITY, + GetExtensions, // GIT_OPT_GET_EXTENSIONS, + SetExtensions, // GIT_OPT_SET_EXTENSIONS } /// @@ -3489,6 +3501,29 @@ public static string git_libgit2_opts_get_user_agent() return userAgent; } + public static void git_libgit2_opts_set_extensions(string[] extensions) + { + var res = NativeMethods.git_libgit2_opts((int)LibGit2Option.SetExtensions, extensions, extensions.Length); + Ensure.ZeroResult(res); + } + + public static string[] git_libgit2_opts_get_extensions() + { + var array = new GitStrArrayNative(); + + try + { + var res = NativeMethods.git_libgit2_opts((int)LibGit2Option.GetExtensions, out array.Array); + Ensure.ZeroResult(res); + + return array.ReadStrings(); + } + finally + { + array.Dispose(); + } + } + #endregion #region git_worktree_ diff --git a/LibGit2Sharp/GlobalSettings.cs b/LibGit2Sharp/GlobalSettings.cs index d24637df0..cb3304c2c 100644 --- a/LibGit2Sharp/GlobalSettings.cs +++ b/LibGit2Sharp/GlobalSettings.cs @@ -383,6 +383,30 @@ public static void SetUserAgent(string userAgent) Proxy.git_libgit2_opts_set_user_agent(userAgent); } + /// + /// Set that the given git extensions are supported by the caller. + /// + /// + /// 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 + /// to support repositories with the `noop` extension but does want to support repositories with the `newext` extension. + /// + /// Supported extensions + public static void SetExtensions(string[] extensions) + { + Proxy.git_libgit2_opts_set_extensions(extensions); + } + + /// + /// Returns the list of git extensions that are supported. + /// + /// + /// 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. + /// + public static string[] GetExtensions() + { + return Proxy.git_libgit2_opts_get_extensions(); + } + /// /// Gets the user-agent string used by libgit2. /// diff --git a/LibGit2Sharp/LibGit2Sharp.csproj b/LibGit2Sharp/LibGit2Sharp.csproj index 57c81cdfb..1bbc3073b 100644 --- a/LibGit2Sharp/LibGit2Sharp.csproj +++ b/LibGit2Sharp/LibGit2Sharp.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netcoreapp3.1 From 5b92d55f84db8630cc666b94beccf1f54228e62b Mon Sep 17 00:00:00 2001 From: Julien Richard Date: Sun, 12 Sep 2021 10:01:05 +0200 Subject: [PATCH 2/6] Add params keyword --- LibGit2Sharp/GlobalSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LibGit2Sharp/GlobalSettings.cs b/LibGit2Sharp/GlobalSettings.cs index cb3304c2c..f8db7401a 100644 --- a/LibGit2Sharp/GlobalSettings.cs +++ b/LibGit2Sharp/GlobalSettings.cs @@ -391,7 +391,7 @@ public static void SetUserAgent(string userAgent) /// to support repositories with the `noop` extension but does want to support repositories with the `newext` extension. /// /// Supported extensions - public static void SetExtensions(string[] extensions) + public static void SetExtensions(params string[] extensions) { Proxy.git_libgit2_opts_set_extensions(extensions); } From 7f21164d569986fdf1fb198c7162b67cc9e7c491 Mon Sep 17 00:00:00 2001 From: Julien Richard Date: Mon, 22 Nov 2021 11:14:26 +0100 Subject: [PATCH 3/6] Use GitStrArray --- LibGit2Sharp/Core/NativeMethods.cs | 2 +- LibGit2Sharp/Core/Proxy.cs | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/LibGit2Sharp/Core/NativeMethods.cs b/LibGit2Sharp/Core/NativeMethods.cs index a32325c56..69f58fed3 100644 --- a/LibGit2Sharp/Core/NativeMethods.cs +++ b/LibGit2Sharp/Core/NativeMethods.cs @@ -757,7 +757,7 @@ internal static extern int git_libgit2_opts(int option, // git_libgit2_opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) [DllImport(libgit2, CallingConvention = CallingConvention.Cdecl)] - internal static extern int git_libgit2_opts(int option, string[] extensions, int len); + internal static extern int git_libgit2_opts(int option, GitStrArray extensions); // git_libgit2_opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) [DllImport(libgit2, CallingConvention = CallingConvention.Cdecl)] diff --git a/LibGit2Sharp/Core/Proxy.cs b/LibGit2Sharp/Core/Proxy.cs index 659138b1f..921fd7bbc 100644 --- a/LibGit2Sharp/Core/Proxy.cs +++ b/LibGit2Sharp/Core/Proxy.cs @@ -3503,8 +3503,11 @@ public static string git_libgit2_opts_get_user_agent() public static void git_libgit2_opts_set_extensions(string[] extensions) { - var res = NativeMethods.git_libgit2_opts((int)LibGit2Option.SetExtensions, extensions, extensions.Length); - Ensure.ZeroResult(res); + using(var array = GitStrArrayManaged.BuildFrom(extensions)) + { + var res = NativeMethods.git_libgit2_opts((int)LibGit2Option.SetExtensions, array.Array); + Ensure.ZeroResult(res); + } } public static string[] git_libgit2_opts_get_extensions() From 5a515d77b05660fbca56e6f74e6c446aae2b7d8c Mon Sep 17 00:00:00 2001 From: Julien Richard Date: Mon, 22 Nov 2021 11:24:47 +0100 Subject: [PATCH 4/6] Attempt to fix memory corruption --- LibGit2Sharp/Core/NativeMethods.cs | 2 +- LibGit2Sharp/Core/Proxy.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LibGit2Sharp/Core/NativeMethods.cs b/LibGit2Sharp/Core/NativeMethods.cs index 69f58fed3..8c24cff3a 100644 --- a/LibGit2Sharp/Core/NativeMethods.cs +++ b/LibGit2Sharp/Core/NativeMethods.cs @@ -757,7 +757,7 @@ internal static extern int git_libgit2_opts(int option, // git_libgit2_opts(GIT_OPT_SET_EXTENSIONS, const char **extensions, size_t len) [DllImport(libgit2, CallingConvention = CallingConvention.Cdecl)] - internal static extern int git_libgit2_opts(int option, GitStrArray extensions); + internal static extern int git_libgit2_opts(int option, IntPtr extensions, UIntPtr len); // git_libgit2_opts(GIT_OPT_GET_EXTENSIONS, git_strarray *out) [DllImport(libgit2, CallingConvention = CallingConvention.Cdecl)] diff --git a/LibGit2Sharp/Core/Proxy.cs b/LibGit2Sharp/Core/Proxy.cs index 921fd7bbc..425bec52a 100644 --- a/LibGit2Sharp/Core/Proxy.cs +++ b/LibGit2Sharp/Core/Proxy.cs @@ -3505,7 +3505,7 @@ public static void git_libgit2_opts_set_extensions(string[] extensions) { using(var array = GitStrArrayManaged.BuildFrom(extensions)) { - var res = NativeMethods.git_libgit2_opts((int)LibGit2Option.SetExtensions, array.Array); + var res = NativeMethods.git_libgit2_opts((int)LibGit2Option.SetExtensions, array.Array.Strings, array.Array.Count); Ensure.ZeroResult(res); } } From 0a2e640f766b947ddc1b617523bcd862c25cb5d3 Mon Sep 17 00:00:00 2001 From: Julien Richard Date: Mon, 22 Nov 2021 11:34:51 +0100 Subject: [PATCH 5/6] Cosmetic --- LibGit2Sharp/Core/Proxy.cs | 2 +- LibGit2Sharp/LibGit2Sharp.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LibGit2Sharp/Core/Proxy.cs b/LibGit2Sharp/Core/Proxy.cs index 425bec52a..78c8bc914 100644 --- a/LibGit2Sharp/Core/Proxy.cs +++ b/LibGit2Sharp/Core/Proxy.cs @@ -3503,7 +3503,7 @@ public static string git_libgit2_opts_get_user_agent() public static void git_libgit2_opts_set_extensions(string[] extensions) { - using(var array = GitStrArrayManaged.BuildFrom(extensions)) + using (var array = GitStrArrayManaged.BuildFrom(extensions)) { var res = NativeMethods.git_libgit2_opts((int)LibGit2Option.SetExtensions, array.Array.Strings, array.Array.Count); Ensure.ZeroResult(res); diff --git a/LibGit2Sharp/LibGit2Sharp.csproj b/LibGit2Sharp/LibGit2Sharp.csproj index 1bbc3073b..57c81cdfb 100644 --- a/LibGit2Sharp/LibGit2Sharp.csproj +++ b/LibGit2Sharp/LibGit2Sharp.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netcoreapp3.1 From 3c4473c4176e5d1b4eb763ded95fa9e3450206a8 Mon Sep 17 00:00:00 2001 From: Julien Richard Date: Mon, 22 Nov 2021 14:17:45 +0100 Subject: [PATCH 6/6] Update test --- LibGit2Sharp.Tests/GlobalSettingsFixture.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/LibGit2Sharp.Tests/GlobalSettingsFixture.cs b/LibGit2Sharp.Tests/GlobalSettingsFixture.cs index 7a701ab8c..bd9a53d1b 100644 --- a/LibGit2Sharp.Tests/GlobalSettingsFixture.cs +++ b/LibGit2Sharp.Tests/GlobalSettingsFixture.cs @@ -93,14 +93,19 @@ public void SetExtensions() Assert.Equal(new[] { "noop" }, extensions); // Disable "noop" extensions - GlobalSettings.SetExtensions(new[] { "!noop" }); + GlobalSettings.SetExtensions("!noop"); extensions = GlobalSettings.GetExtensions(); Assert.Empty(extensions); // Enable two new extensions (it will reset the configuration and "noop" will be enabled) - GlobalSettings.SetExtensions(new[] { "partialclone", "newext" }); + GlobalSettings.SetExtensions("partialclone", "newext"); extensions = GlobalSettings.GetExtensions(); Assert.Equal(new[] { "noop", "partialclone", "newext" }, extensions); + + // You can have multiple times the same extension + GlobalSettings.SetExtensions("noop", "test", "test" ); + extensions = GlobalSettings.GetExtensions(); + Assert.Equal(new[] { "noop", "noop", "test", "test" }, extensions); } } }