builtin-bundle.c - use stream buffered input for rev-list
git-bundle create on cygwin was nearly unusable due to 1 character at a time (unbuffered) reading from an exec'ed process. Fix by using fdopen to get a buffered stream. Results for "time git bundle create test.bdl v1.0.3..v1.5.2" are: before this patch: cygwin linux real 1m38.828s 0m3.578s user 0m12.122s 0m2.896s sys 1m28.215s 0m0.692s after this patch: real 0m3.688s 0m2.835s user 0m3.075s 0m2.731s sys 0m1.075s 0m0.149s Signed-off-by: Mark Levedahl <mdl123@verizon.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
c06793a4ed
commit
442b67a559
@ -207,6 +207,7 @@ static int create_bundle(struct bundle_header *header, const char *path,
|
|||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
struct rev_info revs;
|
struct rev_info revs;
|
||||||
struct child_process rls;
|
struct child_process rls;
|
||||||
|
FILE *rls_fout;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NEEDSWORK: this should use something like lock-file
|
* NEEDSWORK: this should use something like lock-file
|
||||||
@ -236,10 +237,11 @@ static int create_bundle(struct bundle_header *header, const char *path,
|
|||||||
rls.git_cmd = 1;
|
rls.git_cmd = 1;
|
||||||
if (start_command(&rls))
|
if (start_command(&rls))
|
||||||
return -1;
|
return -1;
|
||||||
while ((i = read_string(rls.out, buffer, sizeof(buffer))) > 0) {
|
rls_fout = fdopen(rls.out, "r");
|
||||||
|
while (fgets(buffer, sizeof(buffer), rls_fout)) {
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
if (buffer[0] == '-') {
|
if (buffer[0] == '-') {
|
||||||
write_or_die(bundle_fd, buffer, i);
|
write_or_die(bundle_fd, buffer, strlen(buffer));
|
||||||
if (!get_sha1_hex(buffer + 1, sha1)) {
|
if (!get_sha1_hex(buffer + 1, sha1)) {
|
||||||
struct object *object = parse_object(sha1);
|
struct object *object = parse_object(sha1);
|
||||||
object->flags |= UNINTERESTING;
|
object->flags |= UNINTERESTING;
|
||||||
@ -250,6 +252,7 @@ static int create_bundle(struct bundle_header *header, const char *path,
|
|||||||
object->flags |= SHOWN;
|
object->flags |= SHOWN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fclose(rls_fout);
|
||||||
if (finish_command(&rls))
|
if (finish_command(&rls))
|
||||||
return error("rev-list died");
|
return error("rev-list died");
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user