summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRené Scharfe <l.s.r@web.de>2020-08-12 16:52:49 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-08-17 17:29:39 (GMT)
commit24b75faf0da7a025a192ab4c65cb1f1d6dc6b7f6 (patch)
tree37546d347e816f108ff39a2e1bd74eea0f271d37
parent47ae905ffb98cc4d4fd90083da6bc8dab55d9ecc (diff)
downloadgit-24b75faf0da7a025a192ab4c65cb1f1d6dc6b7f6.zip
git-24b75faf0da7a025a192ab4c65cb1f1d6dc6b7f6.tar.gz
git-24b75faf0da7a025a192ab4c65cb1f1d6dc6b7f6.tar.bz2
connected: use buffered I/O to talk to rev-list
Like f0bca72dc77 (send-pack: use buffered I/O to talk to pack-objects, 2016-06-08), significantly reduce the number of system calls and simplify the code for sending object IDs to rev-list by using stdio's buffering. Take care to handle errors immediately to get the correct error code, and to flush the buffer explicitly before closing the stream in order to catch any write errors for these last bytes. Helped-by: Chris Torek <chris.torek@gmail.com> Helped-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--connected.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/connected.c b/connected.c
index 937b4ba..eb782f3 100644
--- a/connected.c
+++ b/connected.c
@@ -22,14 +22,13 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
struct check_connected_options *opt)
{
struct child_process rev_list = CHILD_PROCESS_INIT;
+ FILE *rev_list_in;
struct check_connected_options defaults = CHECK_CONNECTED_INIT;
- char commit[GIT_MAX_HEXSZ + 1];
struct object_id oid;
int err = 0;
struct packed_git *new_pack = NULL;
struct transport *transport;
size_t base_len;
- const unsigned hexsz = the_hash_algo->hexsz;
if (!opt)
opt = &defaults;
@@ -122,7 +121,8 @@ no_promisor_pack_found:
sigchain_push(SIGPIPE, SIG_IGN);
- commit[hexsz] = '\n';
+ rev_list_in = xfdopen(rev_list.in, "w");
+
do {
/*
* If index-pack already checked that:
@@ -135,16 +135,17 @@ no_promisor_pack_found:
if (new_pack && find_pack_entry_one(oid.hash, new_pack))
continue;
- memcpy(commit, oid_to_hex(&oid), hexsz);
- if (write_in_full(rev_list.in, commit, hexsz + 1) < 0) {
- if (errno != EPIPE && errno != EINVAL)
- error_errno(_("failed write to rev-list"));
- err = -1;
+ if (fprintf(rev_list_in, "%s\n", oid_to_hex(&oid)) < 0)
break;
- }
} while (!fn(cb_data, &oid));
- if (close(rev_list.in))
+ if (ferror(rev_list_in) || fflush(rev_list_in)) {
+ if (errno != EPIPE && errno != EINVAL)
+ error_errno(_("failed write to rev-list"));
+ err = -1;
+ }
+
+ if (fclose(rev_list_in))
err = error_errno(_("failed to close rev-list's stdin"));
sigchain_pop(SIGPIPE);