static int process_haves_and_send_acks(struct upload_pack_data *data) { struct oid_array common = OID_ARRAY_INIT; struct strbuf response = STRBUF_INIT; int ret = 0; process_haves(&data->haves, &common); if (data->done) { ret = 1; } else if (send_acks(&common, &response)) { packet_buf_delim(&response); ret = 1; } else { /* Add Flush */ packet_buf_flush(&response); ret = 0; } /* Send response */ write_or_die(1, response.buf, response.len); strbuf_release(&response); oid_array_clear(&data->haves); oid_array_clear(&common); return ret; }
/* * CURLOPT_READFUNCTION callback function. * Attempts to copy over a single packet-line at a time into the * curl provided buffer. */ static size_t proxy_in(char *buffer, size_t eltsize, size_t nmemb, void *userdata) { size_t max; struct proxy_state *p = userdata; size_t avail = p->request_buffer.len - p->pos; if (eltsize != 1) BUG("curl read callback called with size = %"PRIuMAX" != 1", (uintmax_t)eltsize); max = nmemb; if (!avail) { if (p->seen_flush) { p->seen_flush = 0; return 0; } strbuf_reset(&p->request_buffer); switch (packet_reader_read(&p->reader)) { case PACKET_READ_EOF: die("unexpected EOF when reading from parent process"); case PACKET_READ_NORMAL: packet_buf_write_len(&p->request_buffer, p->reader.line, p->reader.pktlen); break; case PACKET_READ_DELIM: packet_buf_delim(&p->request_buffer); break; case PACKET_READ_FLUSH: packet_buf_flush(&p->request_buffer); p->seen_flush = 1; break; } p->pos = 0; avail = p->request_buffer.len; } if (max < avail) avail = max; memcpy(buffer, p->request_buffer.buf + p->pos, avail); p->pos += avail; return avail; }
static int send_fetch_request(int fd_out, const struct fetch_pack_args *args, const struct ref *wants, struct oidset *common, int *haves_to_send, int *in_vain) { int ret = 0; struct strbuf req_buf = STRBUF_INIT; if (server_supports_v2("fetch", 1)) packet_buf_write(&req_buf, "command=fetch"); if (server_supports_v2("agent", 0)) packet_buf_write(&req_buf, "agent=%s", git_user_agent_sanitized()); packet_buf_delim(&req_buf); if (args->use_thin_pack) packet_buf_write(&req_buf, "thin-pack"); if (args->no_progress) packet_buf_write(&req_buf, "no-progress"); if (args->include_tag) packet_buf_write(&req_buf, "include-tag"); if (prefer_ofs_delta) packet_buf_write(&req_buf, "ofs-delta"); /* Add shallow-info and deepen request */ if (server_supports_feature("fetch", "shallow", 0)) add_shallow_requests(&req_buf, args); else if (is_repository_shallow() || args->deepen) die(_("Server does not support shallow requests")); /* add wants */ add_wants(wants, &req_buf); /* Add all of the common commits we've found in previous rounds */ add_common(&req_buf, common); /* Add initial haves */ ret = add_haves(&req_buf, haves_to_send, in_vain); /* Send request */ packet_buf_flush(&req_buf); write_or_die(fd_out, req_buf.buf, req_buf.len); strbuf_release(&req_buf); return ret; }
static int send_fetch_request(struct fetch_negotiator *negotiator, int fd_out, const struct fetch_pack_args *args, const struct ref *wants, struct oidset *common, int *haves_to_send, int *in_vain) { int ret = 0; struct strbuf req_buf = STRBUF_INIT; if (server_supports_v2("fetch", 1)) packet_buf_write(&req_buf, "command=fetch"); if (server_supports_v2("agent", 0)) packet_buf_write(&req_buf, "agent=%s", git_user_agent_sanitized()); if (args->server_options && args->server_options->nr && server_supports_v2("server-option", 1)) { int i; for (i = 0; i < args->server_options->nr; i++) packet_write_fmt(fd_out, "server-option=%s", args->server_options->items[i].string); } packet_buf_delim(&req_buf); if (args->use_thin_pack) packet_buf_write(&req_buf, "thin-pack"); if (args->no_progress) packet_buf_write(&req_buf, "no-progress"); if (args->include_tag) packet_buf_write(&req_buf, "include-tag"); if (prefer_ofs_delta) packet_buf_write(&req_buf, "ofs-delta"); /* Add shallow-info and deepen request */ if (server_supports_feature("fetch", "shallow", 0)) add_shallow_requests(&req_buf, args); else if (is_repository_shallow(the_repository) || args->deepen) die(_("Server does not support shallow requests")); /* Add filter */ if (server_supports_feature("fetch", "filter", 0) && args->filter_options.choice) { print_verbose(args, _("Server supports filter")); packet_buf_write(&req_buf, "filter %s", args->filter_options.filter_spec); } else if (args->filter_options.choice) { warning("filtering not recognized by server, ignoring"); } /* add wants */ add_wants(args->no_dependents, wants, &req_buf); if (args->no_dependents) { packet_buf_write(&req_buf, "done"); ret = 1; } else { /* Add all of the common commits we've found in previous rounds */ add_common(&req_buf, common); /* Add initial haves */ ret = add_haves(negotiator, &req_buf, haves_to_send, in_vain); } /* Send request */ packet_buf_flush(&req_buf); write_or_die(fd_out, req_buf.buf, req_buf.len); strbuf_release(&req_buf); return ret; }