Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Documentation/RelNotes/2.50.0.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ UI, Workflows & Features
* The commit title in the "rebase -i" todo file are now prefixed with
'#', just like a merge commit being replayed.

* "git receive-pack" optionally learns not to care about connectivity
check, which can be useful when the repository arranges to ensure
connectivity by some other means.


Performance, Internal Implementation, Development Support etc.
--------------------------------------------------------------
Expand Down Expand Up @@ -185,6 +189,10 @@ Performance, Internal Implementation, Development Support etc.

* Assorted fixes for issues found with CodeQL.

* Remove the leftover hints to the test framework to mark tests that
do not pass the leak checker tests, as they should no longer be
needed.


Fixes since v2.49
-----------------
Expand Down
12 changes: 12 additions & 0 deletions Documentation/git-receive-pack.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,18 @@ OPTIONS
`$GIT_URL/info/refs?service=git-receive-pack` requests. See
`--http-backend-info-refs` in linkgit:git-upload-pack[1].

--skip-connectivity-check::
Bypasses the connectivity checks that validate the existence of all
objects in the transitive closure of reachable objects. This option is
intended for server operators that want to implement their own object
connectivity validation outside of Git. This is useful in such cases
where the server-side knows additional information about how Git is
being used and thus can rely on certain guarantees to more efficiently
compute object connectivity that Git itself cannot make. Usage of this
option without a reliable external mechanism to ensure full reachable
object connectivity risks corrupting the repository and should not be
used in the general case.

PRE-RECEIVE HOOK
----------------
Before any ref is updated, if $GIT_DIR/hooks/pre-receive file exists
Expand Down
2 changes: 1 addition & 1 deletion GIT-VERSION-GEN
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/sh

DEF_VER=v2.49.GIT
DEF_VER=v2.50.0-rc0

LF='
'
Expand Down
40 changes: 22 additions & 18 deletions builtin/receive-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ static int prefer_ofs_delta = 1;
static int auto_update_server_info;
static int auto_gc = 1;
static int reject_thin;
static int skip_connectivity_check;
static int stateless_rpc;
static const char *service_dir;
static const char *head_name;
Expand Down Expand Up @@ -1938,27 +1939,29 @@ static void execute_commands(struct command *commands,
return;
}

if (use_sideband) {
memset(&muxer, 0, sizeof(muxer));
muxer.proc = copy_to_sideband;
muxer.in = -1;
if (!start_async(&muxer))
err_fd = muxer.in;
/* ...else, continue without relaying sideband */
}
if (!skip_connectivity_check) {
if (use_sideband) {
memset(&muxer, 0, sizeof(muxer));
muxer.proc = copy_to_sideband;
muxer.in = -1;
if (!start_async(&muxer))
err_fd = muxer.in;
/* ...else, continue without relaying sideband */
}

data.cmds = commands;
data.si = si;
opt.err_fd = err_fd;
opt.progress = err_fd && !quiet;
opt.env = tmp_objdir_env(tmp_objdir);
opt.exclude_hidden_refs_section = "receive";
data.cmds = commands;
data.si = si;
opt.err_fd = err_fd;
opt.progress = err_fd && !quiet;
opt.env = tmp_objdir_env(tmp_objdir);
opt.exclude_hidden_refs_section = "receive";

if (check_connected(iterate_receive_command_list, &data, &opt))
set_connectivity_errors(commands, si);
if (check_connected(iterate_receive_command_list, &data, &opt))
set_connectivity_errors(commands, si);

if (use_sideband)
finish_async(&muxer);
if (use_sideband)
finish_async(&muxer);
}

reject_updates_to_hidden(commands);

Expand Down Expand Up @@ -2519,6 +2522,7 @@ int cmd_receive_pack(int argc,

struct option options[] = {
OPT__QUIET(&quiet, N_("quiet")),
OPT_HIDDEN_BOOL(0, "skip-connectivity-check", &skip_connectivity_check, NULL),
OPT_HIDDEN_BOOL(0, "stateless-rpc", &stateless_rpc, NULL),
OPT_HIDDEN_BOOL(0, "http-backend-info-refs", &advertise_refs, NULL),
OPT_ALIAS(0, "advertise-refs", "http-backend-info-refs"),
Expand Down
2 changes: 1 addition & 1 deletion t/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -629,7 +629,7 @@ integration_tests = [
't5407-post-rewrite-hook.sh',
't5408-send-pack-stdin.sh',
't5409-colorize-remote-messages.sh',
't5410-receive-pack-alternates.sh',
't5410-receive-pack.sh',
't5411-proc-receive-hook.sh',
't5500-fetch-pack.sh',
't5501-fetch-push-alternates.sh',
Expand Down
3 changes: 0 additions & 3 deletions t/perf/p5313-pack-objects.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
test_description='Tests pack performance using bitmaps'
. ./perf-lib.sh

GIT_TEST_PASSING_SANITIZE_LEAK=0
export GIT_TEST_PASSING_SANITIZE_LEAK

test_perf_large_repo

test_expect_success 'create rev input' '
Expand Down
3 changes: 0 additions & 3 deletions t/perf/p5314-name-hash.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
test_description='Tests pack performance using bitmaps'
. ./perf-lib.sh

GIT_TEST_PASSING_SANITIZE_LEAK=0
export GIT_TEST_PASSING_SANITIZE_LEAK

test_perf_large_repo

test_size 'paths at head' '
Expand Down
44 changes: 0 additions & 44 deletions t/t5410-receive-pack-alternates.sh

This file was deleted.

87 changes: 87 additions & 0 deletions t/t5410-receive-pack.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#!/bin/sh

test_description='git receive-pack'

GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME

. ./test-lib.sh

test_expect_success 'setup' '
test_commit base &&
git clone -s --bare . fork &&
git checkout -b public/branch main &&
test_commit public &&
git checkout -b private/branch main &&
test_commit private
'

extract_haves () {
depacketize | sed -n 's/^\([^ ][^ ]*\) \.have/\1/p'
}

test_expect_success 'with core.alternateRefsCommand' '
write_script fork/alternate-refs <<-\EOF &&
git --git-dir="$1" for-each-ref \
--format="%(objectname)" \
refs/heads/public/
EOF
test_config -C fork core.alternateRefsCommand ./alternate-refs &&
git rev-parse public/branch >expect &&
printf "0000" | git receive-pack fork >actual &&
extract_haves <actual >actual.haves &&
test_cmp expect actual.haves
'

test_expect_success 'with core.alternateRefsPrefixes' '
test_config -C fork core.alternateRefsPrefixes "refs/heads/private" &&
git rev-parse private/branch >expect &&
printf "0000" | git receive-pack fork >actual &&
extract_haves <actual >actual.haves &&
test_cmp expect actual.haves
'

test_expect_success 'receive-pack missing objects fails connectivity check' '
test_when_finished rm -rf repo remote.git setup.git &&

git init repo &&
git -C repo commit --allow-empty -m 1 &&
git clone --bare repo setup.git &&
git -C repo commit --allow-empty -m 2 &&

# Capture git-send-pack(1) output sent to git-receive-pack(1).
git -C repo send-pack ../setup.git --all \
--receive-pack="tee ${SQ}$(pwd)/out${SQ} | git-receive-pack" &&

# Replay captured git-send-pack(1) output on new empty repository.
git init --bare remote.git &&
git receive-pack remote.git <out >actual 2>err &&

test_grep "missing necessary objects" actual &&
test_grep "fatal: Failed to traverse parents" err &&
test_must_fail git -C remote.git cat-file -e $(git -C repo rev-parse HEAD)
'

test_expect_success 'receive-pack missing objects bypasses connectivity check' '
test_when_finished rm -rf repo remote.git setup.git &&

git init repo &&
git -C repo commit --allow-empty -m 1 &&
git clone --bare repo setup.git &&
git -C repo commit --allow-empty -m 2 &&

# Capture git-send-pack(1) output sent to git-receive-pack(1).
git -C repo send-pack ../setup.git --all \
--receive-pack="tee ${SQ}$(pwd)/out${SQ} | git-receive-pack" &&

# Replay captured git-send-pack(1) output on new empty repository.
git init --bare remote.git &&
git receive-pack --skip-connectivity-check remote.git <out >actual 2>err &&

test_grep ! "missing necessary objects" actual &&
test_must_be_empty err &&
git -C remote.git cat-file -e $(git -C repo rev-parse HEAD) &&
test_must_fail git -C remote.git rev-list $(git -C repo rev-parse HEAD)
'

test_done
2 changes: 0 additions & 2 deletions t/t6601-path-walk.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
#!/bin/sh

TEST_PASSES_SANITIZE_LEAK=true

test_description='direct path-walk API tests'

. ./test-lib.sh
Expand Down