diff options
author | Mark Levedahl <mdl123@verizon.net> | 2007-08-11 02:29:49 +0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-08-11 09:20:35 +0400 |
commit | 442b67a55972e69a054eb1206bbbdf044532130a (patch) | |
tree | 67280643f9f8be2cb1fe1cbc7412144699e21ee4 | |
parent | c06793a4ed1bf81902c324d1ed88dd055c3aa468 (diff) |
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>
-rw-r--r-- | builtin-bundle.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/builtin-bundle.c b/builtin-bundle.c index 2d0e106c08..b954213f70 100644 --- a/builtin-bundle.c +++ b/builtin-bundle.c @@ -207,6 +207,7 @@ static int create_bundle(struct bundle_header *header, const char *path, char buffer[1024]; struct rev_info revs; struct child_process rls; + FILE *rls_fout; /* * 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; if (start_command(&rls)) 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]; 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)) { struct object *object = parse_object(sha1); object->flags |= UNINTERESTING; @@ -250,6 +252,7 @@ static int create_bundle(struct bundle_header *header, const char *path, object->flags |= SHOWN; } } + fclose(rls_fout); if (finish_command(&rls)) return error("rev-list died"); |