{"thread":{"id":"57213","subject":"[PATCH] lazyload: use correct calling conventions","startedAt":"2022-01-08T16:02:34Z","lastAt":"2022-01-12T18:13:58Z","messageCount":5,"participants":["Matthias Aßhauer via GitGitGadget","Junio C Hamano","Johannes Schindelin"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"445794","messageId":"pull.1181.git.git.1641657750776.gitgitgadget@gmail.com","threadId":"57213","inReplyTo":null,"subject":"[PATCH] lazyload: use correct calling conventions","fromName":"Matthias Aßhauer via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2022-01-08T16:02:30Z","receivedAt":"2022-01-08T16:02:34Z","isPatch":true,"sender":{"key":"mha1993@live.de","avatar":"https://avatars.githubusercontent.com/u/6178234?v=4"},"body":"From: =?UTF-8?q?Matthias=20A=C3=9Fhauer?= <mha1993@live.de>\n\nChristoph Reiter reported on the Git for Windows issue tracker[1], that\nmingw_strftime() imports strftime() from ucrtbase.dll with the wrong\ncalling convention. It should be __cdecl instead of WINAPI, which we\nalways use in DECLARE_PROC_ADDR().\n\nThe MSYS2 project encountered cmake sefaults on x86 Windows caused by\nthe same issue in the cmake source. [2] There are no known git crashes\nthat where caused by this, yet, but we should try to prevent them.\n\nWe import two other non-WINAPI functions via DECLARE_PROC_ADDR(), too.\n\n* NtSetSystemInformation() (NTAPI)\n* GetUserNameExW()         (SEC_ENTRY)\n\nNTAPI, SEC_ENTRY and WINAPI are all ususally defined as __stdcall,\nbut there are circumstances where they're defined differently.\n\nTeach DECLARE_PROC_ADDR() about calling conventions and be explicit\nabout when we want to use which calling convention.\n\nImport winnt.h for the definition of NTAPI and sspi.h for SEC_ENTRY\nnear their respective only users.\n\n[1] https://github.com/git-for-windows/git/issues/3560\n[2] https://github.com/msys2/MINGW-packages/issues/10152\n\nReported-By: Christoph Reiter <reiter.christoph@gmail.com>\nSigned-off-by: Matthias Aßhauer <mha1993@live.de>\n---\n    lazyload: use correct calling conventions\n    \n    I wanted to get this out a lot earlier, but got distracted by a lot of\n    work at $DAYJOB. I'm sorry about sending this this late in the 2.35.0\n    cycle.\n    \n    This applies cleanly on master and maint, but CI produces some weird\n    build failures that seem unrelated in both of those situations.\n    \n    On master the FreeBSD fails with\n    \n    > archive.c:337:35: error: '_Generic' is a C11 extension\n    > [-Werror,-Wc11-extensions] strbuf_addstr(&path_in_archive,\n    > basename(path)); ^ /usr/include/libgen.h:61:21: note: expanded from\n    > macro 'basename' #define basename(x) __generic(x, const char *,\n    > __old_basename, basename)(x) ^ /usr/include/sys/cdefs.h:329:2: note:\n    > expanded from macro '__generic' _Generic(expr, t: yes, default: no)\n    \n    While on maint the CI / linux32 (daald/ubuntu32:xenial) job just\n    straight up can't find make. I have no clue what's up with that, but I'm\n    fairly certain I'm not the direct cause of either of those failures.\n\nPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1181%2Frimrul%2Fwin-lazyload-calling-convention-v1\nFetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1181/rimrul/win-lazyload-calling-convention-v1\nPull-Request: https://github.com/git/git/pull/1181\n\n compat/mingw.c                           | 6 ++++--\n compat/win32/lazyload.h                  | 6 +++---\n compat/win32/trace2_win32_process_info.c | 4 ++--\n compat/winansi.c                         | 5 +++--\n t/helper/test-drop-caches.c              | 4 +++-\n 5 files changed, 15 insertions(+), 10 deletions(-)\n\ndiff --git a/compat/mingw.c b/compat/mingw.c\nindex 9e0cd1e097f..f38c4381123 100644\n--- a/compat/mingw.c\n+++ b/compat/mingw.c\n@@ -8,6 +8,8 @@\n #include \"win32/lazyload.h\"\n #include \"../config.h\"\n #include \"dir.h\"\n+#define SECURITY_WIN32\n+#include <sspi.h>\n \n #define HCAST(type, handle) ((type)(intptr_t)handle)\n \n@@ -1008,7 +1010,7 @@ size_t mingw_strftime(char *s, size_t max,\n \t/* a pointer to the original strftime in case we can't find the UCRT version */\n \tstatic size_t (*fallback)(char *, size_t, const char *, const struct tm *) = strftime;\n \tsize_t ret;\n-\tDECLARE_PROC_ADDR(ucrtbase.dll, size_t, strftime, char *, size_t,\n+\tDECLARE_PROC_ADDR(ucrtbase.dll, size_t, __cdecl, strftime, char *, size_t,\n \t\tconst char *, const struct tm *);\n \n \tif (INIT_PROC_ADDR(strftime))\n@@ -2183,7 +2185,7 @@ enum EXTENDED_NAME_FORMAT {\n \n static char *get_extended_user_info(enum EXTENDED_NAME_FORMAT type)\n {\n-\tDECLARE_PROC_ADDR(secur32.dll, BOOL, GetUserNameExW,\n+\tDECLARE_PROC_ADDR(secur32.dll, BOOL, SEC_ENTRY, GetUserNameExW,\n \t\tenum EXTENDED_NAME_FORMAT, LPCWSTR, PULONG);\n \tstatic wchar_t wbuffer[1024];\n \tDWORD len;\ndiff --git a/compat/win32/lazyload.h b/compat/win32/lazyload.h\nindex 2b3637135f6..f2bb96c89c7 100644\n--- a/compat/win32/lazyload.h\n+++ b/compat/win32/lazyload.h\n@@ -4,7 +4,7 @@\n /*\n  * A pair of macros to simplify loading of DLL functions. Example:\n  *\n- *   DECLARE_PROC_ADDR(kernel32.dll, BOOL, CreateHardLinkW,\n+ *   DECLARE_PROC_ADDR(kernel32.dll, BOOL, WINAPI, CreateHardLinkW,\n  *                     LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES);\n  *\n  *   if (!INIT_PROC_ADDR(CreateHardLinkW))\n@@ -25,10 +25,10 @@ struct proc_addr {\n };\n \n /* Declares a function to be loaded dynamically from a DLL. */\n-#define DECLARE_PROC_ADDR(dll, rettype, function, ...) \\\n+#define DECLARE_PROC_ADDR(dll, rettype, convention, function, ...) \\\n \tstatic struct proc_addr proc_addr_##function = \\\n \t{ #dll, #function, NULL, 0 }; \\\n-\ttypedef rettype (WINAPI *proc_type_##function)(__VA_ARGS__); \\\n+\ttypedef rettype (convention *proc_type_##function)(__VA_ARGS__); \\\n \tstatic proc_type_##function function\n \n /*\ndiff --git a/compat/win32/trace2_win32_process_info.c b/compat/win32/trace2_win32_process_info.c\nindex 8ccbd1c2c6f..a53fd924340 100644\n--- a/compat/win32/trace2_win32_process_info.c\n+++ b/compat/win32/trace2_win32_process_info.c\n@@ -143,8 +143,8 @@ static void get_is_being_debugged(void)\n  */\n static void get_peak_memory_info(void)\n {\n-\tDECLARE_PROC_ADDR(psapi.dll, BOOL, GetProcessMemoryInfo, HANDLE,\n-\t\t\t  PPROCESS_MEMORY_COUNTERS, DWORD);\n+\tDECLARE_PROC_ADDR(psapi.dll, BOOL, WINAPI, GetProcessMemoryInfo,\n+\t\t\t  HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD);\n \n \tif (INIT_PROC_ADDR(GetProcessMemoryInfo)) {\n \t\tPROCESS_MEMORY_COUNTERS pmc;\ndiff --git a/compat/winansi.c b/compat/winansi.c\nindex c27b20a79d9..4fceecf14ce 100644\n--- a/compat/winansi.c\n+++ b/compat/winansi.c\n@@ -45,8 +45,9 @@ typedef struct _CONSOLE_FONT_INFOEX {\n static void warn_if_raster_font(void)\n {\n \tDWORD fontFamily = 0;\n-\tDECLARE_PROC_ADDR(kernel32.dll, BOOL, GetCurrentConsoleFontEx,\n-\t\t\tHANDLE, BOOL, PCONSOLE_FONT_INFOEX);\n+\tDECLARE_PROC_ADDR(kernel32.dll, BOOL, WINAPI,\n+\t\t\tGetCurrentConsoleFontEx, HANDLE, BOOL,\n+\t\t\tPCONSOLE_FONT_INFOEX);\n \n \t/* don't bother if output was ascii only */\n \tif (!non_ascii_used)\ndiff --git a/t/helper/test-drop-caches.c b/t/helper/test-drop-caches.c\nindex 7b4278462bb..e37396dd9c2 100644\n--- a/t/helper/test-drop-caches.c\n+++ b/t/helper/test-drop-caches.c\n@@ -3,6 +3,7 @@\n \n #if defined(GIT_WINDOWS_NATIVE)\n #include \"lazyload.h\"\n+#include <winnt.h>\n \n static int cmd_sync(void)\n {\n@@ -86,7 +87,8 @@ static int cmd_dropcaches(void)\n {\n \tHANDLE hProcess = GetCurrentProcess();\n \tHANDLE hToken;\n-\tDECLARE_PROC_ADDR(ntdll.dll, DWORD, NtSetSystemInformation, INT, PVOID, ULONG);\n+\tDECLARE_PROC_ADDR(ntdll.dll, DWORD, NTAPI, NtSetSystemInformation, INT, PVOID,\n+\t\tULONG);\n \tSYSTEM_MEMORY_LIST_COMMAND command;\n \tint status;\n \n\nbase-commit: e9d7761bb94f20acc98824275e317fa82436c25d\n-- \ngitgitgadget\n"},{"id":"445883","messageId":"xmqqh7abxmxs.fsf@gitster.g","threadId":"57213","inReplyTo":"pull.1181.git.git.1641657750776.gitgitgadget@gmail.com","subject":"Re: [PATCH] lazyload: use correct calling conventions","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-01-10T22:09:35Z","receivedAt":"2022-01-10T22:09:40Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Dscho, how does this look?  My choices are\n\n - Waiting for review.\n - Will merge to 'next'.\n - Will merge to 'next' and then to 'master'.\n\nThe last one will make it as part of Git 2.35.0 final, unless there\nis some unexpected breakage found later.\n\nThanks.\n\n(no comment of my own appears after this line, but the original is\nleft as reference).\n\n\"Matthias Aßhauer via GitGitGadget\"  <gitgitgadget@gmail.com>\nwrites:\n\n> From: =?UTF-8?q?Matthias=20A=C3=9Fhauer?= <mha1993@live.de>\n>\n> Christoph Reiter reported on the Git for Windows issue tracker[1], that\n> mingw_strftime() imports strftime() from ucrtbase.dll with the wrong\n> calling convention. It should be __cdecl instead of WINAPI, which we\n> always use in DECLARE_PROC_ADDR().\n>\n> The MSYS2 project encountered cmake sefaults on x86 Windows caused by\n> the same issue in the cmake source. [2] There are no known git crashes\n> that where caused by this, yet, but we should try to prevent them.\n>\n> We import two other non-WINAPI functions via DECLARE_PROC_ADDR(), too.\n>\n> * NtSetSystemInformation() (NTAPI)\n> * GetUserNameExW()         (SEC_ENTRY)\n>\n> NTAPI, SEC_ENTRY and WINAPI are all ususally defined as __stdcall,\n> but there are circumstances where they're defined differently.\n>\n> Teach DECLARE_PROC_ADDR() about calling conventions and be explicit\n> about when we want to use which calling convention.\n>\n> Import winnt.h for the definition of NTAPI and sspi.h for SEC_ENTRY\n> near their respective only users.\n>\n> [1] https://github.com/git-for-windows/git/issues/3560\n> [2] https://github.com/msys2/MINGW-packages/issues/10152\n>\n> Reported-By: Christoph Reiter <reiter.christoph@gmail.com>\n> Signed-off-by: Matthias Aßhauer <mha1993@live.de>\n> ---\n>     lazyload: use correct calling conventions\n>     \n>     I wanted to get this out a lot earlier, but got distracted by a lot of\n>     work at $DAYJOB. I'm sorry about sending this this late in the 2.35.0\n>     cycle.\n>     \n>     This applies cleanly on master and maint, but CI produces some weird\n>     build failures that seem unrelated in both of those situations.\n>     \n>     On master the FreeBSD fails with\n>     \n>     > archive.c:337:35: error: '_Generic' is a C11 extension\n>     > [-Werror,-Wc11-extensions] strbuf_addstr(&path_in_archive,\n>     > basename(path)); ^ /usr/include/libgen.h:61:21: note: expanded from\n>     > macro 'basename' #define basename(x) __generic(x, const char *,\n>     > __old_basename, basename)(x) ^ /usr/include/sys/cdefs.h:329:2: note:\n>     > expanded from macro '__generic' _Generic(expr, t: yes, default: no)\n>     \n>     While on maint the CI / linux32 (daald/ubuntu32:xenial) job just\n>     straight up can't find make. I have no clue what's up with that, but I'm\n>     fairly certain I'm not the direct cause of either of those failures.\n>\n> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1181%2Frimrul%2Fwin-lazyload-calling-convention-v1\n> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1181/rimrul/win-lazyload-calling-convention-v1\n> Pull-Request: https://github.com/git/git/pull/1181\n>\n>  compat/mingw.c                           | 6 ++++--\n>  compat/win32/lazyload.h                  | 6 +++---\n>  compat/win32/trace2_win32_process_info.c | 4 ++--\n>  compat/winansi.c                         | 5 +++--\n>  t/helper/test-drop-caches.c              | 4 +++-\n>  5 files changed, 15 insertions(+), 10 deletions(-)\n>\n> diff --git a/compat/mingw.c b/compat/mingw.c\n> index 9e0cd1e097f..f38c4381123 100644\n> --- a/compat/mingw.c\n> +++ b/compat/mingw.c\n> @@ -8,6 +8,8 @@\n>  #include \"win32/lazyload.h\"\n>  #include \"../config.h\"\n>  #include \"dir.h\"\n> +#define SECURITY_WIN32\n> +#include <sspi.h>\n>  \n>  #define HCAST(type, handle) ((type)(intptr_t)handle)\n>  \n> @@ -1008,7 +1010,7 @@ size_t mingw_strftime(char *s, size_t max,\n>  \t/* a pointer to the original strftime in case we can't find the UCRT version */\n>  \tstatic size_t (*fallback)(char *, size_t, const char *, const struct tm *) = strftime;\n>  \tsize_t ret;\n> -\tDECLARE_PROC_ADDR(ucrtbase.dll, size_t, strftime, char *, size_t,\n> +\tDECLARE_PROC_ADDR(ucrtbase.dll, size_t, __cdecl, strftime, char *, size_t,\n>  \t\tconst char *, const struct tm *);\n>  \n>  \tif (INIT_PROC_ADDR(strftime))\n> @@ -2183,7 +2185,7 @@ enum EXTENDED_NAME_FORMAT {\n>  \n>  static char *get_extended_user_info(enum EXTENDED_NAME_FORMAT type)\n>  {\n> -\tDECLARE_PROC_ADDR(secur32.dll, BOOL, GetUserNameExW,\n> +\tDECLARE_PROC_ADDR(secur32.dll, BOOL, SEC_ENTRY, GetUserNameExW,\n>  \t\tenum EXTENDED_NAME_FORMAT, LPCWSTR, PULONG);\n>  \tstatic wchar_t wbuffer[1024];\n>  \tDWORD len;\n> diff --git a/compat/win32/lazyload.h b/compat/win32/lazyload.h\n> index 2b3637135f6..f2bb96c89c7 100644\n> --- a/compat/win32/lazyload.h\n> +++ b/compat/win32/lazyload.h\n> @@ -4,7 +4,7 @@\n>  /*\n>   * A pair of macros to simplify loading of DLL functions. Example:\n>   *\n> - *   DECLARE_PROC_ADDR(kernel32.dll, BOOL, CreateHardLinkW,\n> + *   DECLARE_PROC_ADDR(kernel32.dll, BOOL, WINAPI, CreateHardLinkW,\n>   *                     LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES);\n>   *\n>   *   if (!INIT_PROC_ADDR(CreateHardLinkW))\n> @@ -25,10 +25,10 @@ struct proc_addr {\n>  };\n>  \n>  /* Declares a function to be loaded dynamically from a DLL. */\n> -#define DECLARE_PROC_ADDR(dll, rettype, function, ...) \\\n> +#define DECLARE_PROC_ADDR(dll, rettype, convention, function, ...) \\\n>  \tstatic struct proc_addr proc_addr_##function = \\\n>  \t{ #dll, #function, NULL, 0 }; \\\n> -\ttypedef rettype (WINAPI *proc_type_##function)(__VA_ARGS__); \\\n> +\ttypedef rettype (convention *proc_type_##function)(__VA_ARGS__); \\\n>  \tstatic proc_type_##function function\n>  \n>  /*\n> diff --git a/compat/win32/trace2_win32_process_info.c b/compat/win32/trace2_win32_process_info.c\n> index 8ccbd1c2c6f..a53fd924340 100644\n> --- a/compat/win32/trace2_win32_process_info.c\n> +++ b/compat/win32/trace2_win32_process_info.c\n> @@ -143,8 +143,8 @@ static void get_is_being_debugged(void)\n>   */\n>  static void get_peak_memory_info(void)\n>  {\n> -\tDECLARE_PROC_ADDR(psapi.dll, BOOL, GetProcessMemoryInfo, HANDLE,\n> -\t\t\t  PPROCESS_MEMORY_COUNTERS, DWORD);\n> +\tDECLARE_PROC_ADDR(psapi.dll, BOOL, WINAPI, GetProcessMemoryInfo,\n> +\t\t\t  HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD);\n>  \n>  \tif (INIT_PROC_ADDR(GetProcessMemoryInfo)) {\n>  \t\tPROCESS_MEMORY_COUNTERS pmc;\n> diff --git a/compat/winansi.c b/compat/winansi.c\n> index c27b20a79d9..4fceecf14ce 100644\n> --- a/compat/winansi.c\n> +++ b/compat/winansi.c\n> @@ -45,8 +45,9 @@ typedef struct _CONSOLE_FONT_INFOEX {\n>  static void warn_if_raster_font(void)\n>  {\n>  \tDWORD fontFamily = 0;\n> -\tDECLARE_PROC_ADDR(kernel32.dll, BOOL, GetCurrentConsoleFontEx,\n> -\t\t\tHANDLE, BOOL, PCONSOLE_FONT_INFOEX);\n> +\tDECLARE_PROC_ADDR(kernel32.dll, BOOL, WINAPI,\n> +\t\t\tGetCurrentConsoleFontEx, HANDLE, BOOL,\n> +\t\t\tPCONSOLE_FONT_INFOEX);\n>  \n>  \t/* don't bother if output was ascii only */\n>  \tif (!non_ascii_used)\n> diff --git a/t/helper/test-drop-caches.c b/t/helper/test-drop-caches.c\n> index 7b4278462bb..e37396dd9c2 100644\n> --- a/t/helper/test-drop-caches.c\n> +++ b/t/helper/test-drop-caches.c\n> @@ -3,6 +3,7 @@\n>  \n>  #if defined(GIT_WINDOWS_NATIVE)\n>  #include \"lazyload.h\"\n> +#include <winnt.h>\n>  \n>  static int cmd_sync(void)\n>  {\n> @@ -86,7 +87,8 @@ static int cmd_dropcaches(void)\n>  {\n>  \tHANDLE hProcess = GetCurrentProcess();\n>  \tHANDLE hToken;\n> -\tDECLARE_PROC_ADDR(ntdll.dll, DWORD, NtSetSystemInformation, INT, PVOID, ULONG);\n> +\tDECLARE_PROC_ADDR(ntdll.dll, DWORD, NTAPI, NtSetSystemInformation, INT, PVOID,\n> +\t\tULONG);\n>  \tSYSTEM_MEMORY_LIST_COMMAND command;\n>  \tint status;\n>  \n>\n> base-commit: e9d7761bb94f20acc98824275e317fa82436c25d\n"},{"id":"445920","messageId":"nycvar.QRO.7.76.6.2201111412300.1081@tvgsbejvaqbjf.bet","threadId":"57213","inReplyTo":"xmqqh7abxmxs.fsf@gitster.g","subject":"Re: [PATCH] lazyload: use correct calling conventions","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2022-01-11T13:17:39Z","receivedAt":"2022-01-11T13:18:04Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi Junio,\n\nOn Mon, 10 Jan 2022, Junio C Hamano wrote:\n\n> Dscho, how does this look?  My choices are\n>\n>  - Waiting for review.\n>  - Will merge to 'next'.\n>  - Will merge to 'next' and then to 'master'.\n\nMy preference is the last option, merge it down quickly.\n\n> The last one will make it as part of Git 2.35.0 final, unless there\n> is some unexpected breakage found later.\n\nI do not expect anything to break. Just like Matthias, I actually expect\nfuture breakages to be fended off by this.\n\nMerging it into v2.35.0 final will require a tiny fixup in\n`compat/win32/flush.c` (which we carry in Git for Windows already), but\nthat's a much smaller deal than the fall-out of the v2.34.0 refactorings\nwe had to deal with.\n\nThank you,\nDscho\n"},{"id":"445977","messageId":"nycvar.QRO.7.76.6.2201112330480.1081@tvgsbejvaqbjf.bet","threadId":"57213","inReplyTo":"nycvar.QRO.7.76.6.2201111412300.1081@tvgsbejvaqbjf.bet","subject":"Re: [PATCH] lazyload: use correct calling conventions","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2022-01-11T22:33:41Z","receivedAt":"2022-01-11T22:33:53Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi Junio,\n\nOn Tue, 11 Jan 2022, Johannes Schindelin wrote:\n\n> On Mon, 10 Jan 2022, Junio C Hamano wrote:\n>\n> > Dscho, how does this look?  My choices are\n> >\n> >  - Waiting for review.\n> >  - Will merge to 'next'.\n> >  - Will merge to 'next' and then to 'master'.\n>\n> My preference is the last option, merge it down quickly.\n>\n> > The last one will make it as part of Git 2.35.0 final, unless there\n> > is some unexpected breakage found later.\n>\n> I do not expect anything to break. Just like Matthias, I actually expect\n> future breakages to be fended off by this.\n\nAnd that future is here already. We just got a report of a problem that is\nresolved by Matthias' patch:\nhttps://github.com/git-for-windows/git/pull/3624\n\n> Merging it into v2.35.0 final will require a tiny fixup in\n> `compat/win32/flush.c` (which we carry in Git for Windows already),\n> [...]\n\nAnd I did that, and opened a PR already, which I plan on merging soon:\nhttps://github.com/git-for-windows/git/pull/3626\n\nCiao,\nDscho\n"},{"id":"446043","messageId":"xmqqbl0gx1oa.fsf@gitster.g","threadId":"57213","inReplyTo":"nycvar.QRO.7.76.6.2201111412300.1081@tvgsbejvaqbjf.bet","subject":"Re: [PATCH] lazyload: use correct calling conventions","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2022-01-12T18:13:25Z","receivedAt":"2022-01-12T18:13:58Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:\n\n> Hi Junio,\n>\n> On Mon, 10 Jan 2022, Junio C Hamano wrote:\n>\n>> Dscho, how does this look?  My choices are\n>>\n>>  - Waiting for review.\n>>  - Will merge to 'next'.\n>>  - Will merge to 'next' and then to 'master'.\n>\n> My preference is the last option, merge it down quickly.\n\nGood.  Will do.  Thanks.\n"}]}