Skip to content

Commit e1e5592

Browse files
t-bGit for Windows Build Agent
authored andcommitted
transport: optionally disable side-band-64k
Since commit 0c499ea (send-pack: demultiplex a sideband stream with status data, 2010-02-05) the send-pack builtin uses the side-band-64k capability if advertised by the server. Unfortunately this breaks pushing over the dump git protocol if used over a network connection. The detailed reasons for this breakage are (by courtesy of Jeff Preshing, quoted from https://groups.google.com/d/msg/msysgit/at8D7J-h7mw/eaLujILGUWoJ): MinGW wraps Windows sockets in CRT file descriptors in order to mimic the functionality of POSIX sockets. This causes msvcrt.dll to treat sockets as Installable File System (IFS) handles, calling ReadFile, WriteFile, DuplicateHandle and CloseHandle on them. This approach works well in simple cases on recent versions of Windows, but does not support all usage patterns. In particular, using this approach, any attempt to read & write concurrently on the same socket (from one or more processes) will deadlock in a scenario where the read waits for a response from the server which is only invoked after the write. This is what send_pack currently attempts to do in the use_sideband codepath. The new config option `sendpack.sideband` allows to override the side-band-64k capability of the server, and thus makes the dumb git protocol work. Other transportation methods like ssh and http/https still benefit from the sideband channel, therefore the default value of `sendpack.sideband` is still true. Signed-off-by: Thomas Braun <thomas.braun@byte-physics.de> Signed-off-by: Oliver Schneider <oliver@assarbad.net> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
1 parent 8831c9b commit e1e5592

3 files changed

Lines changed: 10 additions & 3 deletions

File tree

Documentation/config.adoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,8 @@ include::config/safe.adoc[]
569569

570570
include::config/sendemail.adoc[]
571571

572+
include::config/sendpack.adoc[]
573+
572574
include::config/sequencer.adoc[]
573575

574576
include::config/showbranch.adoc[]

Documentation/config/sendpack.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
sendpack.sideband::
2+
Allows to disable the side-band-64k capability for send-pack even
3+
when it is advertised by the server. Makes it possible to work
4+
around a limitation in the git for windows implementation together
5+
with the dump git protocol. Defaults to true.

send-pack.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ int send_pack(struct repository *r,
502502
int need_pack_data = 0;
503503
int allow_deleting_refs = 0;
504504
int status_report = 0;
505-
int use_sideband = 0;
505+
int use_sideband = 1;
506506
int quiet_supported = 0;
507507
int agent_supported = 0;
508508
int advertise_sid = 0;
@@ -526,6 +526,7 @@ int send_pack(struct repository *r,
526526
goto out;
527527
}
528528

529+
repo_config_get_bool(r, "sendpack.sideband", &use_sideband);
529530
repo_config_get_bool(r, "push.negotiate", &push_negotiate);
530531
if (push_negotiate) {
531532
trace2_region_enter("send_pack", "push_negotiate", r);
@@ -547,8 +548,7 @@ int send_pack(struct repository *r,
547548
allow_deleting_refs = 1;
548549
if (server_supports("ofs-delta"))
549550
args->use_ofs_delta = 1;
550-
if (server_supports("side-band-64k"))
551-
use_sideband = 1;
551+
use_sideband = use_sideband && server_supports("side-band-64k");
552552
if (server_supports("quiet"))
553553
quiet_supported = 1;
554554
if (server_supports("agent"))

0 commit comments

Comments
 (0)