Git 2.35-rc1
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE4fA2sf7nIh/HeOzvsLXohpav5ssFAmHiBtAACgkQsLXohpav 5stIOhAAm4gFeQiBHR388LWieeKsi3uMYRZcog31I/oFAs6ym4xeZxp2JxzVVcnS ZT+P64ZlaHgmIB7nZht4QHuz8yUTC2j+p/46x+Q1tbznw+nxUJqqTZ8z08SXWSxY TX46Hm0dxv6ejYG7GZh4D5v8fWkU9p1rUBLQCXQWI8vyLEu6Ennj0FROrGjQFZqs nmDxWVXe20t+xwlbv2ipGMeR1Vp6y5FIpQGTknOEDJ7pXH8xgTZsvM0OpyCZ8w80 gNG++HmNDFvmhy3vZKl/Hs4XWRbbvaM9kUmv9T+dcCFZypIRvhUwwY1nTYYjJTyf OeNY2ejWwgMPsIAXltdUfBDEJW0jm1mXGESZtc6ntEIfrwTHa16ShvJOJI9IzxGb GpP9nNdJmdLQbz2rKb6T7snM7vA2IDGG33oSxcsJKqtrfPY18frDVZyxOv/lcwnZ vpFApbt6sj6URmpl3rGeCqdKn6r5oXSPNr+IMcH8I/2or5LeCJbgrH52zV99IuZV 1SKdshJyB5b9paCJJh+jPTQ7FuW1pgSdem1TCpSWlPw7+xAvoWEK3dP59uEUDZu4 +hH8izdjj+dYg6qIxP+IbPPHXNzOp4jw2GRkU1g6aEW0ANEphpdq76xMFMNnZEtV sknWCLdMc1EbHAsFwyCFfBvFuZy6YAXwLAEYWZBz6TLz/8imbNU= =ssCO -----END PGP SIGNATURE----- Merge tag 'v2.35.0-rc1' 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 signalsmaint
commit
90999dd686
|
@ -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).
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/sh
|
||||
|
||||
GVF=GIT-VERSION-FILE
|
||||
DEF_VER=v2.35.0-rc0
|
||||
DEF_VER=v2.35.0-rc1
|
||||
|
||||
LF='
|
||||
'
|
||||
|
|
2
branch.c
2
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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
2
cache.h
2
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 */
|
||||
|
||||
/*
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
/*
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
2
refs.c
2
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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -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
|
||||
'
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
11
transport.c
11
transport.c
|
@ -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,
|
||||
|
|
14
transport.h
14
transport.h
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue