diff options
author | Nicolas Pitre <nico@cam.org> | 2009-05-01 16:56:47 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-05-01 22:06:41 -0700 |
commit | b74fce16fa51362d4a3875d46e488006c3ad5371 (patch) | |
tree | 4dd3e790760b531d064628f54793b2bda581a7b6 /builtin-receive-pack.c | |
parent | 75b44066f3ed7cde238cdea1f0bf9e2f1744c820 (diff) | |
download | git-b74fce16fa51362d4a3875d46e488006c3ad5371.tar.gz |
allow OFS_DELTA objects during a push
The fetching of OFS_DELTA objects has been negotiated between both peers
since git version 1.4.4. However, this was missing from the push side
where every OFS_DELTA objects were always converted to REF_DELTA objects
causing an increase in transferred data.
To fix this, both the client and the server processes have to be
modified: the former to invoke pack-objects with --delta-base-offset
when the server provides the ofs-delta capability, and the later to send
that capability when OFS_DELTA objects are allowed as already indicated
by the repack.usedeltabaseoffset config variable which is TRUE by
default since git v1.6.0.
Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin-receive-pack.c')
-rw-r--r-- | builtin-receive-pack.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/builtin-receive-pack.c b/builtin-receive-pack.c index a970b39505..4b9d9218d1 100644 --- a/builtin-receive-pack.c +++ b/builtin-receive-pack.c @@ -27,10 +27,9 @@ static int receive_unpack_limit = -1; static int transfer_unpack_limit = -1; static int unpack_limit = 100; static int report_status; +static int prefer_ofs_delta = 1; static const char *head_name; - -static char capabilities[] = " report-status delete-refs "; -static int capabilities_sent; +static char *capabilities_to_send; static enum deny_action parse_deny_action(const char *var, const char *value) { @@ -84,24 +83,29 @@ static int receive_pack_config(const char *var, const char *value, void *cb) return 0; } + if (strcmp(var, "repack.usedeltabaseoffset") == 0) { + prefer_ofs_delta = git_config_bool(var, value); + return 0; + } + return git_default_config(var, value, cb); } static int show_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data) { - if (capabilities_sent) + if (!capabilities_to_send) packet_write(1, "%s %s\n", sha1_to_hex(sha1), path); else packet_write(1, "%s %s%c%s\n", - sha1_to_hex(sha1), path, 0, capabilities); - capabilities_sent = 1; + sha1_to_hex(sha1), path, 0, capabilities_to_send); + capabilities_to_send = NULL; return 0; } static void write_head_info(void) { for_each_ref(show_ref, NULL); - if (!capabilities_sent) + if (capabilities_to_send) show_ref("capabilities^{}", null_sha1, 0, NULL); } @@ -687,6 +691,10 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix) else if (0 <= receive_unpack_limit) unpack_limit = receive_unpack_limit; + capabilities_to_send = (prefer_ofs_delta) ? + " report-status delete-refs ofs-delta " : + " report-status delete-refs "; + add_alternate_refs(); write_head_info(); clear_extra_refs(); |