]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge tag 'v2.35.0-rc1'
authorJiang Xin <worldhello.net@gmail.com>
Mon, 17 Jan 2022 00:30:45 +0000 (08:30 +0800)
committerJiang Xin <worldhello.net@gmail.com>
Mon, 17 Jan 2022 00:30:45 +0000 (08:30 +0800)
Git 2.35-rc1

* tag 'v2.35.0-rc1':
  Git 2.35-rc1
  reftable tests: avoid "int" overflow, use "uint64_t"
  reftable: avoid initializing structs from structs
  t1450-fsck: exec-bit is not needed to make loose object writable
  refs API: use "failure_errno", not "errno"
  Last minute fixes before -rc1
  build: NonStop ships with an older zlib
  packfile: fix off-by-one error in decoding logic
  t/gpg: simplify test for unknown key
  branch: missing space fix at line 313
  fmt-merge-msg: prevent use-after-free with signed tags
  cache.h: drop duplicate `ensure_full_index()` declaration
  lazyload: use correct calling conventions
  fetch: fix deadlock when cleaning up lockfiles in async signals

22 files changed:
Documentation/RelNotes/2.35.0.txt
GIT-VERSION-GEN
branch.c
builtin/clone.c
builtin/fetch.c
cache.h
compat/mingw.c
compat/win32/lazyload.h
compat/win32/trace2_win32_process_info.c
compat/winansi.c
config.mak.uname
fmt-merge-msg.c
packfile.c
refs.c
refs/files-backend.c
reftable/merged_test.c
t/helper/test-drop-caches.c
t/t1450-fsck.sh
t/t6200-fmt-merge-msg.sh
t/t7510-signed-commit.sh
transport.c
transport.h

index 26efaf1cbc408eb3834bce893a4cc4a5f36c5806..fa5a7318a8b7f6a149ea171bb2517b2e9dad295b 100644 (file)
@@ -100,7 +100,7 @@ Performance, Internal Implementation, Development Support etc.
  * Teach and encourage first-time contributors to this project to
    state the base commit when they submit their topic.
 
- * The command line complation for "git send-email" options have been
+ * The command line completion for "git send-email" options have been
    tweaked to make it easier to keep it in sync with the command itself.
 
  * Ensure that the sparseness of the in-core index matches the
@@ -367,6 +367,13 @@ Fixes since v2.34
    it failed to restore changes to tracked ones.
    (merge 71cade5a0b en/stash-df-fix later to maint).
 
+ * Calling dynamically loaded functions on Windows has been corrected.
+   (merge 4a9b204920 ma/windows-dynload-fix later to maint).
+
+ * Some lockfile code called free() in signal-death code path, which
+   has been corrected.
+   (merge 58d4d7f1c5 ps/lockfile-cleanup-fix later to maint).
+
  * Other code cleanup, docfix, build fix, etc.
    (merge 74db416c9c cw/protocol-v2-doc-fix later to maint).
    (merge f9b2b6684d ja/doc-cleanup later to maint).
@@ -391,3 +398,5 @@ Fixes since v2.34
    (merge 999bba3e0b rs/daemon-plug-leak later to maint).
    (merge 786eb1ba39 js/l10n-mention-ngettext-early-in-readme later to maint).
    (merge 2f12b31b74 ab/makefile-msgfmt-wo-stats later to maint).
+   (merge 0517f591ca fs/gpg-unknown-key-test-fix later to maint).
+   (merge 97d6fb5a1f ma/header-dup-cleanup later to maint).
index 9a98b03aacafe966b60083e1c60d0c76668933a2..e9c1ad960f6ae5761c46105be76dc1c0bfbfa1a5 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.35.0-rc0
+DEF_VER=v2.35.0-rc1
 
 LF='
 '
index 829130bb115d9ac1fa387596712e5164205c8cc3..5d20a2e8484b22f321a60e01d63cb4c4bd8e88fe 100644 (file)
--- a/branch.c
+++ b/branch.c
@@ -310,7 +310,7 @@ int validate_new_branchname(const char *name, struct strbuf *ref, int force)
        worktrees = get_worktrees();
        wt = find_shared_symref(worktrees, "HEAD", ref->buf);
        if (wt && !wt->is_bare)
-               die(_("cannot force update the branch '%s'"
+               die(_("cannot force update the branch '%s' "
                      "checked out at '%s'"),
                    ref->buf + strlen("refs/heads/"), wt->path);
        free_worktrees(worktrees);
index 13d230d299b739583bcdf4ee4313cb8732cc3316..727e16e0aea435a1fe244c381d8bb7670e8e7a5a 100644 (file)
@@ -1290,7 +1290,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
         */
        submodule_progress = transport->progress;
 
-       transport_unlock_pack(transport);
+       transport_unlock_pack(transport, 0);
        transport_disconnect(transport);
 
        if (option_dissociate) {
index eaab8056bf99e5a2478e7a7b134c44fd52758c47..5f06b21f8e97c5459fdb558302c5b9b95e99eee8 100644 (file)
@@ -223,17 +223,22 @@ static struct option builtin_fetch_options[] = {
        OPT_END()
 };
 
-static void unlock_pack(void)
+static void unlock_pack(unsigned int flags)
 {
        if (gtransport)
-               transport_unlock_pack(gtransport);
+               transport_unlock_pack(gtransport, flags);
        if (gsecondary)
-               transport_unlock_pack(gsecondary);
+               transport_unlock_pack(gsecondary, flags);
+}
+
+static void unlock_pack_atexit(void)
+{
+       unlock_pack(0);
 }
 
 static void unlock_pack_on_signal(int signo)
 {
-       unlock_pack();
+       unlock_pack(TRANSPORT_UNLOCK_PACK_IN_SIGNAL_HANDLER);
        sigchain_pop(signo);
        raise(signo);
 }
@@ -1329,7 +1334,7 @@ static int fetch_and_consume_refs(struct transport *transport,
        trace2_region_leave("fetch", "consume_refs", the_repository);
 
 out:
-       transport_unlock_pack(transport);
+       transport_unlock_pack(transport, 0);
        return ret;
 }
 
@@ -1978,7 +1983,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv,
                gtransport->server_options = &server_options;
 
        sigchain_push_common(unlock_pack_on_signal);
-       atexit(unlock_pack);
+       atexit(unlock_pack_atexit);
        sigchain_push(SIGPIPE, SIG_IGN);
        exit_code = do_fetch(gtransport, &rs);
        sigchain_pop(SIGPIPE);
diff --git a/cache.h b/cache.h
index 5d7463e6fb7e6ca631cd44fbca91920a56203eaf..281f00ab1b161dc71d0bcdae91222e9429ba0342 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -350,8 +350,6 @@ void add_name_hash(struct index_state *istate, struct cache_entry *ce);
 void remove_name_hash(struct index_state *istate, struct cache_entry *ce);
 void free_name_hash(struct index_state *istate);
 
-void ensure_full_index(struct index_state *istate);
-
 /* Cache entry creation and cleanup */
 
 /*
index e14f2d5f77ce7c5f7790f6f1f9143cc3fdae67b0..640dcb11de0dd6421c66a70a660a7fbc8bae4530 100644 (file)
@@ -8,6 +8,8 @@
 #include "win32/lazyload.h"
 #include "../config.h"
 #include "dir.h"
+#define SECURITY_WIN32
+#include <sspi.h>
 
 #define HCAST(type, handle) ((type)(intptr_t)handle)
 
@@ -1008,7 +1010,7 @@ size_t mingw_strftime(char *s, size_t max,
        /* a pointer to the original strftime in case we can't find the UCRT version */
        static size_t (*fallback)(char *, size_t, const char *, const struct tm *) = strftime;
        size_t ret;
-       DECLARE_PROC_ADDR(ucrtbase.dll, size_t, strftime, char *, size_t,
+       DECLARE_PROC_ADDR(ucrtbase.dll, size_t, __cdecl, strftime, char *, size_t,
                const char *, const struct tm *);
 
        if (INIT_PROC_ADDR(strftime))
@@ -2185,7 +2187,7 @@ enum EXTENDED_NAME_FORMAT {
 
 static char *get_extended_user_info(enum EXTENDED_NAME_FORMAT type)
 {
-       DECLARE_PROC_ADDR(secur32.dll, BOOL, GetUserNameExW,
+       DECLARE_PROC_ADDR(secur32.dll, BOOL, SEC_ENTRY, GetUserNameExW,
                enum EXTENDED_NAME_FORMAT, LPCWSTR, PULONG);
        static wchar_t wbuffer[1024];
        DWORD len;
index 2b3637135f68a3e7c2acadf0971e143cf689db02..f2bb96c89c735c67ab9915e6ced1e9feabb043b4 100644 (file)
@@ -4,7 +4,7 @@
 /*
  * A pair of macros to simplify loading of DLL functions. Example:
  *
- *   DECLARE_PROC_ADDR(kernel32.dll, BOOL, CreateHardLinkW,
+ *   DECLARE_PROC_ADDR(kernel32.dll, BOOL, WINAPI, CreateHardLinkW,
  *                     LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES);
  *
  *   if (!INIT_PROC_ADDR(CreateHardLinkW))
@@ -25,10 +25,10 @@ struct proc_addr {
 };
 
 /* Declares a function to be loaded dynamically from a DLL. */
-#define DECLARE_PROC_ADDR(dll, rettype, function, ...) \
+#define DECLARE_PROC_ADDR(dll, rettype, convention, function, ...) \
        static struct proc_addr proc_addr_##function = \
        { #dll, #function, NULL, 0 }; \
-       typedef rettype (WINAPI *proc_type_##function)(__VA_ARGS__); \
+       typedef rettype (convention *proc_type_##function)(__VA_ARGS__); \
        static proc_type_##function function
 
 /*
index 8ccbd1c2c6f82d68e0c39f8ec77aa2bd4a899f2e..a53fd924340f7d6da04e5197363fe831b9d19bf3 100644 (file)
@@ -143,8 +143,8 @@ static void get_is_being_debugged(void)
  */
 static void get_peak_memory_info(void)
 {
-       DECLARE_PROC_ADDR(psapi.dll, BOOL, GetProcessMemoryInfo, HANDLE,
-                         PPROCESS_MEMORY_COUNTERS, DWORD);
+       DECLARE_PROC_ADDR(psapi.dll, BOOL, WINAPI, GetProcessMemoryInfo,
+                         HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD);
 
        if (INIT_PROC_ADDR(GetProcessMemoryInfo)) {
                PROCESS_MEMORY_COUNTERS pmc;
index c27b20a79d91cf7877d795c96e64cbadafdad7fd..4fceecf14ce599b585801bcb1ebc0b4e2c22af06 100644 (file)
@@ -45,8 +45,9 @@ typedef struct _CONSOLE_FONT_INFOEX {
 static void warn_if_raster_font(void)
 {
        DWORD fontFamily = 0;
-       DECLARE_PROC_ADDR(kernel32.dll, BOOL, GetCurrentConsoleFontEx,
-                       HANDLE, BOOL, PCONSOLE_FONT_INFOEX);
+       DECLARE_PROC_ADDR(kernel32.dll, BOOL, WINAPI,
+                       GetCurrentConsoleFontEx, HANDLE, BOOL,
+                       PCONSOLE_FONT_INFOEX);
 
        /* don't bother if output was ascii only */
        if (!non_ascii_used)
index a3a779327f8d5f4a523bb7b9a0b9d8905151a996..9b3e9bff5f5f8be12483a4b6001921b399373357 100644 (file)
@@ -576,6 +576,7 @@ ifeq ($(uname_S),NONSTOP_KERNEL)
        NO_SETENV = YesPlease
        NO_UNSETENV = YesPlease
        NO_MKDTEMP = YesPlease
+       NO_UNCOMPRESS2 = YesPlease
        # Currently libiconv-1.9.1.
        OLD_ICONV = UnfortunatelyYes
        NO_REGEX = NeedsStartEnd
index e5c0aff2bf684f2726a2628a80cedddfc1048e91..baca57d5b64c9f30bad08a505ccd7f1a9ba38546 100644 (file)
@@ -541,7 +541,6 @@ static void fmt_merge_msg_sigs(struct strbuf *out)
                        else
                                strbuf_addstr(&sig, sigc.output);
                }
-               signature_check_clear(&sigc);
 
                if (!tag_number++) {
                        fmt_tag_signature(&tagbuf, &sig, buf, len);
@@ -565,6 +564,7 @@ static void fmt_merge_msg_sigs(struct strbuf *out)
                }
                strbuf_release(&payload);
                strbuf_release(&sig);
+               signature_check_clear(&sigc);
        next:
                free(origbuf);
        }
index 11bb262482a1304c13cd32685744607de2e664bb..835b2d271645ce08b7f98214748d3ffe4296edb8 100644 (file)
@@ -1069,7 +1069,7 @@ unsigned long unpack_object_header_buffer(const unsigned char *buf,
        size = c & 15;
        shift = 4;
        while (c & 0x80) {
-               if (len <= used || (bitsizeof(long) - 7) <= shift) {
+               if (len <= used || (bitsizeof(long) - 7) < shift) {
                        error("bad object header");
                        size = used = 0;
                        break;
diff --git a/refs.c b/refs.c
index bd2546ae230dd614a4021537b2ad21956843f982..addb26293b4ffc1b0c997379acce5d13d70991c8 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -1722,8 +1722,6 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs,
                if (refs_read_raw_ref(refs, refname, oid, &sb_refname,
                                      &read_flags, failure_errno)) {
                        *flags |= read_flags;
-                       if (errno)
-                               *failure_errno = errno;
 
                        /* In reading mode, refs must eventually resolve */
                        if (resolve_flags & RESOLVE_REF_READING)
index b529fdf237eaeabd61ac350c1a42c5e24ec85108..43a3b882d7c50c231ae714f79b4a4fedfa7e1c9d 100644 (file)
@@ -382,7 +382,6 @@ stat_ref:
        if (lstat(path, &st) < 0) {
                int ignore_errno;
                myerr = errno;
-               errno = 0;
                if (myerr != ENOENT)
                        goto out;
                if (refs_read_raw_ref(refs->packed_ref_store, refname, oid,
@@ -399,7 +398,6 @@ stat_ref:
                strbuf_reset(&sb_contents);
                if (strbuf_readlink(&sb_contents, path, st.st_size) < 0) {
                        myerr = errno;
-                       errno = 0;
                        if (myerr == ENOENT || myerr == EINVAL)
                                /* inconsistent with lstat; retry */
                                goto stat_ref;
@@ -469,6 +467,7 @@ out:
 
        strbuf_release(&sb_path);
        strbuf_release(&sb_contents);
+       errno = 0;
        return ret;
 }
 
index 24461e8a80256817cc3cade717a70b7ba2d66369..d08c16abefbc3d8562c29cf1703d1a6908f71dcd 100644 (file)
@@ -24,8 +24,8 @@ https://developers.google.com/open-source/licenses/bsd
 static void write_test_table(struct strbuf *buf,
                             struct reftable_ref_record refs[], int n)
 {
-       int min = 0xffffffff;
-       int max = 0;
+       uint64_t min = 0xffffffff;
+       uint64_t max = 0;
        int i = 0;
        int err;
 
@@ -207,11 +207,11 @@ static void test_merged(void)
                },
        };
 
-       struct reftable_ref_record want[] = {
-               r2[0],
-               r1[1],
-               r3[0],
-               r3[1],
+       struct reftable_ref_record *want[] = {
+               &r2[0],
+               &r1[1],
+               &r3[0],
+               &r3[1],
        };
 
        struct reftable_ref_record *refs[] = { r1, r2, r3 };
@@ -250,7 +250,7 @@ static void test_merged(void)
 
        EXPECT(ARRAY_SIZE(want) == len);
        for (i = 0; i < len; i++) {
-               EXPECT(reftable_ref_record_equal(&want[i], &out[i],
+               EXPECT(reftable_ref_record_equal(want[i], &out[i],
                                                 GIT_SHA1_RAWSZ));
        }
        for (i = 0; i < len; i++) {
@@ -345,10 +345,10 @@ static void test_merged_logs(void)
                        .value_type = REFTABLE_LOG_DELETION,
                },
        };
-       struct reftable_log_record want[] = {
-               r2[0],
-               r3[0],
-               r1[1],
+       struct reftable_log_record *want[] = {
+               &r2[0],
+               &r3[0],
+               &r1[1],
        };
 
        struct reftable_log_record *logs[] = { r1, r2, r3 };
@@ -387,7 +387,7 @@ static void test_merged_logs(void)
 
        EXPECT(ARRAY_SIZE(want) == len);
        for (i = 0; i < len; i++) {
-               EXPECT(reftable_log_record_equal(&want[i], &out[i],
+               EXPECT(reftable_log_record_equal(want[i], &out[i],
                                                 GIT_SHA1_RAWSZ));
        }
 
index 7b4278462bb7166522369aa9d74147fa36c03835..e37396dd9c2c2fe01b9bf2acc8d6a2c6456869fc 100644 (file)
@@ -3,6 +3,7 @@
 
 #if defined(GIT_WINDOWS_NATIVE)
 #include "lazyload.h"
+#include <winnt.h>
 
 static int cmd_sync(void)
 {
@@ -86,7 +87,8 @@ static int cmd_dropcaches(void)
 {
        HANDLE hProcess = GetCurrentProcess();
        HANDLE hToken;
-       DECLARE_PROC_ADDR(ntdll.dll, DWORD, NtSetSystemInformation, INT, PVOID, ULONG);
+       DECLARE_PROC_ADDR(ntdll.dll, DWORD, NTAPI, NtSetSystemInformation, INT, PVOID,
+               ULONG);
        SYSTEM_MEMORY_LIST_COMMAND command;
        int status;
 
index 6337236fd8226b1902f11ebf54ff9e6d02f537e2..de50c0ea018cfa981312c9f146f8265544e64711 100755 (executable)
@@ -94,13 +94,13 @@ test_expect_success 'object with hash and type mismatch' '
        )
 '
 
-test_expect_success POSIXPERM 'zlib corrupt loose object output ' '
+test_expect_success 'zlib corrupt loose object output ' '
        git init --bare corrupt-loose-output &&
        (
                cd corrupt-loose-output &&
                oid=$(git hash-object -w --stdin --literally </dev/null) &&
                oidf=objects/$(test_oid_to_path "$oid") &&
-               chmod 755 $oidf &&
+               chmod +w $oidf &&
                echo extra garbage >>$oidf &&
 
                cat >expect.error <<-EOF &&
index 7544245f9026d5a705dd8ab00e645db5a2e19c36..5a221f8ef1fd810731a4dd8b0d5cdab988084ed8 100755 (executable)
@@ -126,6 +126,7 @@ test_expect_success GPG 'message for merging local tag signed by good key' '
        git fetch . signed-good-tag &&
        git fmt-merge-msg <.git/FETCH_HEAD >actual &&
        grep "^Merge tag ${apos}signed-good-tag${apos}" actual &&
+       grep "^signed-tag-msg" actual &&
        grep "^# gpg: Signature made" actual &&
        grep "^# gpg: Good signature from" actual
 '
@@ -135,6 +136,7 @@ test_expect_success GPG 'message for merging local tag signed by unknown key' '
        git fetch . signed-good-tag &&
        GNUPGHOME=. git fmt-merge-msg <.git/FETCH_HEAD >actual &&
        grep "^Merge tag ${apos}signed-good-tag${apos}" actual &&
+       grep "^signed-tag-msg" actual &&
        grep "^# gpg: Signature made" actual &&
        grep -E "^# gpg: Can${apos}t check signature: (public key not found|No public key)" actual
 '
@@ -145,6 +147,7 @@ test_expect_success GPGSSH 'message for merging local tag signed by good ssh key
        git fetch . signed-good-ssh-tag &&
        git fmt-merge-msg <.git/FETCH_HEAD >actual &&
        grep "^Merge tag ${apos}signed-good-ssh-tag${apos}" actual &&
+       grep "^signed-ssh-tag-msg" actual &&
        grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual &&
        ! grep "${GPGSSH_BAD_SIGNATURE}" actual
 '
@@ -155,6 +158,7 @@ test_expect_success GPGSSH 'message for merging local tag signed by unknown ssh
        git fetch . signed-untrusted-ssh-tag &&
        git fmt-merge-msg <.git/FETCH_HEAD >actual &&
        grep "^Merge tag ${apos}signed-untrusted-ssh-tag${apos}" actual &&
+       grep "^signed-ssh-tag-msg-untrusted" actual &&
        grep "${GPGSSH_GOOD_SIGNATURE_UNTRUSTED}" actual &&
        ! grep "${GPGSSH_BAD_SIGNATURE}" actual &&
        grep "${GPGSSH_KEY_NOT_TRUSTED}" actual
@@ -166,6 +170,7 @@ test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'message for merging local tag sign
        git fetch . expired-signed &&
        git fmt-merge-msg <.git/FETCH_HEAD >actual &&
        grep "^Merge tag ${apos}expired-signed${apos}" actual &&
+       grep "^expired-signed" actual &&
        ! grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual
 '
 
@@ -175,6 +180,7 @@ test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'message for merging local tag sign
        git fetch . notyetvalid-signed &&
        git fmt-merge-msg <.git/FETCH_HEAD >actual &&
        grep "^Merge tag ${apos}notyetvalid-signed${apos}" actual &&
+       grep "^notyetvalid-signed" actual &&
        ! grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual
 '
 
@@ -184,6 +190,7 @@ test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'message for merging local tag sign
        git fetch . timeboxedvalid-signed &&
        git fmt-merge-msg <.git/FETCH_HEAD >actual &&
        grep "^Merge tag ${apos}timeboxedvalid-signed${apos}" actual &&
+       grep "^timeboxedvalid-signed" actual &&
        grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual &&
        ! grep "${GPGSSH_BAD_SIGNATURE}" actual
 '
@@ -194,6 +201,7 @@ test_expect_success GPGSSH,GPGSSH_VERIFYTIME 'message for merging local tag sign
        git fetch . timeboxedinvalid-signed &&
        git fmt-merge-msg <.git/FETCH_HEAD >actual &&
        grep "^Merge tag ${apos}timeboxedinvalid-signed${apos}" actual &&
+       grep "^timeboxedinvalid-signed" actual &&
        ! grep "${GPGSSH_GOOD_SIGNATURE_TRUSTED}" actual
 '
 
index 9882b69ae297000a0f64a05ab6ac0aec9f4ca50c..8593b7e3cb8d9aa0c4badeef4273ed406cecc9ca 100755 (executable)
@@ -71,25 +71,7 @@ test_expect_success GPG 'create signed commits' '
        git tag eleventh-signed $(cat oid) &&
        echo 12 | git commit-tree --gpg-sign=B7227189 HEAD^{tree} >oid &&
        test_line_count = 1 oid &&
-       git tag twelfth-signed-alt $(cat oid) &&
-
-       cat >keydetails <<-\EOF &&
-       Key-Type: RSA
-       Key-Length: 2048
-       Subkey-Type: RSA
-       Subkey-Length: 2048
-       Name-Real: Unknown User
-       Name-Email: unknown@git.com
-       Expire-Date: 0
-       %no-ask-passphrase
-       %no-protection
-       EOF
-       gpg --batch --gen-key keydetails &&
-       echo 13 >file && git commit -a -S"unknown@git.com" -m thirteenth &&
-       git tag thirteenth-signed &&
-       DELETE_FINGERPRINT=$(gpg -K --with-colons --fingerprint --batch unknown@git.com | grep "^fpr" | head -n 1 | awk -F ":" "{print \$10;}") &&
-       gpg --batch --yes --delete-secret-keys $DELETE_FINGERPRINT &&
-       gpg --batch --yes --delete-keys unknown@git.com
+       git tag twelfth-signed-alt $(cat oid)
 '
 
 test_expect_success GPG 'verify and show signatures' '
@@ -129,7 +111,7 @@ test_expect_success GPG 'verify and show signatures' '
 '
 
 test_expect_success GPG 'verify-commit exits failure on unknown signature' '
-       test_must_fail git verify-commit thirteenth-signed 2>actual &&
+       test_must_fail env GNUPGHOME="$GNUPGHOME_NOT_USED" git verify-commit initial 2>actual &&
        ! grep "Good signature from" actual &&
        ! grep "BAD signature from" actual &&
        grep -q -F -e "No public key" -e "public key not found" actual
index 92ab9a3fa6b2d397c292c9e1605d1de56ec8940c..2a3e32415455baf09f165837cb169e31ab6876f5 100644 (file)
@@ -1456,13 +1456,18 @@ int transport_fetch_refs(struct transport *transport, struct ref *refs)
        return rc;
 }
 
-void transport_unlock_pack(struct transport *transport)
+void transport_unlock_pack(struct transport *transport, unsigned int flags)
 {
+       int in_signal_handler = !!(flags & TRANSPORT_UNLOCK_PACK_IN_SIGNAL_HANDLER);
        int i;
 
        for (i = 0; i < transport->pack_lockfiles.nr; i++)
-               unlink_or_warn(transport->pack_lockfiles.items[i].string);
-       string_list_clear(&transport->pack_lockfiles, 0);
+               if (in_signal_handler)
+                       unlink(transport->pack_lockfiles.items[i].string);
+               else
+                       unlink_or_warn(transport->pack_lockfiles.items[i].string);
+       if (!in_signal_handler)
+               string_list_clear(&transport->pack_lockfiles, 0);
 }
 
 int transport_connect(struct transport *transport, const char *name,
index 8bb4c8bbc8cae2059060ae25044a160192a4354e..3f16e50c1965db222173a2330b12c26aee3d6d25 100644 (file)
@@ -279,7 +279,19 @@ const struct ref *transport_get_remote_refs(struct transport *transport,
  */
 const struct git_hash_algo *transport_get_hash_algo(struct transport *transport);
 int transport_fetch_refs(struct transport *transport, struct ref *refs);
-void transport_unlock_pack(struct transport *transport);
+
+/*
+ * If this flag is set, unlocking will avoid to call non-async-signal-safe
+ * functions. This will necessarily leave behind some data structures which
+ * cannot be cleaned up.
+ */
+#define TRANSPORT_UNLOCK_PACK_IN_SIGNAL_HANDLER (1 << 0)
+
+/*
+ * Unlock all packfiles locked by the transport.
+ */
+void transport_unlock_pack(struct transport *transport, unsigned int flags);
+
 int transport_disconnect(struct transport *transport);
 char *transport_anonymize_url(const char *url);
 void transport_take_over(struct transport *transport,