Merge branch 'ps/environ-wo-the-repository' into next
[alt-git.git] / send-pack.c
blob6677c44e8acd19f16706ad2d78f72fee889daa55
1 #define USE_THE_REPOSITORY_VARIABLE
3 #include "git-compat-util.h"
4 #include "config.h"
5 #include "commit.h"
6 #include "date.h"
7 #include "gettext.h"
8 #include "hex.h"
9 #include "object-store-ll.h"
10 #include "pkt-line.h"
11 #include "sideband.h"
12 #include "run-command.h"
13 #include "remote.h"
14 #include "connect.h"
15 #include "send-pack.h"
16 #include "transport.h"
17 #include "version.h"
18 #include "oid-array.h"
19 #include "gpg-interface.h"
20 #include "shallow.h"
21 #include "parse-options.h"
22 #include "trace2.h"
23 #include "write-or-die.h"
25 int option_parse_push_signed(const struct option *opt,
26 const char *arg, int unset)
28 if (unset) {
29 *(int *)(opt->value) = SEND_PACK_PUSH_CERT_NEVER;
30 return 0;
32 switch (git_parse_maybe_bool(arg)) {
33 case 1:
34 *(int *)(opt->value) = SEND_PACK_PUSH_CERT_ALWAYS;
35 return 0;
36 case 0:
37 *(int *)(opt->value) = SEND_PACK_PUSH_CERT_NEVER;
38 return 0;
40 if (!strcasecmp("if-asked", arg)) {
41 *(int *)(opt->value) = SEND_PACK_PUSH_CERT_IF_ASKED;
42 return 0;
44 die("bad %s argument: %s", opt->long_name, arg);
47 static void feed_object(const struct object_id *oid, FILE *fh, int negative)
49 if (negative &&
50 !repo_has_object_file_with_flags(the_repository, oid,
51 OBJECT_INFO_SKIP_FETCH_OBJECT |
52 OBJECT_INFO_QUICK))
53 return;
55 if (negative)
56 putc('^', fh);
57 fputs(oid_to_hex(oid), fh);
58 putc('\n', fh);
62 * Make a pack stream and spit it out into file descriptor fd
64 static int pack_objects(int fd, struct ref *refs, struct oid_array *advertised,
65 struct oid_array *negotiated,
66 struct send_pack_args *args)
69 * The child becomes pack-objects --revs; we feed
70 * the revision parameters to it via its stdin and
71 * let its stdout go back to the other end.
73 struct child_process po = CHILD_PROCESS_INIT;
74 FILE *po_in;
75 int i;
76 int rc;
78 trace2_region_enter("send_pack", "pack_objects", the_repository);
79 strvec_push(&po.args, "pack-objects");
80 strvec_push(&po.args, "--all-progress-implied");
81 strvec_push(&po.args, "--revs");
82 strvec_push(&po.args, "--stdout");
83 if (args->use_thin_pack)
84 strvec_push(&po.args, "--thin");
85 if (args->use_ofs_delta)
86 strvec_push(&po.args, "--delta-base-offset");
87 if (args->quiet || !args->progress)
88 strvec_push(&po.args, "-q");
89 if (args->progress)
90 strvec_push(&po.args, "--progress");
91 if (is_repository_shallow(the_repository))
92 strvec_push(&po.args, "--shallow");
93 if (args->disable_bitmaps)
94 strvec_push(&po.args, "--no-use-bitmap-index");
95 po.in = -1;
96 po.out = args->stateless_rpc ? -1 : fd;
97 po.git_cmd = 1;
98 po.clean_on_exit = 1;
99 if (start_command(&po))
100 die_errno("git pack-objects failed");
103 * We feed the pack-objects we just spawned with revision
104 * parameters by writing to the pipe.
106 po_in = xfdopen(po.in, "w");
107 for (i = 0; i < advertised->nr; i++)
108 feed_object(&advertised->oid[i], po_in, 1);
109 for (i = 0; i < negotiated->nr; i++)
110 feed_object(&negotiated->oid[i], po_in, 1);
112 while (refs) {
113 if (!is_null_oid(&refs->old_oid))
114 feed_object(&refs->old_oid, po_in, 1);
115 if (!is_null_oid(&refs->new_oid))
116 feed_object(&refs->new_oid, po_in, 0);
117 refs = refs->next;
120 fflush(po_in);
121 if (ferror(po_in))
122 die_errno("error writing to pack-objects");
123 fclose(po_in);
125 if (args->stateless_rpc) {
126 char *buf = xmalloc(LARGE_PACKET_MAX);
127 while (1) {
128 ssize_t n = xread(po.out, buf, LARGE_PACKET_MAX);
129 if (n <= 0)
130 break;
131 send_sideband(fd, -1, buf, n, LARGE_PACKET_MAX);
133 free(buf);
134 close(po.out);
135 po.out = -1;
138 rc = finish_command(&po);
139 if (rc) {
141 * For a normal non-zero exit, we assume pack-objects wrote
142 * something useful to stderr. For death by signal, though,
143 * we should mention it to the user. The exception is SIGPIPE
144 * (141), because that's a normal occurrence if the remote end
145 * hangs up (and we'll report that by trying to read the unpack
146 * status).
148 if (rc > 128 && rc != 141)
149 error("pack-objects died of signal %d", rc - 128);
150 trace2_region_leave("send_pack", "pack_objects", the_repository);
151 return -1;
153 trace2_region_leave("send_pack", "pack_objects", the_repository);
154 return 0;
157 static int receive_unpack_status(struct packet_reader *reader)
159 if (packet_reader_read(reader) != PACKET_READ_NORMAL)
160 return error(_("unexpected flush packet while reading remote unpack status"));
161 if (!skip_prefix(reader->line, "unpack ", &reader->line))
162 return error(_("unable to parse remote unpack status: %s"), reader->line);
163 if (strcmp(reader->line, "ok"))
164 return error(_("remote unpack failed: %s"), reader->line);
165 return 0;
168 static int receive_status(struct packet_reader *reader, struct ref *refs)
170 struct ref *hint;
171 int ret;
172 struct ref_push_report *report = NULL;
173 int new_report = 0;
174 int once = 0;
176 trace2_region_enter("send_pack", "receive_status", the_repository);
177 hint = NULL;
178 ret = receive_unpack_status(reader);
179 while (1) {
180 struct object_id old_oid, new_oid;
181 const char *head;
182 const char *refname;
183 char *p;
184 if (packet_reader_read(reader) != PACKET_READ_NORMAL)
185 break;
186 head = reader->line;
187 p = strchr(head, ' ');
188 if (!p) {
189 error("invalid status line from remote: %s", reader->line);
190 ret = -1;
191 break;
193 *p++ = '\0';
195 if (!strcmp(head, "option")) {
196 const char *key, *val;
198 if (!hint || !(report || new_report)) {
199 if (!once++)
200 error("'option' without a matching 'ok/ng' directive");
201 ret = -1;
202 continue;
204 if (new_report) {
205 if (!hint->report) {
206 CALLOC_ARRAY(hint->report, 1);
207 report = hint->report;
208 } else {
209 report = hint->report;
210 while (report->next)
211 report = report->next;
212 CALLOC_ARRAY(report->next, 1);
213 report = report->next;
215 new_report = 0;
217 key = p;
218 p = strchr(key, ' ');
219 if (p)
220 *p++ = '\0';
221 val = p;
222 if (!strcmp(key, "refname"))
223 report->ref_name = xstrdup_or_null(val);
224 else if (!strcmp(key, "old-oid") && val &&
225 !parse_oid_hex(val, &old_oid, &val))
226 report->old_oid = oiddup(&old_oid);
227 else if (!strcmp(key, "new-oid") && val &&
228 !parse_oid_hex(val, &new_oid, &val))
229 report->new_oid = oiddup(&new_oid);
230 else if (!strcmp(key, "forced-update"))
231 report->forced_update = 1;
232 continue;
235 report = NULL;
236 new_report = 0;
237 if (strcmp(head, "ok") && strcmp(head, "ng")) {
238 error("invalid ref status from remote: %s", head);
239 ret = -1;
240 break;
242 refname = p;
243 p = strchr(refname, ' ');
244 if (p)
245 *p++ = '\0';
246 /* first try searching at our hint, falling back to all refs */
247 if (hint)
248 hint = find_ref_by_name(hint, refname);
249 if (!hint)
250 hint = find_ref_by_name(refs, refname);
251 if (!hint) {
252 warning("remote reported status on unknown ref: %s",
253 refname);
254 continue;
256 if (hint->status != REF_STATUS_EXPECTING_REPORT &&
257 hint->status != REF_STATUS_OK &&
258 hint->status != REF_STATUS_REMOTE_REJECT) {
259 warning("remote reported status on unexpected ref: %s",
260 refname);
261 continue;
263 if (!strcmp(head, "ng")) {
264 hint->status = REF_STATUS_REMOTE_REJECT;
265 if (p)
266 hint->remote_status = xstrdup(p);
267 else
268 hint->remote_status = xstrdup("failed");
269 } else {
270 hint->status = REF_STATUS_OK;
271 hint->remote_status = xstrdup_or_null(p);
272 new_report = 1;
275 trace2_region_leave("send_pack", "receive_status", the_repository);
276 return ret;
279 static int sideband_demux(int in UNUSED, int out, void *data)
281 int *fd = data, ret;
282 if (async_with_fork())
283 close(fd[1]);
284 ret = recv_sideband("send-pack", fd[0], out);
285 close(out);
286 return ret;
289 static int advertise_shallow_grafts_cb(const struct commit_graft *graft, void *cb)
291 struct strbuf *sb = cb;
292 if (graft->nr_parent == -1)
293 packet_buf_write(sb, "shallow %s\n", oid_to_hex(&graft->oid));
294 return 0;
297 static void advertise_shallow_grafts_buf(struct strbuf *sb)
299 if (!is_repository_shallow(the_repository))
300 return;
301 for_each_commit_graft(advertise_shallow_grafts_cb, sb);
304 #define CHECK_REF_NO_PUSH -1
305 #define CHECK_REF_STATUS_REJECTED -2
306 #define CHECK_REF_UPTODATE -3
307 static int check_to_send_update(const struct ref *ref, const struct send_pack_args *args)
309 if (!ref->peer_ref && !args->send_mirror)
310 return CHECK_REF_NO_PUSH;
312 /* Check for statuses set by set_ref_status_for_push() */
313 switch (ref->status) {
314 case REF_STATUS_REJECT_NONFASTFORWARD:
315 case REF_STATUS_REJECT_ALREADY_EXISTS:
316 case REF_STATUS_REJECT_FETCH_FIRST:
317 case REF_STATUS_REJECT_NEEDS_FORCE:
318 case REF_STATUS_REJECT_STALE:
319 case REF_STATUS_REJECT_REMOTE_UPDATED:
320 case REF_STATUS_REJECT_NODELETE:
321 return CHECK_REF_STATUS_REJECTED;
322 case REF_STATUS_UPTODATE:
323 return CHECK_REF_UPTODATE;
325 default:
326 case REF_STATUS_EXPECTING_REPORT:
327 /* already passed checks on the local side */
328 case REF_STATUS_OK:
329 /* of course this is OK */
330 return 0;
335 * the beginning of the next line, or the end of buffer.
337 * NEEDSWORK: perhaps move this to git-compat-util.h or somewhere and
338 * convert many similar uses found by "git grep -A4 memchr".
340 static const char *next_line(const char *line, size_t len)
342 const char *nl = memchr(line, '\n', len);
343 if (!nl)
344 return line + len; /* incomplete line */
345 return nl + 1;
348 static int generate_push_cert(struct strbuf *req_buf,
349 const struct ref *remote_refs,
350 struct send_pack_args *args,
351 const char *cap_string,
352 const char *push_cert_nonce)
354 const struct ref *ref;
355 struct string_list_item *item;
356 char *signing_key_id = get_signing_key_id();
357 char *signing_key = get_signing_key();
358 const char *cp, *np;
359 struct strbuf cert = STRBUF_INIT;
360 int update_seen = 0;
362 strbuf_addstr(&cert, "certificate version 0.1\n");
363 strbuf_addf(&cert, "pusher %s ", signing_key_id);
364 datestamp(&cert);
365 strbuf_addch(&cert, '\n');
366 if (args->url && *args->url) {
367 char *anon_url = transport_anonymize_url(args->url);
368 strbuf_addf(&cert, "pushee %s\n", anon_url);
369 free(anon_url);
371 if (push_cert_nonce[0])
372 strbuf_addf(&cert, "nonce %s\n", push_cert_nonce);
373 if (args->push_options)
374 for_each_string_list_item(item, args->push_options)
375 strbuf_addf(&cert, "push-option %s\n", item->string);
376 strbuf_addstr(&cert, "\n");
378 for (ref = remote_refs; ref; ref = ref->next) {
379 if (check_to_send_update(ref, args) < 0)
380 continue;
381 update_seen = 1;
382 strbuf_addf(&cert, "%s %s %s\n",
383 oid_to_hex(&ref->old_oid),
384 oid_to_hex(&ref->new_oid),
385 ref->name);
387 if (!update_seen)
388 goto free_return;
390 if (sign_buffer(&cert, &cert, signing_key))
391 die(_("failed to sign the push certificate"));
393 packet_buf_write(req_buf, "push-cert%c%s", 0, cap_string);
394 for (cp = cert.buf; cp < cert.buf + cert.len; cp = np) {
395 np = next_line(cp, cert.buf + cert.len - cp);
396 packet_buf_write(req_buf,
397 "%.*s", (int)(np - cp), cp);
399 packet_buf_write(req_buf, "push-cert-end\n");
401 free_return:
402 free(signing_key_id);
403 free(signing_key);
404 strbuf_release(&cert);
405 return update_seen;
408 #define NONCE_LEN_LIMIT 256
410 static void reject_invalid_nonce(const char *nonce, int len)
412 int i = 0;
414 if (NONCE_LEN_LIMIT <= len)
415 die("the receiving end asked to sign an invalid nonce <%.*s>",
416 len, nonce);
418 for (i = 0; i < len; i++) {
419 int ch = nonce[i] & 0xFF;
420 if (isalnum(ch) ||
421 ch == '-' || ch == '.' ||
422 ch == '/' || ch == '+' ||
423 ch == '=' || ch == '_')
424 continue;
425 die("the receiving end asked to sign an invalid nonce <%.*s>",
426 len, nonce);
430 static void get_commons_through_negotiation(const char *url,
431 const struct ref *remote_refs,
432 struct oid_array *commons)
434 struct child_process child = CHILD_PROCESS_INIT;
435 const struct ref *ref;
436 int len = the_hash_algo->hexsz + 1; /* hash + NL */
437 int nr_negotiation_tip = 0;
439 child.git_cmd = 1;
440 child.no_stdin = 1;
441 child.out = -1;
442 strvec_pushl(&child.args, "fetch", "--negotiate-only", NULL);
443 for (ref = remote_refs; ref; ref = ref->next) {
444 if (!is_null_oid(&ref->new_oid)) {
445 strvec_pushf(&child.args, "--negotiation-tip=%s",
446 oid_to_hex(&ref->new_oid));
447 nr_negotiation_tip++;
450 strvec_push(&child.args, url);
452 if (!nr_negotiation_tip) {
453 child_process_clear(&child);
454 return;
457 if (start_command(&child))
458 die(_("send-pack: unable to fork off fetch subprocess"));
460 do {
461 char hex_hash[GIT_MAX_HEXSZ + 1];
462 int read_len = read_in_full(child.out, hex_hash, len);
463 struct object_id oid;
464 const char *end;
466 if (!read_len)
467 break;
468 if (read_len != len)
469 die("invalid length read %d", read_len);
470 if (parse_oid_hex(hex_hash, &oid, &end) || *end != '\n')
471 die("invalid hash");
472 oid_array_append(commons, &oid);
473 } while (1);
475 if (finish_command(&child)) {
477 * The information that push negotiation provides is useful but
478 * not mandatory.
480 warning(_("push negotiation failed; proceeding anyway with push"));
484 int send_pack(struct send_pack_args *args,
485 int fd[], struct child_process *conn,
486 struct ref *remote_refs,
487 struct oid_array *extra_have)
489 struct oid_array commons = OID_ARRAY_INIT;
490 int in = fd[0];
491 int out = fd[1];
492 struct strbuf req_buf = STRBUF_INIT;
493 struct strbuf cap_buf = STRBUF_INIT;
494 struct ref *ref;
495 int need_pack_data = 0;
496 int allow_deleting_refs = 0;
497 int status_report = 0;
498 int use_sideband = 0;
499 int quiet_supported = 0;
500 int agent_supported = 0;
501 int advertise_sid = 0;
502 int push_negotiate = 0;
503 int use_atomic = 0;
504 int atomic_supported = 0;
505 int use_push_options = 0;
506 int push_options_supported = 0;
507 int object_format_supported = 0;
508 unsigned cmds_sent = 0;
509 int ret;
510 struct async demux;
511 char *push_cert_nonce = NULL;
512 struct packet_reader reader;
513 int use_bitmaps;
515 if (!remote_refs) {
516 fprintf(stderr, "No refs in common and none specified; doing nothing.\n"
517 "Perhaps you should specify a branch.\n");
518 ret = 0;
519 goto out;
522 git_config_get_bool("push.negotiate", &push_negotiate);
523 if (push_negotiate) {
524 trace2_region_enter("send_pack", "push_negotiate", the_repository);
525 get_commons_through_negotiation(args->url, remote_refs, &commons);
526 trace2_region_leave("send_pack", "push_negotiate", the_repository);
529 if (!git_config_get_bool("push.usebitmaps", &use_bitmaps))
530 args->disable_bitmaps = !use_bitmaps;
532 git_config_get_bool("transfer.advertisesid", &advertise_sid);
534 /* Does the other end support the reporting? */
535 if (server_supports("report-status-v2"))
536 status_report = 2;
537 else if (server_supports("report-status"))
538 status_report = 1;
539 if (server_supports("delete-refs"))
540 allow_deleting_refs = 1;
541 if (server_supports("ofs-delta"))
542 args->use_ofs_delta = 1;
543 if (server_supports("side-band-64k"))
544 use_sideband = 1;
545 if (server_supports("quiet"))
546 quiet_supported = 1;
547 if (server_supports("agent"))
548 agent_supported = 1;
549 if (!server_supports("session-id"))
550 advertise_sid = 0;
551 if (server_supports("no-thin"))
552 args->use_thin_pack = 0;
553 if (server_supports("atomic"))
554 atomic_supported = 1;
555 if (server_supports("push-options"))
556 push_options_supported = 1;
558 if (!server_supports_hash(the_hash_algo->name, &object_format_supported))
559 die(_("the receiving end does not support this repository's hash algorithm"));
561 if (args->push_cert != SEND_PACK_PUSH_CERT_NEVER) {
562 size_t len;
563 const char *nonce = server_feature_value("push-cert", &len);
565 if (nonce) {
566 reject_invalid_nonce(nonce, len);
567 push_cert_nonce = xmemdupz(nonce, len);
568 } else if (args->push_cert == SEND_PACK_PUSH_CERT_ALWAYS) {
569 die(_("the receiving end does not support --signed push"));
570 } else if (args->push_cert == SEND_PACK_PUSH_CERT_IF_ASKED) {
571 warning(_("not sending a push certificate since the"
572 " receiving end does not support --signed"
573 " push"));
577 if (args->atomic && !atomic_supported)
578 die(_("the receiving end does not support --atomic push"));
580 use_atomic = atomic_supported && args->atomic;
582 if (args->push_options && !push_options_supported)
583 die(_("the receiving end does not support push options"));
585 use_push_options = push_options_supported && args->push_options;
587 if (status_report == 1)
588 strbuf_addstr(&cap_buf, " report-status");
589 else if (status_report == 2)
590 strbuf_addstr(&cap_buf, " report-status-v2");
591 if (use_sideband)
592 strbuf_addstr(&cap_buf, " side-band-64k");
593 if (quiet_supported && (args->quiet || !args->progress))
594 strbuf_addstr(&cap_buf, " quiet");
595 if (use_atomic)
596 strbuf_addstr(&cap_buf, " atomic");
597 if (use_push_options)
598 strbuf_addstr(&cap_buf, " push-options");
599 if (object_format_supported)
600 strbuf_addf(&cap_buf, " object-format=%s", the_hash_algo->name);
601 if (agent_supported)
602 strbuf_addf(&cap_buf, " agent=%s", git_user_agent_sanitized());
603 if (advertise_sid)
604 strbuf_addf(&cap_buf, " session-id=%s", trace2_session_id());
607 * NEEDSWORK: why does delete-refs have to be so specific to
608 * send-pack machinery that set_ref_status_for_push() cannot
609 * set this bit for us???
611 for (ref = remote_refs; ref; ref = ref->next)
612 if (ref->deletion && !allow_deleting_refs)
613 ref->status = REF_STATUS_REJECT_NODELETE;
616 * Clear the status for each ref and see if we need to send
617 * the pack data.
619 for (ref = remote_refs; ref; ref = ref->next) {
620 switch (check_to_send_update(ref, args)) {
621 case 0: /* no error */
622 break;
623 case CHECK_REF_STATUS_REJECTED:
625 * When we know the server would reject a ref update if
626 * we were to send it and we're trying to send the refs
627 * atomically, abort the whole operation.
629 if (use_atomic) {
630 reject_atomic_push(remote_refs, args->send_mirror);
631 error("atomic push failed for ref %s. status: %d",
632 ref->name, ref->status);
633 ret = args->porcelain ? 0 : -1;
634 goto out;
636 /* else fallthrough */
637 default:
638 continue;
640 if (!ref->deletion)
641 need_pack_data = 1;
643 if (args->dry_run || !status_report)
644 ref->status = REF_STATUS_OK;
645 else
646 ref->status = REF_STATUS_EXPECTING_REPORT;
649 if (!args->dry_run)
650 advertise_shallow_grafts_buf(&req_buf);
653 * Finally, tell the other end!
655 if (!args->dry_run && push_cert_nonce) {
656 cmds_sent = generate_push_cert(&req_buf, remote_refs, args,
657 cap_buf.buf, push_cert_nonce);
658 trace2_printf("Generated push certificate");
659 } else if (!args->dry_run) {
660 for (ref = remote_refs; ref; ref = ref->next) {
661 char *old_hex, *new_hex;
663 if (check_to_send_update(ref, args) < 0)
664 continue;
666 old_hex = oid_to_hex(&ref->old_oid);
667 new_hex = oid_to_hex(&ref->new_oid);
668 if (!cmds_sent) {
669 packet_buf_write(&req_buf,
670 "%s %s %s%c%s",
671 old_hex, new_hex, ref->name, 0,
672 cap_buf.buf);
673 cmds_sent = 1;
674 } else {
675 packet_buf_write(&req_buf, "%s %s %s",
676 old_hex, new_hex, ref->name);
681 if (use_push_options) {
682 struct string_list_item *item;
684 packet_buf_flush(&req_buf);
685 for_each_string_list_item(item, args->push_options)
686 packet_buf_write(&req_buf, "%s", item->string);
689 if (args->stateless_rpc) {
690 if (!args->dry_run && (cmds_sent || is_repository_shallow(the_repository))) {
691 packet_buf_flush(&req_buf);
692 send_sideband(out, -1, req_buf.buf, req_buf.len, LARGE_PACKET_MAX);
694 } else {
695 write_or_die(out, req_buf.buf, req_buf.len);
696 packet_flush(out);
699 if (use_sideband && cmds_sent) {
700 memset(&demux, 0, sizeof(demux));
701 demux.proc = sideband_demux;
702 demux.data = fd;
703 demux.out = -1;
704 demux.isolate_sigpipe = 1;
705 if (start_async(&demux))
706 die("send-pack: unable to fork off sideband demultiplexer");
707 in = demux.out;
710 packet_reader_init(&reader, in, NULL, 0,
711 PACKET_READ_CHOMP_NEWLINE |
712 PACKET_READ_DIE_ON_ERR_PACKET);
714 if (need_pack_data && cmds_sent) {
715 if (pack_objects(out, remote_refs, extra_have, &commons, args) < 0) {
716 if (args->stateless_rpc)
717 close(out);
718 if (git_connection_is_socket(conn))
719 shutdown(fd[0], SHUT_WR);
722 * Do not even bother with the return value; we know we
723 * are failing, and just want the error() side effects,
724 * as well as marking refs with their remote status (if
725 * we get one).
727 if (status_report)
728 receive_status(&reader, remote_refs);
730 if (use_sideband) {
731 close(demux.out);
732 finish_async(&demux);
734 fd[1] = -1;
736 ret = -1;
737 goto out;
739 if (!args->stateless_rpc)
740 /* Closed by pack_objects() via start_command() */
741 fd[1] = -1;
743 if (args->stateless_rpc && cmds_sent)
744 packet_flush(out);
746 if (status_report && cmds_sent)
747 ret = receive_status(&reader, remote_refs);
748 else
749 ret = 0;
750 if (args->stateless_rpc)
751 packet_flush(out);
753 if (use_sideband && cmds_sent) {
754 close(demux.out);
755 if (finish_async(&demux)) {
756 error("error in sideband demultiplexer");
757 ret = -1;
761 if (ret < 0)
762 goto out;
764 if (args->porcelain) {
765 ret = 0;
766 goto out;
769 for (ref = remote_refs; ref; ref = ref->next) {
770 switch (ref->status) {
771 case REF_STATUS_NONE:
772 case REF_STATUS_UPTODATE:
773 case REF_STATUS_OK:
774 break;
775 default:
776 ret = -1;
777 goto out;
781 ret = 0;
783 out:
784 oid_array_clear(&commons);
785 strbuf_release(&req_buf);
786 strbuf_release(&cap_buf);
787 free(push_cert_nonce);
788 return ret;