1#include "builtin.h"
2#include "refs.h"
3#include "pkt-line.h"
4#include "commit.h"
5#include "tag.h"
6#include "exec_cmd.h"
7#include "pack.h"
8#include "sideband.h"
9#include "fetch-pack.h"
10#include "remote.h"
11#include "run-command.h"
12#include "transport.h"
13
14static int transfer_unpack_limit = -1;
15static int fetch_unpack_limit = -1;
16static int unpack_limit = 100;
17static int prefer_ofs_delta = 1;
18static int no_done;
19static int fetch_fsck_objects = -1;
20static int transfer_fsck_objects = -1;
21static struct fetch_pack_args args = {
22 /* .uploadpack = */ "git-upload-pack",
23};
24
25static const char fetch_pack_usage[] =
26"git fetch-pack [--all] [--stdin] [--quiet|-q] [--keep|-k] [--thin] "
27"[--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] "
28"[--no-progress] [-v] [<host>:]<directory> [<refs>...]";
29
30#define COMPLETE (1U << 0)
31#define COMMON (1U << 1)
32#define COMMON_REF (1U << 2)
33#define SEEN (1U << 3)
34#define POPPED (1U << 4)
35
36static int marked;
37
38/*
39 * After sending this many "have"s if we do not get any new ACK , we
40 * give up traversing our history.
41 */
42#define MAX_IN_VAIN 256
43
44static struct commit_list *rev_list;
45static int non_common_revs, multi_ack, use_sideband;
46
47static void rev_list_push(struct commit *commit, int mark)
48{
49 if (!(commit->object.flags & mark)) {
50 commit->object.flags |= mark;
51
52 if (!(commit->object.parsed))
53 if (parse_commit(commit))
54 return;
55
56 commit_list_insert_by_date(commit, &rev_list);
57
58 if (!(commit->object.flags & COMMON))
59 non_common_revs++;
60 }
61}
62
63static int rev_list_insert_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
64{
65 struct object *o = deref_tag(parse_object(sha1), refname, 0);
66
67 if (o && o->type == OBJ_COMMIT)
68 rev_list_push((struct commit *)o, SEEN);
69
70 return 0;
71}
72
73static int clear_marks(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
74{
75 struct object *o = deref_tag(parse_object(sha1), refname, 0);
76
77 if (o && o->type == OBJ_COMMIT)
78 clear_commit_marks((struct commit *)o,
79 COMMON | COMMON_REF | SEEN | POPPED);
80 return 0;
81}
82
83/*
84 This function marks a rev and its ancestors as common.
85 In some cases, it is desirable to mark only the ancestors (for example
86 when only the server does not yet know that they are common).
87*/
88
89static void mark_common(struct commit *commit,
90 int ancestors_only, int dont_parse)
91{
92 if (commit != NULL && !(commit->object.flags & COMMON)) {
93 struct object *o = (struct object *)commit;
94
95 if (!ancestors_only)
96 o->flags |= COMMON;
97
98 if (!(o->flags & SEEN))
99 rev_list_push(commit, SEEN);
100 else {
101 struct commit_list *parents;
102
103 if (!ancestors_only && !(o->flags & POPPED))
104 non_common_revs--;
105 if (!o->parsed && !dont_parse)
106 if (parse_commit(commit))
107 return;
108
109 for (parents = commit->parents;
110 parents;
111 parents = parents->next)
112 mark_common(parents->item, 0, dont_parse);
113 }
114 }
115}
116
117/*
118 Get the next rev to send, ignoring the common.
119*/
120
121static const unsigned char *get_rev(void)
122{
123 struct commit *commit = NULL;
124
125 while (commit == NULL) {
126 unsigned int mark;
127 struct commit_list *parents;
128
129 if (rev_list == NULL || non_common_revs == 0)
130 return NULL;
131
132 commit = rev_list->item;
133 if (!commit->object.parsed)
134 parse_commit(commit);
135 parents = commit->parents;
136
137 commit->object.flags |= POPPED;
138 if (!(commit->object.flags & COMMON))
139 non_common_revs--;
140
141 if (commit->object.flags & COMMON) {
142 /* do not send "have", and ignore ancestors */
143 commit = NULL;
144 mark = COMMON | SEEN;
145 } else if (commit->object.flags & COMMON_REF)
146 /* send "have", and ignore ancestors */
147 mark = COMMON | SEEN;
148 else
149 /* send "have", also for its ancestors */
150 mark = SEEN;
151
152 while (parents) {
153 if (!(parents->item->object.flags & SEEN))
154 rev_list_push(parents->item, mark);
155 if (mark & COMMON)
156 mark_common(parents->item, 1, 0);
157 parents = parents->next;
158 }
159
160 rev_list = rev_list->next;
161 }
162
163 return commit->object.sha1;
164}
165
166enum ack_type {
167 NAK = 0,
168 ACK,
169 ACK_continue,
170 ACK_common,
171 ACK_ready
172};
173
174static void consume_shallow_list(int fd)
175{
176 if (args.stateless_rpc && args.depth > 0) {
177 /* If we sent a depth we will get back "duplicate"
178 * shallow and unshallow commands every time there
179 * is a block of have lines exchanged.
180 */
181 char line[1000];
182 while (packet_read_line(fd, line, sizeof(line))) {
183 if (!prefixcmp(line, "shallow "))
184 continue;
185 if (!prefixcmp(line, "unshallow "))
186 continue;
187 die("git fetch-pack: expected shallow list");
188 }
189 }
190}
191
192struct write_shallow_data {
193 struct strbuf *out;
194 int use_pack_protocol;
195 int count;
196};
197
198static int write_one_shallow(const struct commit_graft *graft, void *cb_data)
199{
200 struct write_shallow_data *data = cb_data;
201 const char *hex = sha1_to_hex(graft->sha1);
202 data->count++;
203 if (data->use_pack_protocol)
204 packet_buf_write(data->out, "shallow %s", hex);
205 else {
206 strbuf_addstr(data->out, hex);
207 strbuf_addch(data->out, '\n');
208 }
209 return 0;
210}
211
212static int write_shallow_commits(struct strbuf *out, int use_pack_protocol)
213{
214 struct write_shallow_data data;
215 data.out = out;
216 data.use_pack_protocol = use_pack_protocol;
217 data.count = 0;
218 for_each_commit_graft(write_one_shallow, &data);
219 return data.count;
220}
221
222static enum ack_type get_ack(int fd, unsigned char *result_sha1)
223{
224 static char line[1000];
225 int len = packet_read_line(fd, line, sizeof(line));
226
227 if (!len)
228 die("git fetch-pack: expected ACK/NAK, got EOF");
229 if (line[len-1] == '\n')
230 line[--len] = 0;
231 if (!strcmp(line, "NAK"))
232 return NAK;
233 if (!prefixcmp(line, "ACK ")) {
234 if (!get_sha1_hex(line+4, result_sha1)) {
235 if (strstr(line+45, "continue"))
236 return ACK_continue;
237 if (strstr(line+45, "common"))
238 return ACK_common;
239 if (strstr(line+45, "ready"))
240 return ACK_ready;
241 return ACK;
242 }
243 }
244 die("git fetch_pack: expected ACK/NAK, got '%s'", line);
245}
246
247static void send_request(int fd, struct strbuf *buf)
248{
249 if (args.stateless_rpc) {
250 send_sideband(fd, -1, buf->buf, buf->len, LARGE_PACKET_MAX);
251 packet_flush(fd);
252 } else
253 safe_write(fd, buf->buf, buf->len);
254}
255
256static void insert_one_alternate_ref(const struct ref *ref, void *unused)
257{
258 rev_list_insert_ref(NULL, ref->old_sha1, 0, NULL);
259}
260
261#define INITIAL_FLUSH 16
262#define PIPESAFE_FLUSH 32
263#define LARGE_FLUSH 1024
264
265static int next_flush(int count)
266{
267 int flush_limit = args.stateless_rpc ? LARGE_FLUSH : PIPESAFE_FLUSH;
268
269 if (count < flush_limit)
270 count <<= 1;
271 else
272 count += flush_limit;
273 return count;
274}
275
276static int find_common(int fd[2], unsigned char *result_sha1,
277 struct ref *refs)
278{
279 int fetching;
280 int count = 0, flushes = 0, flush_at = INITIAL_FLUSH, retval;
281 const unsigned char *sha1;
282 unsigned in_vain = 0;
283 int got_continue = 0;
284 int got_ready = 0;
285 struct strbuf req_buf = STRBUF_INIT;
286 size_t state_len = 0;
287
288 if (args.stateless_rpc && multi_ack == 1)
289 die("--stateless-rpc requires multi_ack_detailed");
290 if (marked)
291 for_each_ref(clear_marks, NULL);
292 marked = 1;
293
294 for_each_ref(rev_list_insert_ref, NULL);
295 for_each_alternate_ref(insert_one_alternate_ref, NULL);
296
297 fetching = 0;
298 for ( ; refs ; refs = refs->next) {
299 unsigned char *remote = refs->old_sha1;
300 const char *remote_hex;
301 struct object *o;
302
303 /*
304 * If that object is complete (i.e. it is an ancestor of a
305 * local ref), we tell them we have it but do not have to
306 * tell them about its ancestors, which they already know
307 * about.
308 *
309 * We use lookup_object here because we are only
310 * interested in the case we *know* the object is
311 * reachable and we have already scanned it.
312 */
313 if (((o = lookup_object(remote)) != NULL) &&
314 (o->flags & COMPLETE)) {
315 continue;
316 }
317
318 remote_hex = sha1_to_hex(remote);
319 if (!fetching) {
320 struct strbuf c = STRBUF_INIT;
321 if (multi_ack == 2) strbuf_addstr(&c, " multi_ack_detailed");
322 if (multi_ack == 1) strbuf_addstr(&c, " multi_ack");
323 if (no_done) strbuf_addstr(&c, " no-done");
324 if (use_sideband == 2) strbuf_addstr(&c, " side-band-64k");
325 if (use_sideband == 1) strbuf_addstr(&c, " side-band");
326 if (args.use_thin_pack) strbuf_addstr(&c, " thin-pack");
327 if (args.no_progress) strbuf_addstr(&c, " no-progress");
328 if (args.include_tag) strbuf_addstr(&c, " include-tag");
329 if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta");
330 packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
331 strbuf_release(&c);
332 } else
333 packet_buf_write(&req_buf, "want %s\n", remote_hex);
334 fetching++;
335 }
336
337 if (!fetching) {
338 strbuf_release(&req_buf);
339 packet_flush(fd[1]);
340 return 1;
341 }
342
343 if (is_repository_shallow())
344 write_shallow_commits(&req_buf, 1);
345 if (args.depth > 0)
346 packet_buf_write(&req_buf, "deepen %d", args.depth);
347 packet_buf_flush(&req_buf);
348 state_len = req_buf.len;
349
350 if (args.depth > 0) {
351 char line[1024];
352 unsigned char sha1[20];
353
354 send_request(fd[1], &req_buf);
355 while (packet_read_line(fd[0], line, sizeof(line))) {
356 if (!prefixcmp(line, "shallow ")) {
357 if (get_sha1_hex(line + 8, sha1))
358 die("invalid shallow line: %s", line);
359 register_shallow(sha1);
360 continue;
361 }
362 if (!prefixcmp(line, "unshallow ")) {
363 if (get_sha1_hex(line + 10, sha1))
364 die("invalid unshallow line: %s", line);
365 if (!lookup_object(sha1))
366 die("object not found: %s", line);
367 /* make sure that it is parsed as shallow */
368 if (!parse_object(sha1))
369 die("error in object: %s", line);
370 if (unregister_shallow(sha1))
371 die("no shallow found: %s", line);
372 continue;
373 }
374 die("expected shallow/unshallow, got %s", line);
375 }
376 } else if (!args.stateless_rpc)
377 send_request(fd[1], &req_buf);
378
379 if (!args.stateless_rpc) {
380 /* If we aren't using the stateless-rpc interface
381 * we don't need to retain the headers.
382 */
383 strbuf_setlen(&req_buf, 0);
384 state_len = 0;
385 }
386
387 flushes = 0;
388 retval = -1;
389 while ((sha1 = get_rev())) {
390 packet_buf_write(&req_buf, "have %s\n", sha1_to_hex(sha1));
391 if (args.verbose)
392 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
393 in_vain++;
394 if (flush_at <= ++count) {
395 int ack;
396
397 packet_buf_flush(&req_buf);
398 send_request(fd[1], &req_buf);
399 strbuf_setlen(&req_buf, state_len);
400 flushes++;
401 flush_at = next_flush(count);
402
403 /*
404 * We keep one window "ahead" of the other side, and
405 * will wait for an ACK only on the next one
406 */
407 if (!args.stateless_rpc && count == INITIAL_FLUSH)
408 continue;
409
410 consume_shallow_list(fd[0]);
411 do {
412 ack = get_ack(fd[0], result_sha1);
413 if (args.verbose && ack)
414 fprintf(stderr, "got ack %d %s\n", ack,
415 sha1_to_hex(result_sha1));
416 switch (ack) {
417 case ACK:
418 flushes = 0;
419 multi_ack = 0;
420 retval = 0;
421 goto done;
422 case ACK_common:
423 case ACK_ready:
424 case ACK_continue: {
425 struct commit *commit =
426 lookup_commit(result_sha1);
427 if (!commit)
428 die("invalid commit %s", sha1_to_hex(result_sha1));
429 if (args.stateless_rpc
430 && ack == ACK_common
431 && !(commit->object.flags & COMMON)) {
432 /* We need to replay the have for this object
433 * on the next RPC request so the peer knows
434 * it is in common with us.
435 */
436 const char *hex = sha1_to_hex(result_sha1);
437 packet_buf_write(&req_buf, "have %s\n", hex);
438 state_len = req_buf.len;
439 }
440 mark_common(commit, 0, 1);
441 retval = 0;
442 in_vain = 0;
443 got_continue = 1;
444 if (ack == ACK_ready) {
445 rev_list = NULL;
446 got_ready = 1;
447 }
448 break;
449 }
450 }
451 } while (ack);
452 flushes--;
453 if (got_continue && MAX_IN_VAIN < in_vain) {
454 if (args.verbose)
455 fprintf(stderr, "giving up\n");
456 break; /* give up */
457 }
458 }
459 }
460done:
461 if (!got_ready || !no_done) {
462 packet_buf_write(&req_buf, "done\n");
463 send_request(fd[1], &req_buf);
464 }
465 if (args.verbose)
466 fprintf(stderr, "done\n");
467 if (retval != 0) {
468 multi_ack = 0;
469 flushes++;
470 }
471 strbuf_release(&req_buf);
472
473 consume_shallow_list(fd[0]);
474 while (flushes || multi_ack) {
475 int ack = get_ack(fd[0], result_sha1);
476 if (ack) {
477 if (args.verbose)
478 fprintf(stderr, "got ack (%d) %s\n", ack,
479 sha1_to_hex(result_sha1));
480 if (ack == ACK)
481 return 0;
482 multi_ack = 1;
483 continue;
484 }
485 flushes--;
486 }
487 /* it is no error to fetch into a completely empty repo */
488 return count ? retval : 0;
489}
490
491static struct commit_list *complete;
492
493static int mark_complete(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
494{
495 struct object *o = parse_object(sha1);
496
497 while (o && o->type == OBJ_TAG) {
498 struct tag *t = (struct tag *) o;
499 if (!t->tagged)
500 break; /* broken repository */
501 o->flags |= COMPLETE;
502 o = parse_object(t->tagged->sha1);
503 }
504 if (o && o->type == OBJ_COMMIT) {
505 struct commit *commit = (struct commit *)o;
506 if (!(commit->object.flags & COMPLETE)) {
507 commit->object.flags |= COMPLETE;
508 commit_list_insert_by_date(commit, &complete);
509 }
510 }
511 return 0;
512}
513
514static void mark_recent_complete_commits(unsigned long cutoff)
515{
516 while (complete && cutoff <= complete->item->date) {
517 if (args.verbose)
518 fprintf(stderr, "Marking %s as complete\n",
519 sha1_to_hex(complete->item->object.sha1));
520 pop_most_recent_commit(&complete, COMPLETE);
521 }
522}
523
524static void filter_refs(struct ref **refs, int nr_match, char **match)
525{
526 struct ref **return_refs;
527 struct ref *newlist = NULL;
528 struct ref **newtail = &newlist;
529 struct ref *ref, *next;
530 struct ref *fastarray[32];
531 int match_pos;
532
533 if (nr_match && !args.fetch_all) {
534 if (ARRAY_SIZE(fastarray) < nr_match)
535 return_refs = xcalloc(nr_match, sizeof(struct ref *));
536 else {
537 return_refs = fastarray;
538 memset(return_refs, 0, sizeof(struct ref *) * nr_match);
539 }
540 }
541 else
542 return_refs = NULL;
543
544 match_pos = 0;
545 for (ref = *refs; ref; ref = next) {
546 next = ref->next;
547 if (!memcmp(ref->name, "refs/", 5) &&
548 check_refname_format(ref->name + 5, 0))
549 ; /* trash */
550 else if (args.fetch_all &&
551 (!args.depth || prefixcmp(ref->name, "refs/tags/") )) {
552 *newtail = ref;
553 ref->next = NULL;
554 newtail = &ref->next;
555 continue;
556 }
557 else {
558 int cmp = -1;
559 while (match_pos < nr_match) {
560 cmp = strcmp(ref->name, match[match_pos]);
561 if (cmp < 0) /* definitely do not have it */
562 break;
563 else if (cmp == 0) { /* definitely have it */
564 match[match_pos][0] = '\0';
565 return_refs[match_pos] = ref;
566 break;
567 }
568 else /* might have it; keep looking */
569 match_pos++;
570 }
571 if (!cmp)
572 continue; /* we will link it later */
573 }
574 free(ref);
575 }
576
577 if (!args.fetch_all) {
578 int i;
579 for (i = 0; i < nr_match; i++) {
580 ref = return_refs[i];
581 if (ref) {
582 *newtail = ref;
583 ref->next = NULL;
584 newtail = &ref->next;
585 }
586 }
587 if (return_refs != fastarray)
588 free(return_refs);
589 }
590 *refs = newlist;
591}
592
593static void mark_alternate_complete(const struct ref *ref, void *unused)
594{
595 mark_complete(NULL, ref->old_sha1, 0, NULL);
596}
597
598static int everything_local(struct ref **refs, int nr_match, char **match)
599{
600 struct ref *ref;
601 int retval;
602 unsigned long cutoff = 0;
603
604 save_commit_buffer = 0;
605
606 for (ref = *refs; ref; ref = ref->next) {
607 struct object *o;
608
609 o = parse_object(ref->old_sha1);
610 if (!o)
611 continue;
612
613 /* We already have it -- which may mean that we were
614 * in sync with the other side at some time after
615 * that (it is OK if we guess wrong here).
616 */
617 if (o->type == OBJ_COMMIT) {
618 struct commit *commit = (struct commit *)o;
619 if (!cutoff || cutoff < commit->date)
620 cutoff = commit->date;
621 }
622 }
623
624 if (!args.depth) {
625 for_each_ref(mark_complete, NULL);
626 for_each_alternate_ref(mark_alternate_complete, NULL);
627 if (cutoff)
628 mark_recent_complete_commits(cutoff);
629 }
630
631 /*
632 * Mark all complete remote refs as common refs.
633 * Don't mark them common yet; the server has to be told so first.
634 */
635 for (ref = *refs; ref; ref = ref->next) {
636 struct object *o = deref_tag(lookup_object(ref->old_sha1),
637 NULL, 0);
638
639 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
640 continue;
641
642 if (!(o->flags & SEEN)) {
643 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
644
645 mark_common((struct commit *)o, 1, 1);
646 }
647 }
648
649 filter_refs(refs, nr_match, match);
650
651 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
652 const unsigned char *remote = ref->old_sha1;
653 unsigned char local[20];
654 struct object *o;
655
656 o = lookup_object(remote);
657 if (!o || !(o->flags & COMPLETE)) {
658 retval = 0;
659 if (!args.verbose)
660 continue;
661 fprintf(stderr,
662 "want %s (%s)\n", sha1_to_hex(remote),
663 ref->name);
664 continue;
665 }
666
667 hashcpy(ref->new_sha1, local);
668 if (!args.verbose)
669 continue;
670 fprintf(stderr,
671 "already have %s (%s)\n", sha1_to_hex(remote),
672 ref->name);
673 }
674 return retval;
675}
676
677static int sideband_demux(int in, int out, void *data)
678{
679 int *xd = data;
680
681 int ret = recv_sideband("fetch-pack", xd[0], out);
682 close(out);
683 return ret;
684}
685
686static int get_pack(int xd[2], char **pack_lockfile)
687{
688 struct async demux;
689 const char *argv[20];
690 char keep_arg[256];
691 char hdr_arg[256];
692 const char **av;
693 int do_keep = args.keep_pack;
694 struct child_process cmd;
695
696 memset(&demux, 0, sizeof(demux));
697 if (use_sideband) {
698 /* xd[] is talking with upload-pack; subprocess reads from
699 * xd[0], spits out band#2 to stderr, and feeds us band#1
700 * through demux->out.
701 */
702 demux.proc = sideband_demux;
703 demux.data = xd;
704 demux.out = -1;
705 if (start_async(&demux))
706 die("fetch-pack: unable to fork off sideband"
707 " demultiplexer");
708 }
709 else
710 demux.out = xd[0];
711
712 memset(&cmd, 0, sizeof(cmd));
713 cmd.argv = argv;
714 av = argv;
715 *hdr_arg = 0;
716 if (!args.keep_pack && unpack_limit) {
717 struct pack_header header;
718
719 if (read_pack_header(demux.out, &header))
720 die("protocol error: bad pack header");
721 snprintf(hdr_arg, sizeof(hdr_arg),
722 "--pack_header=%"PRIu32",%"PRIu32,
723 ntohl(header.hdr_version), ntohl(header.hdr_entries));
724 if (ntohl(header.hdr_entries) < unpack_limit)
725 do_keep = 0;
726 else
727 do_keep = 1;
728 }
729
730 if (do_keep) {
731 if (pack_lockfile)
732 cmd.out = -1;
733 *av++ = "index-pack";
734 *av++ = "--stdin";
735 if (!args.quiet && !args.no_progress)
736 *av++ = "-v";
737 if (args.use_thin_pack)
738 *av++ = "--fix-thin";
739 if (args.lock_pack || unpack_limit) {
740 int s = sprintf(keep_arg,
741 "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
742 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
743 strcpy(keep_arg + s, "localhost");
744 *av++ = keep_arg;
745 }
746 }
747 else {
748 *av++ = "unpack-objects";
749 if (args.quiet || args.no_progress)
750 *av++ = "-q";
751 }
752 if (*hdr_arg)
753 *av++ = hdr_arg;
754 if (fetch_fsck_objects >= 0
755 ? fetch_fsck_objects
756 : transfer_fsck_objects >= 0
757 ? transfer_fsck_objects
758 : 0)
759 *av++ = "--strict";
760 *av++ = NULL;
761
762 cmd.in = demux.out;
763 cmd.git_cmd = 1;
764 if (start_command(&cmd))
765 die("fetch-pack: unable to fork off %s", argv[0]);
766 if (do_keep && pack_lockfile) {
767 *pack_lockfile = index_pack_lockfile(cmd.out);
768 close(cmd.out);
769 }
770
771 if (finish_command(&cmd))
772 die("%s failed", argv[0]);
773 if (use_sideband && finish_async(&demux))
774 die("error in sideband demultiplexer");
775 return 0;
776}
777
778static struct ref *do_fetch_pack(int fd[2],
779 const struct ref *orig_ref,
780 int nr_match,
781 char **match,
782 char **pack_lockfile)
783{
784 struct ref *ref = copy_ref_list(orig_ref);
785 unsigned char sha1[20];
786
787 sort_ref_list(&ref, ref_compare_name);
788
789 if (is_repository_shallow() && !server_supports("shallow"))
790 die("Server does not support shallow clients");
791 if (server_supports("multi_ack_detailed")) {
792 if (args.verbose)
793 fprintf(stderr, "Server supports multi_ack_detailed\n");
794 multi_ack = 2;
795 if (server_supports("no-done")) {
796 if (args.verbose)
797 fprintf(stderr, "Server supports no-done\n");
798 if (args.stateless_rpc)
799 no_done = 1;
800 }
801 }
802 else if (server_supports("multi_ack")) {
803 if (args.verbose)
804 fprintf(stderr, "Server supports multi_ack\n");
805 multi_ack = 1;
806 }
807 if (server_supports("side-band-64k")) {
808 if (args.verbose)
809 fprintf(stderr, "Server supports side-band-64k\n");
810 use_sideband = 2;
811 }
812 else if (server_supports("side-band")) {
813 if (args.verbose)
814 fprintf(stderr, "Server supports side-band\n");
815 use_sideband = 1;
816 }
817 if (server_supports("ofs-delta")) {
818 if (args.verbose)
819 fprintf(stderr, "Server supports ofs-delta\n");
820 } else
821 prefer_ofs_delta = 0;
822 if (everything_local(&ref, nr_match, match)) {
823 packet_flush(fd[1]);
824 goto all_done;
825 }
826 if (find_common(fd, sha1, ref) < 0)
827 if (!args.keep_pack)
828 /* When cloning, it is not unusual to have
829 * no common commit.
830 */
831 warning("no common commits");
832
833 if (args.stateless_rpc)
834 packet_flush(fd[1]);
835 if (get_pack(fd, pack_lockfile))
836 die("git fetch-pack: fetch failed.");
837
838 all_done:
839 return ref;
840}
841
842static int remove_duplicates(int nr_heads, char **heads)
843{
844 int src, dst;
845
846 if (!nr_heads)
847 return 0;
848
849 for (src = dst = 1; src < nr_heads; src++)
850 if (strcmp(heads[src], heads[dst-1]))
851 heads[dst++] = heads[src];
852 return dst;
853}
854
855static int fetch_pack_config(const char *var, const char *value, void *cb)
856{
857 if (strcmp(var, "fetch.unpacklimit") == 0) {
858 fetch_unpack_limit = git_config_int(var, value);
859 return 0;
860 }
861
862 if (strcmp(var, "transfer.unpacklimit") == 0) {
863 transfer_unpack_limit = git_config_int(var, value);
864 return 0;
865 }
866
867 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
868 prefer_ofs_delta = git_config_bool(var, value);
869 return 0;
870 }
871
872 if (!strcmp(var, "fetch.fsckobjects")) {
873 fetch_fsck_objects = git_config_bool(var, value);
874 return 0;
875 }
876
877 if (!strcmp(var, "transfer.fsckobjects")) {
878 transfer_fsck_objects = git_config_bool(var, value);
879 return 0;
880 }
881
882 return git_default_config(var, value, cb);
883}
884
885static struct lock_file lock;
886
887static void fetch_pack_setup(void)
888{
889 static int did_setup;
890 if (did_setup)
891 return;
892 git_config(fetch_pack_config, NULL);
893 if (0 <= transfer_unpack_limit)
894 unpack_limit = transfer_unpack_limit;
895 else if (0 <= fetch_unpack_limit)
896 unpack_limit = fetch_unpack_limit;
897 did_setup = 1;
898}
899
900int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
901{
902 int i, ret;
903 struct ref *ref = NULL;
904 const char *dest = NULL;
905 int alloc_heads = 0, nr_heads = 0;
906 char **heads = NULL;
907 int fd[2];
908 char *pack_lockfile = NULL;
909 char **pack_lockfile_ptr = NULL;
910 struct child_process *conn;
911
912 packet_trace_identity("fetch-pack");
913
914 for (i = 1; i < argc && *argv[i] == '-'; i++) {
915 const char *arg = argv[i];
916
917 if (!prefixcmp(arg, "--upload-pack=")) {
918 args.uploadpack = arg + 14;
919 continue;
920 }
921 if (!prefixcmp(arg, "--exec=")) {
922 args.uploadpack = arg + 7;
923 continue;
924 }
925 if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
926 args.quiet = 1;
927 continue;
928 }
929 if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
930 args.lock_pack = args.keep_pack;
931 args.keep_pack = 1;
932 continue;
933 }
934 if (!strcmp("--thin", arg)) {
935 args.use_thin_pack = 1;
936 continue;
937 }
938 if (!strcmp("--include-tag", arg)) {
939 args.include_tag = 1;
940 continue;
941 }
942 if (!strcmp("--all", arg)) {
943 args.fetch_all = 1;
944 continue;
945 }
946 if (!strcmp("--stdin", arg)) {
947 args.stdin_refs = 1;
948 continue;
949 }
950 if (!strcmp("-v", arg)) {
951 args.verbose = 1;
952 continue;
953 }
954 if (!prefixcmp(arg, "--depth=")) {
955 args.depth = strtol(arg + 8, NULL, 0);
956 continue;
957 }
958 if (!strcmp("--no-progress", arg)) {
959 args.no_progress = 1;
960 continue;
961 }
962 if (!strcmp("--stateless-rpc", arg)) {
963 args.stateless_rpc = 1;
964 continue;
965 }
966 if (!strcmp("--lock-pack", arg)) {
967 args.lock_pack = 1;
968 pack_lockfile_ptr = &pack_lockfile;
969 continue;
970 }
971 usage(fetch_pack_usage);
972 }
973
974 if (i < argc)
975 dest = argv[i++];
976 else
977 usage(fetch_pack_usage);
978
979 /*
980 * Copy refs from cmdline to growable list, then append any
981 * refs from the standard input:
982 */
983 ALLOC_GROW(heads, argc - i, alloc_heads);
984 for (; i < argc; i++)
985 heads[nr_heads++] = xstrdup(argv[i]);
986 if (args.stdin_refs) {
987 if (args.stateless_rpc) {
988 /* in stateless RPC mode we use pkt-line to read
989 * from stdin, until we get a flush packet
990 */
991 static char line[1000];
992 for (;;) {
993 int n = packet_read_line(0, line, sizeof(line));
994 if (!n)
995 break;
996 if (line[n-1] == '\n')
997 n--;
998 ALLOC_GROW(heads, nr_heads + 1, alloc_heads);
999 heads[nr_heads++] = xmemdupz(line, n);
1000 }
1001 }
1002 else {
1003 /* read from stdin one ref per line, until EOF */
1004 struct strbuf line = STRBUF_INIT;
1005 while (strbuf_getline(&line, stdin, '\n') != EOF) {
1006 ALLOC_GROW(heads, nr_heads + 1, alloc_heads);
1007 heads[nr_heads++] = strbuf_detach(&line, NULL);
1008 }
1009 strbuf_release(&line);
1010 }
1011 }
1012
1013 if (args.stateless_rpc) {
1014 conn = NULL;
1015 fd[0] = 0;
1016 fd[1] = 1;
1017 } else {
1018 conn = git_connect(fd, dest, args.uploadpack,
1019 args.verbose ? CONNECT_VERBOSE : 0);
1020 }
1021
1022 get_remote_heads(fd[0], &ref, 0, NULL);
1023
1024 ref = fetch_pack(&args, fd, conn, ref, dest,
1025 nr_heads, heads, pack_lockfile_ptr);
1026 if (pack_lockfile) {
1027 printf("lock %s\n", pack_lockfile);
1028 fflush(stdout);
1029 }
1030 close(fd[0]);
1031 close(fd[1]);
1032 if (finish_connect(conn))
1033 ref = NULL;
1034 ret = !ref;
1035
1036 if (!ret && nr_heads) {
1037 /* If the heads to pull were given, we should have
1038 * consumed all of them by matching the remote.
1039 * Otherwise, 'git fetch remote no-such-ref' would
1040 * silently succeed without issuing an error.
1041 */
1042 for (i = 0; i < nr_heads; i++)
1043 if (heads[i] && heads[i][0]) {
1044 error("no such remote ref %s", heads[i]);
1045 ret = 1;
1046 }
1047 }
1048 while (ref) {
1049 printf("%s %s\n",
1050 sha1_to_hex(ref->old_sha1), ref->name);
1051 ref = ref->next;
1052 }
1053
1054 return ret;
1055}
1056
1057static int compare_heads(const void *a, const void *b)
1058{
1059 return strcmp(*(const char **)a, *(const char **)b);
1060}
1061
1062struct ref *fetch_pack(struct fetch_pack_args *my_args,
1063 int fd[], struct child_process *conn,
1064 const struct ref *ref,
1065 const char *dest,
1066 int nr_heads,
1067 char **heads,
1068 char **pack_lockfile)
1069{
1070 struct stat st;
1071 struct ref *ref_cpy;
1072
1073 fetch_pack_setup();
1074 if (&args != my_args)
1075 memcpy(&args, my_args, sizeof(args));
1076 if (args.depth > 0) {
1077 if (stat(git_path("shallow"), &st))
1078 st.st_mtime = 0;
1079 }
1080
1081 if (heads && nr_heads) {
1082 qsort(heads, nr_heads, sizeof(*heads), compare_heads);
1083 nr_heads = remove_duplicates(nr_heads, heads);
1084 }
1085
1086 if (!ref) {
1087 packet_flush(fd[1]);
1088 die("no matching remote head");
1089 }
1090 ref_cpy = do_fetch_pack(fd, ref, nr_heads, heads, pack_lockfile);
1091
1092 if (args.depth > 0) {
1093 struct cache_time mtime;
1094 struct strbuf sb = STRBUF_INIT;
1095 char *shallow = git_path("shallow");
1096 int fd;
1097
1098 mtime.sec = st.st_mtime;
1099 mtime.nsec = ST_MTIME_NSEC(st);
1100 if (stat(shallow, &st)) {
1101 if (mtime.sec)
1102 die("shallow file was removed during fetch");
1103 } else if (st.st_mtime != mtime.sec
1104#ifdef USE_NSEC
1105 || ST_MTIME_NSEC(st) != mtime.nsec
1106#endif
1107 )
1108 die("shallow file was changed during fetch");
1109
1110 fd = hold_lock_file_for_update(&lock, shallow,
1111 LOCK_DIE_ON_ERROR);
1112 if (!write_shallow_commits(&sb, 0)
1113 || write_in_full(fd, sb.buf, sb.len) != sb.len) {
1114 unlink_or_warn(shallow);
1115 rollback_lock_file(&lock);
1116 } else {
1117 commit_lock_file(&lock);
1118 }
1119 strbuf_release(&sb);
1120 }
1121
1122 reprepare_packed_git();
1123 return ref_cpy;
1124}