connected: use buffered I/O to talk to rev-list
Like f0bca72dc7
(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>
maint
parent
47ae905ffb
commit
24b75faf0d
21
connected.c
21
connected.c
|
@ -22,14 +22,13 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
|
||||||
struct check_connected_options *opt)
|
struct check_connected_options *opt)
|
||||||
{
|
{
|
||||||
struct child_process rev_list = CHILD_PROCESS_INIT;
|
struct child_process rev_list = CHILD_PROCESS_INIT;
|
||||||
|
FILE *rev_list_in;
|
||||||
struct check_connected_options defaults = CHECK_CONNECTED_INIT;
|
struct check_connected_options defaults = CHECK_CONNECTED_INIT;
|
||||||
char commit[GIT_MAX_HEXSZ + 1];
|
|
||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
struct packed_git *new_pack = NULL;
|
struct packed_git *new_pack = NULL;
|
||||||
struct transport *transport;
|
struct transport *transport;
|
||||||
size_t base_len;
|
size_t base_len;
|
||||||
const unsigned hexsz = the_hash_algo->hexsz;
|
|
||||||
|
|
||||||
if (!opt)
|
if (!opt)
|
||||||
opt = &defaults;
|
opt = &defaults;
|
||||||
|
@ -122,7 +121,8 @@ no_promisor_pack_found:
|
||||||
|
|
||||||
sigchain_push(SIGPIPE, SIG_IGN);
|
sigchain_push(SIGPIPE, SIG_IGN);
|
||||||
|
|
||||||
commit[hexsz] = '\n';
|
rev_list_in = xfdopen(rev_list.in, "w");
|
||||||
|
|
||||||
do {
|
do {
|
||||||
/*
|
/*
|
||||||
* If index-pack already checked that:
|
* 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))
|
if (new_pack && find_pack_entry_one(oid.hash, new_pack))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
memcpy(commit, oid_to_hex(&oid), hexsz);
|
if (fprintf(rev_list_in, "%s\n", oid_to_hex(&oid)) < 0)
|
||||||
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;
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
} while (!fn(cb_data, &oid));
|
} 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"));
|
err = error_errno(_("failed to close rev-list's stdin"));
|
||||||
|
|
||||||
sigchain_pop(SIGPIPE);
|
sigchain_pop(SIGPIPE);
|
||||||
|
|
Loading…
Reference in New Issue