Browse Source

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>
maint
Nicolas Pitre 16 years ago committed by Junio C Hamano
parent
commit
b74fce16fa
  1. 22
      builtin-receive-pack.c
  2. 8
      builtin-send-pack.c
  3. 1
      send-pack.h

22
builtin-receive-pack.c

@ -27,10 +27,9 @@ static int receive_unpack_limit = -1; @@ -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) @@ -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) @@ -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();

8
builtin-send-pack.c

@ -43,12 +43,16 @@ static int pack_objects(int fd, struct ref *refs, struct extra_have_objects *ext @@ -43,12 +43,16 @@ static int pack_objects(int fd, struct ref *refs, struct extra_have_objects *ext
"--stdout",
NULL,
NULL,
NULL,
};
struct child_process po;
int i;

i = 4;
if (args->use_thin_pack)
argv[4] = "--thin";
argv[i++] = "--thin";
if (args->use_ofs_delta)
argv[i++] = "--delta-base-offset";
memset(&po, 0, sizeof(po));
po.argv = argv;
po.in = -1;
@ -315,6 +319,8 @@ int send_pack(struct send_pack_args *args, @@ -315,6 +319,8 @@ int send_pack(struct send_pack_args *args,
ask_for_status_report = 1;
if (server_supports("delete-refs"))
allow_deleting_refs = 1;
if (server_supports("ofs-delta"))
args->use_ofs_delta = 1;

if (!remote_refs) {
fprintf(stderr, "No refs in common and none specified; doing nothing.\n"

1
send-pack.h

@ -6,6 +6,7 @@ struct send_pack_args { @@ -6,6 +6,7 @@ struct send_pack_args {
send_mirror:1,
force_update:1,
use_thin_pack:1,
use_ofs_delta:1,
dry_run:1;
};


Loading…
Cancel
Save