configure.ac: Add missing comma to CC_LD_DYNPATH
[git/gitweb.git] / builtin / fetch-pack.c
blobe6443986b81050b01ebd7c57a7afd7abb5c65a45
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 #include "version.h"
15 static int transfer_unpack_limit = -1;
16 static int fetch_unpack_limit = -1;
17 static int unpack_limit = 100;
18 static int prefer_ofs_delta = 1;
19 static int no_done;
20 static int fetch_fsck_objects = -1;
21 static int transfer_fsck_objects = -1;
22 static int agent_supported;
23 static struct fetch_pack_args args = {
24 /* .uploadpack = */ "git-upload-pack",
27 static const char fetch_pack_usage[] =
28 "git fetch-pack [--all] [--stdin] [--quiet|-q] [--keep|-k] [--thin] "
29 "[--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] "
30 "[--no-progress] [-v] [<host>:]<directory> [<refs>...]";
32 #define COMPLETE (1U << 0)
33 #define COMMON (1U << 1)
34 #define COMMON_REF (1U << 2)
35 #define SEEN (1U << 3)
36 #define POPPED (1U << 4)
38 static int marked;
41 * After sending this many "have"s if we do not get any new ACK , we
42 * give up traversing our history.
44 #define MAX_IN_VAIN 256
46 static struct commit_list *rev_list;
47 static int non_common_revs, multi_ack, use_sideband;
49 static void rev_list_push(struct commit *commit, int mark)
51 if (!(commit->object.flags & mark)) {
52 commit->object.flags |= mark;
54 if (!(commit->object.parsed))
55 if (parse_commit(commit))
56 return;
58 commit_list_insert_by_date(commit, &rev_list);
60 if (!(commit->object.flags & COMMON))
61 non_common_revs++;
65 static int rev_list_insert_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
67 struct object *o = deref_tag(parse_object(sha1), refname, 0);
69 if (o && o->type == OBJ_COMMIT)
70 rev_list_push((struct commit *)o, SEEN);
72 return 0;
75 static int clear_marks(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
77 struct object *o = deref_tag(parse_object(sha1), refname, 0);
79 if (o && o->type == OBJ_COMMIT)
80 clear_commit_marks((struct commit *)o,
81 COMMON | COMMON_REF | SEEN | POPPED);
82 return 0;
86 This function marks a rev and its ancestors as common.
87 In some cases, it is desirable to mark only the ancestors (for example
88 when only the server does not yet know that they are common).
91 static void mark_common(struct commit *commit,
92 int ancestors_only, int dont_parse)
94 if (commit != NULL && !(commit->object.flags & COMMON)) {
95 struct object *o = (struct object *)commit;
97 if (!ancestors_only)
98 o->flags |= COMMON;
100 if (!(o->flags & SEEN))
101 rev_list_push(commit, SEEN);
102 else {
103 struct commit_list *parents;
105 if (!ancestors_only && !(o->flags & POPPED))
106 non_common_revs--;
107 if (!o->parsed && !dont_parse)
108 if (parse_commit(commit))
109 return;
111 for (parents = commit->parents;
112 parents;
113 parents = parents->next)
114 mark_common(parents->item, 0, dont_parse);
120 Get the next rev to send, ignoring the common.
123 static const unsigned char *get_rev(void)
125 struct commit *commit = NULL;
127 while (commit == NULL) {
128 unsigned int mark;
129 struct commit_list *parents;
131 if (rev_list == NULL || non_common_revs == 0)
132 return NULL;
134 commit = rev_list->item;
135 if (!commit->object.parsed)
136 parse_commit(commit);
137 parents = commit->parents;
139 commit->object.flags |= POPPED;
140 if (!(commit->object.flags & COMMON))
141 non_common_revs--;
143 if (commit->object.flags & COMMON) {
144 /* do not send "have", and ignore ancestors */
145 commit = NULL;
146 mark = COMMON | SEEN;
147 } else if (commit->object.flags & COMMON_REF)
148 /* send "have", and ignore ancestors */
149 mark = COMMON | SEEN;
150 else
151 /* send "have", also for its ancestors */
152 mark = SEEN;
154 while (parents) {
155 if (!(parents->item->object.flags & SEEN))
156 rev_list_push(parents->item, mark);
157 if (mark & COMMON)
158 mark_common(parents->item, 1, 0);
159 parents = parents->next;
162 rev_list = rev_list->next;
165 return commit->object.sha1;
168 enum ack_type {
169 NAK = 0,
170 ACK,
171 ACK_continue,
172 ACK_common,
173 ACK_ready
176 static void consume_shallow_list(int fd)
178 if (args.stateless_rpc && args.depth > 0) {
179 /* If we sent a depth we will get back "duplicate"
180 * shallow and unshallow commands every time there
181 * is a block of have lines exchanged.
183 char line[1000];
184 while (packet_read_line(fd, line, sizeof(line))) {
185 if (!prefixcmp(line, "shallow "))
186 continue;
187 if (!prefixcmp(line, "unshallow "))
188 continue;
189 die("git fetch-pack: expected shallow list");
194 struct write_shallow_data {
195 struct strbuf *out;
196 int use_pack_protocol;
197 int count;
200 static int write_one_shallow(const struct commit_graft *graft, void *cb_data)
202 struct write_shallow_data *data = cb_data;
203 const char *hex = sha1_to_hex(graft->sha1);
204 data->count++;
205 if (data->use_pack_protocol)
206 packet_buf_write(data->out, "shallow %s", hex);
207 else {
208 strbuf_addstr(data->out, hex);
209 strbuf_addch(data->out, '\n');
211 return 0;
214 static int write_shallow_commits(struct strbuf *out, int use_pack_protocol)
216 struct write_shallow_data data;
217 data.out = out;
218 data.use_pack_protocol = use_pack_protocol;
219 data.count = 0;
220 for_each_commit_graft(write_one_shallow, &data);
221 return data.count;
224 static enum ack_type get_ack(int fd, unsigned char *result_sha1)
226 static char line[1000];
227 int len = packet_read_line(fd, line, sizeof(line));
229 if (!len)
230 die("git fetch-pack: expected ACK/NAK, got EOF");
231 if (line[len-1] == '\n')
232 line[--len] = 0;
233 if (!strcmp(line, "NAK"))
234 return NAK;
235 if (!prefixcmp(line, "ACK ")) {
236 if (!get_sha1_hex(line+4, result_sha1)) {
237 if (strstr(line+45, "continue"))
238 return ACK_continue;
239 if (strstr(line+45, "common"))
240 return ACK_common;
241 if (strstr(line+45, "ready"))
242 return ACK_ready;
243 return ACK;
246 die("git fetch_pack: expected ACK/NAK, got '%s'", line);
249 static void send_request(int fd, struct strbuf *buf)
251 if (args.stateless_rpc) {
252 send_sideband(fd, -1, buf->buf, buf->len, LARGE_PACKET_MAX);
253 packet_flush(fd);
254 } else
255 safe_write(fd, buf->buf, buf->len);
258 static void insert_one_alternate_ref(const struct ref *ref, void *unused)
260 rev_list_insert_ref(NULL, ref->old_sha1, 0, NULL);
263 #define INITIAL_FLUSH 16
264 #define PIPESAFE_FLUSH 32
265 #define LARGE_FLUSH 1024
267 static int next_flush(int count)
269 int flush_limit = args.stateless_rpc ? LARGE_FLUSH : PIPESAFE_FLUSH;
271 if (count < flush_limit)
272 count <<= 1;
273 else
274 count += flush_limit;
275 return count;
278 static int find_common(int fd[2], unsigned char *result_sha1,
279 struct ref *refs)
281 int fetching;
282 int count = 0, flushes = 0, flush_at = INITIAL_FLUSH, retval;
283 const unsigned char *sha1;
284 unsigned in_vain = 0;
285 int got_continue = 0;
286 int got_ready = 0;
287 struct strbuf req_buf = STRBUF_INIT;
288 size_t state_len = 0;
290 if (args.stateless_rpc && multi_ack == 1)
291 die("--stateless-rpc requires multi_ack_detailed");
292 if (marked)
293 for_each_ref(clear_marks, NULL);
294 marked = 1;
296 for_each_ref(rev_list_insert_ref, NULL);
297 for_each_alternate_ref(insert_one_alternate_ref, NULL);
299 fetching = 0;
300 for ( ; refs ; refs = refs->next) {
301 unsigned char *remote = refs->old_sha1;
302 const char *remote_hex;
303 struct object *o;
306 * If that object is complete (i.e. it is an ancestor of a
307 * local ref), we tell them we have it but do not have to
308 * tell them about its ancestors, which they already know
309 * about.
311 * We use lookup_object here because we are only
312 * interested in the case we *know* the object is
313 * reachable and we have already scanned it.
315 if (((o = lookup_object(remote)) != NULL) &&
316 (o->flags & COMPLETE)) {
317 continue;
320 remote_hex = sha1_to_hex(remote);
321 if (!fetching) {
322 struct strbuf c = STRBUF_INIT;
323 if (multi_ack == 2) strbuf_addstr(&c, " multi_ack_detailed");
324 if (multi_ack == 1) strbuf_addstr(&c, " multi_ack");
325 if (no_done) strbuf_addstr(&c, " no-done");
326 if (use_sideband == 2) strbuf_addstr(&c, " side-band-64k");
327 if (use_sideband == 1) strbuf_addstr(&c, " side-band");
328 if (args.use_thin_pack) strbuf_addstr(&c, " thin-pack");
329 if (args.no_progress) strbuf_addstr(&c, " no-progress");
330 if (args.include_tag) strbuf_addstr(&c, " include-tag");
331 if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta");
332 if (agent_supported) strbuf_addf(&c, " agent=%s",
333 git_user_agent_sanitized());
334 packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
335 strbuf_release(&c);
336 } else
337 packet_buf_write(&req_buf, "want %s\n", remote_hex);
338 fetching++;
341 if (!fetching) {
342 strbuf_release(&req_buf);
343 packet_flush(fd[1]);
344 return 1;
347 if (is_repository_shallow())
348 write_shallow_commits(&req_buf, 1);
349 if (args.depth > 0)
350 packet_buf_write(&req_buf, "deepen %d", args.depth);
351 packet_buf_flush(&req_buf);
352 state_len = req_buf.len;
354 if (args.depth > 0) {
355 char line[1024];
356 unsigned char sha1[20];
358 send_request(fd[1], &req_buf);
359 while (packet_read_line(fd[0], line, sizeof(line))) {
360 if (!prefixcmp(line, "shallow ")) {
361 if (get_sha1_hex(line + 8, sha1))
362 die("invalid shallow line: %s", line);
363 register_shallow(sha1);
364 continue;
366 if (!prefixcmp(line, "unshallow ")) {
367 if (get_sha1_hex(line + 10, sha1))
368 die("invalid unshallow line: %s", line);
369 if (!lookup_object(sha1))
370 die("object not found: %s", line);
371 /* make sure that it is parsed as shallow */
372 if (!parse_object(sha1))
373 die("error in object: %s", line);
374 if (unregister_shallow(sha1))
375 die("no shallow found: %s", line);
376 continue;
378 die("expected shallow/unshallow, got %s", line);
380 } else if (!args.stateless_rpc)
381 send_request(fd[1], &req_buf);
383 if (!args.stateless_rpc) {
384 /* If we aren't using the stateless-rpc interface
385 * we don't need to retain the headers.
387 strbuf_setlen(&req_buf, 0);
388 state_len = 0;
391 flushes = 0;
392 retval = -1;
393 while ((sha1 = get_rev())) {
394 packet_buf_write(&req_buf, "have %s\n", sha1_to_hex(sha1));
395 if (args.verbose)
396 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
397 in_vain++;
398 if (flush_at <= ++count) {
399 int ack;
401 packet_buf_flush(&req_buf);
402 send_request(fd[1], &req_buf);
403 strbuf_setlen(&req_buf, state_len);
404 flushes++;
405 flush_at = next_flush(count);
408 * We keep one window "ahead" of the other side, and
409 * will wait for an ACK only on the next one
411 if (!args.stateless_rpc && count == INITIAL_FLUSH)
412 continue;
414 consume_shallow_list(fd[0]);
415 do {
416 ack = get_ack(fd[0], result_sha1);
417 if (args.verbose && ack)
418 fprintf(stderr, "got ack %d %s\n", ack,
419 sha1_to_hex(result_sha1));
420 switch (ack) {
421 case ACK:
422 flushes = 0;
423 multi_ack = 0;
424 retval = 0;
425 goto done;
426 case ACK_common:
427 case ACK_ready:
428 case ACK_continue: {
429 struct commit *commit =
430 lookup_commit(result_sha1);
431 if (!commit)
432 die("invalid commit %s", sha1_to_hex(result_sha1));
433 if (args.stateless_rpc
434 && ack == ACK_common
435 && !(commit->object.flags & COMMON)) {
436 /* We need to replay the have for this object
437 * on the next RPC request so the peer knows
438 * it is in common with us.
440 const char *hex = sha1_to_hex(result_sha1);
441 packet_buf_write(&req_buf, "have %s\n", hex);
442 state_len = req_buf.len;
444 mark_common(commit, 0, 1);
445 retval = 0;
446 in_vain = 0;
447 got_continue = 1;
448 if (ack == ACK_ready) {
449 rev_list = NULL;
450 got_ready = 1;
452 break;
455 } while (ack);
456 flushes--;
457 if (got_continue && MAX_IN_VAIN < in_vain) {
458 if (args.verbose)
459 fprintf(stderr, "giving up\n");
460 break; /* give up */
464 done:
465 if (!got_ready || !no_done) {
466 packet_buf_write(&req_buf, "done\n");
467 send_request(fd[1], &req_buf);
469 if (args.verbose)
470 fprintf(stderr, "done\n");
471 if (retval != 0) {
472 multi_ack = 0;
473 flushes++;
475 strbuf_release(&req_buf);
477 consume_shallow_list(fd[0]);
478 while (flushes || multi_ack) {
479 int ack = get_ack(fd[0], result_sha1);
480 if (ack) {
481 if (args.verbose)
482 fprintf(stderr, "got ack (%d) %s\n", ack,
483 sha1_to_hex(result_sha1));
484 if (ack == ACK)
485 return 0;
486 multi_ack = 1;
487 continue;
489 flushes--;
491 /* it is no error to fetch into a completely empty repo */
492 return count ? retval : 0;
495 static struct commit_list *complete;
497 static int mark_complete(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
499 struct object *o = parse_object(sha1);
501 while (o && o->type == OBJ_TAG) {
502 struct tag *t = (struct tag *) o;
503 if (!t->tagged)
504 break; /* broken repository */
505 o->flags |= COMPLETE;
506 o = parse_object(t->tagged->sha1);
508 if (o && o->type == OBJ_COMMIT) {
509 struct commit *commit = (struct commit *)o;
510 if (!(commit->object.flags & COMPLETE)) {
511 commit->object.flags |= COMPLETE;
512 commit_list_insert_by_date(commit, &complete);
515 return 0;
518 static void mark_recent_complete_commits(unsigned long cutoff)
520 while (complete && cutoff <= complete->item->date) {
521 if (args.verbose)
522 fprintf(stderr, "Marking %s as complete\n",
523 sha1_to_hex(complete->item->object.sha1));
524 pop_most_recent_commit(&complete, COMPLETE);
528 static int non_matching_ref(struct string_list_item *item, void *unused)
530 if (item->util) {
531 item->util = NULL;
532 return 0;
534 else
535 return 1;
538 static void filter_refs(struct ref **refs, struct string_list *sought)
540 struct ref *newlist = NULL;
541 struct ref **newtail = &newlist;
542 struct ref *ref, *next;
543 int sought_pos;
545 sought_pos = 0;
546 for (ref = *refs; ref; ref = next) {
547 int keep = 0;
548 next = ref->next;
549 if (!memcmp(ref->name, "refs/", 5) &&
550 check_refname_format(ref->name + 5, 0))
551 ; /* trash */
552 else {
553 while (sought_pos < sought->nr) {
554 int cmp = strcmp(ref->name, sought->items[sought_pos].string);
555 if (cmp < 0)
556 break; /* definitely do not have it */
557 else if (cmp == 0) {
558 keep = 1; /* definitely have it */
559 sought->items[sought_pos++].util = "matched";
560 break;
562 else
563 sought_pos++; /* might have it; keep looking */
567 if (! keep && args.fetch_all &&
568 (!args.depth || prefixcmp(ref->name, "refs/tags/")))
569 keep = 1;
571 if (keep) {
572 *newtail = ref;
573 ref->next = NULL;
574 newtail = &ref->next;
575 } else {
576 free(ref);
580 filter_string_list(sought, 0, non_matching_ref, NULL);
581 *refs = newlist;
584 static void mark_alternate_complete(const struct ref *ref, void *unused)
586 mark_complete(NULL, ref->old_sha1, 0, NULL);
589 static int everything_local(struct ref **refs, struct string_list *sought)
591 struct ref *ref;
592 int retval;
593 unsigned long cutoff = 0;
595 save_commit_buffer = 0;
597 for (ref = *refs; ref; ref = ref->next) {
598 struct object *o;
600 o = parse_object(ref->old_sha1);
601 if (!o)
602 continue;
604 /* We already have it -- which may mean that we were
605 * in sync with the other side at some time after
606 * that (it is OK if we guess wrong here).
608 if (o->type == OBJ_COMMIT) {
609 struct commit *commit = (struct commit *)o;
610 if (!cutoff || cutoff < commit->date)
611 cutoff = commit->date;
615 if (!args.depth) {
616 for_each_ref(mark_complete, NULL);
617 for_each_alternate_ref(mark_alternate_complete, NULL);
618 if (cutoff)
619 mark_recent_complete_commits(cutoff);
623 * Mark all complete remote refs as common refs.
624 * Don't mark them common yet; the server has to be told so first.
626 for (ref = *refs; ref; ref = ref->next) {
627 struct object *o = deref_tag(lookup_object(ref->old_sha1),
628 NULL, 0);
630 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
631 continue;
633 if (!(o->flags & SEEN)) {
634 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
636 mark_common((struct commit *)o, 1, 1);
640 filter_refs(refs, sought);
642 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
643 const unsigned char *remote = ref->old_sha1;
644 unsigned char local[20];
645 struct object *o;
647 o = lookup_object(remote);
648 if (!o || !(o->flags & COMPLETE)) {
649 retval = 0;
650 if (!args.verbose)
651 continue;
652 fprintf(stderr,
653 "want %s (%s)\n", sha1_to_hex(remote),
654 ref->name);
655 continue;
658 hashcpy(ref->new_sha1, local);
659 if (!args.verbose)
660 continue;
661 fprintf(stderr,
662 "already have %s (%s)\n", sha1_to_hex(remote),
663 ref->name);
665 return retval;
668 static int sideband_demux(int in, int out, void *data)
670 int *xd = data;
672 int ret = recv_sideband("fetch-pack", xd[0], out);
673 close(out);
674 return ret;
677 static int get_pack(int xd[2], char **pack_lockfile)
679 struct async demux;
680 const char *argv[20];
681 char keep_arg[256];
682 char hdr_arg[256];
683 const char **av;
684 int do_keep = args.keep_pack;
685 struct child_process cmd;
687 memset(&demux, 0, sizeof(demux));
688 if (use_sideband) {
689 /* xd[] is talking with upload-pack; subprocess reads from
690 * xd[0], spits out band#2 to stderr, and feeds us band#1
691 * through demux->out.
693 demux.proc = sideband_demux;
694 demux.data = xd;
695 demux.out = -1;
696 if (start_async(&demux))
697 die("fetch-pack: unable to fork off sideband"
698 " demultiplexer");
700 else
701 demux.out = xd[0];
703 memset(&cmd, 0, sizeof(cmd));
704 cmd.argv = argv;
705 av = argv;
706 *hdr_arg = 0;
707 if (!args.keep_pack && unpack_limit) {
708 struct pack_header header;
710 if (read_pack_header(demux.out, &header))
711 die("protocol error: bad pack header");
712 snprintf(hdr_arg, sizeof(hdr_arg),
713 "--pack_header=%"PRIu32",%"PRIu32,
714 ntohl(header.hdr_version), ntohl(header.hdr_entries));
715 if (ntohl(header.hdr_entries) < unpack_limit)
716 do_keep = 0;
717 else
718 do_keep = 1;
721 if (do_keep) {
722 if (pack_lockfile)
723 cmd.out = -1;
724 *av++ = "index-pack";
725 *av++ = "--stdin";
726 if (!args.quiet && !args.no_progress)
727 *av++ = "-v";
728 if (args.use_thin_pack)
729 *av++ = "--fix-thin";
730 if (args.lock_pack || unpack_limit) {
731 int s = sprintf(keep_arg,
732 "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
733 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
734 strcpy(keep_arg + s, "localhost");
735 *av++ = keep_arg;
738 else {
739 *av++ = "unpack-objects";
740 if (args.quiet || args.no_progress)
741 *av++ = "-q";
743 if (*hdr_arg)
744 *av++ = hdr_arg;
745 if (fetch_fsck_objects >= 0
746 ? fetch_fsck_objects
747 : transfer_fsck_objects >= 0
748 ? transfer_fsck_objects
749 : 0)
750 *av++ = "--strict";
751 *av++ = NULL;
753 cmd.in = demux.out;
754 cmd.git_cmd = 1;
755 if (start_command(&cmd))
756 die("fetch-pack: unable to fork off %s", argv[0]);
757 if (do_keep && pack_lockfile) {
758 *pack_lockfile = index_pack_lockfile(cmd.out);
759 close(cmd.out);
762 if (finish_command(&cmd))
763 die("%s failed", argv[0]);
764 if (use_sideband && finish_async(&demux))
765 die("error in sideband demultiplexer");
766 return 0;
769 static struct ref *do_fetch_pack(int fd[2],
770 const struct ref *orig_ref,
771 struct string_list *sought,
772 char **pack_lockfile)
774 struct ref *ref = copy_ref_list(orig_ref);
775 unsigned char sha1[20];
776 const char *agent_feature;
777 int agent_len;
779 sort_ref_list(&ref, ref_compare_name);
781 if (is_repository_shallow() && !server_supports("shallow"))
782 die("Server does not support shallow clients");
783 if (server_supports("multi_ack_detailed")) {
784 if (args.verbose)
785 fprintf(stderr, "Server supports multi_ack_detailed\n");
786 multi_ack = 2;
787 if (server_supports("no-done")) {
788 if (args.verbose)
789 fprintf(stderr, "Server supports no-done\n");
790 if (args.stateless_rpc)
791 no_done = 1;
794 else if (server_supports("multi_ack")) {
795 if (args.verbose)
796 fprintf(stderr, "Server supports multi_ack\n");
797 multi_ack = 1;
799 if (server_supports("side-band-64k")) {
800 if (args.verbose)
801 fprintf(stderr, "Server supports side-band-64k\n");
802 use_sideband = 2;
804 else if (server_supports("side-band")) {
805 if (args.verbose)
806 fprintf(stderr, "Server supports side-band\n");
807 use_sideband = 1;
809 if (!server_supports("thin-pack"))
810 args.use_thin_pack = 0;
811 if (!server_supports("no-progress"))
812 args.no_progress = 0;
813 if (!server_supports("include-tag"))
814 args.include_tag = 0;
815 if (server_supports("ofs-delta")) {
816 if (args.verbose)
817 fprintf(stderr, "Server supports ofs-delta\n");
818 } else
819 prefer_ofs_delta = 0;
821 if ((agent_feature = server_feature_value("agent", &agent_len))) {
822 agent_supported = 1;
823 if (args.verbose && agent_len)
824 fprintf(stderr, "Server version is %.*s\n",
825 agent_len, agent_feature);
828 if (everything_local(&ref, sought)) {
829 packet_flush(fd[1]);
830 goto all_done;
832 if (find_common(fd, sha1, ref) < 0)
833 if (!args.keep_pack)
834 /* When cloning, it is not unusual to have
835 * no common commit.
837 warning("no common commits");
839 if (args.stateless_rpc)
840 packet_flush(fd[1]);
841 if (get_pack(fd, pack_lockfile))
842 die("git fetch-pack: fetch failed.");
844 all_done:
845 return ref;
848 static int fetch_pack_config(const char *var, const char *value, void *cb)
850 if (strcmp(var, "fetch.unpacklimit") == 0) {
851 fetch_unpack_limit = git_config_int(var, value);
852 return 0;
855 if (strcmp(var, "transfer.unpacklimit") == 0) {
856 transfer_unpack_limit = git_config_int(var, value);
857 return 0;
860 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
861 prefer_ofs_delta = git_config_bool(var, value);
862 return 0;
865 if (!strcmp(var, "fetch.fsckobjects")) {
866 fetch_fsck_objects = git_config_bool(var, value);
867 return 0;
870 if (!strcmp(var, "transfer.fsckobjects")) {
871 transfer_fsck_objects = git_config_bool(var, value);
872 return 0;
875 return git_default_config(var, value, cb);
878 static struct lock_file lock;
880 static void fetch_pack_setup(void)
882 static int did_setup;
883 if (did_setup)
884 return;
885 git_config(fetch_pack_config, NULL);
886 if (0 <= transfer_unpack_limit)
887 unpack_limit = transfer_unpack_limit;
888 else if (0 <= fetch_unpack_limit)
889 unpack_limit = fetch_unpack_limit;
890 did_setup = 1;
893 int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
895 int i, ret;
896 struct ref *ref = NULL;
897 const char *dest = NULL;
898 struct string_list sought = STRING_LIST_INIT_DUP;
899 int fd[2];
900 char *pack_lockfile = NULL;
901 char **pack_lockfile_ptr = NULL;
902 struct child_process *conn;
904 packet_trace_identity("fetch-pack");
906 for (i = 1; i < argc && *argv[i] == '-'; i++) {
907 const char *arg = argv[i];
909 if (!prefixcmp(arg, "--upload-pack=")) {
910 args.uploadpack = arg + 14;
911 continue;
913 if (!prefixcmp(arg, "--exec=")) {
914 args.uploadpack = arg + 7;
915 continue;
917 if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
918 args.quiet = 1;
919 continue;
921 if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
922 args.lock_pack = args.keep_pack;
923 args.keep_pack = 1;
924 continue;
926 if (!strcmp("--thin", arg)) {
927 args.use_thin_pack = 1;
928 continue;
930 if (!strcmp("--include-tag", arg)) {
931 args.include_tag = 1;
932 continue;
934 if (!strcmp("--all", arg)) {
935 args.fetch_all = 1;
936 continue;
938 if (!strcmp("--stdin", arg)) {
939 args.stdin_refs = 1;
940 continue;
942 if (!strcmp("-v", arg)) {
943 args.verbose = 1;
944 continue;
946 if (!prefixcmp(arg, "--depth=")) {
947 args.depth = strtol(arg + 8, NULL, 0);
948 continue;
950 if (!strcmp("--no-progress", arg)) {
951 args.no_progress = 1;
952 continue;
954 if (!strcmp("--stateless-rpc", arg)) {
955 args.stateless_rpc = 1;
956 continue;
958 if (!strcmp("--lock-pack", arg)) {
959 args.lock_pack = 1;
960 pack_lockfile_ptr = &pack_lockfile;
961 continue;
963 usage(fetch_pack_usage);
966 if (i < argc)
967 dest = argv[i++];
968 else
969 usage(fetch_pack_usage);
972 * Copy refs from cmdline to growable list, then append any
973 * refs from the standard input:
975 for (; i < argc; i++)
976 string_list_append(&sought, xstrdup(argv[i]));
977 if (args.stdin_refs) {
978 if (args.stateless_rpc) {
979 /* in stateless RPC mode we use pkt-line to read
980 * from stdin, until we get a flush packet
982 static char line[1000];
983 for (;;) {
984 int n = packet_read_line(0, line, sizeof(line));
985 if (!n)
986 break;
987 if (line[n-1] == '\n')
988 n--;
989 string_list_append(&sought, xmemdupz(line, n));
992 else {
993 /* read from stdin one ref per line, until EOF */
994 struct strbuf line = STRBUF_INIT;
995 while (strbuf_getline(&line, stdin, '\n') != EOF)
996 string_list_append(&sought, strbuf_detach(&line, NULL));
997 strbuf_release(&line);
1001 if (args.stateless_rpc) {
1002 conn = NULL;
1003 fd[0] = 0;
1004 fd[1] = 1;
1005 } else {
1006 conn = git_connect(fd, dest, args.uploadpack,
1007 args.verbose ? CONNECT_VERBOSE : 0);
1010 get_remote_heads(fd[0], &ref, 0, NULL);
1012 ref = fetch_pack(&args, fd, conn, ref, dest,
1013 &sought, pack_lockfile_ptr);
1014 if (pack_lockfile) {
1015 printf("lock %s\n", pack_lockfile);
1016 fflush(stdout);
1018 close(fd[0]);
1019 close(fd[1]);
1020 if (finish_connect(conn))
1021 return 1;
1023 ret = !ref || sought.nr;
1026 * If the heads to pull were given, we should have consumed
1027 * all of them by matching the remote. Otherwise, 'git fetch
1028 * remote no-such-ref' would silently succeed without issuing
1029 * an error.
1031 for (i = 0; i < sought.nr; i++)
1032 error("no such remote ref %s", sought.items[i].string);
1033 while (ref) {
1034 printf("%s %s\n",
1035 sha1_to_hex(ref->old_sha1), ref->name);
1036 ref = ref->next;
1039 return ret;
1042 struct ref *fetch_pack(struct fetch_pack_args *my_args,
1043 int fd[], struct child_process *conn,
1044 const struct ref *ref,
1045 const char *dest,
1046 struct string_list *sought,
1047 char **pack_lockfile)
1049 struct stat st;
1050 struct ref *ref_cpy;
1052 fetch_pack_setup();
1053 if (&args != my_args)
1054 memcpy(&args, my_args, sizeof(args));
1055 if (args.depth > 0) {
1056 if (stat(git_path("shallow"), &st))
1057 st.st_mtime = 0;
1060 if (sought->nr) {
1061 sort_string_list(sought);
1062 string_list_remove_duplicates(sought, 0);
1065 if (!ref) {
1066 packet_flush(fd[1]);
1067 die("no matching remote head");
1069 ref_cpy = do_fetch_pack(fd, ref, sought, pack_lockfile);
1071 if (args.depth > 0) {
1072 struct cache_time mtime;
1073 struct strbuf sb = STRBUF_INIT;
1074 char *shallow = git_path("shallow");
1075 int fd;
1077 mtime.sec = st.st_mtime;
1078 mtime.nsec = ST_MTIME_NSEC(st);
1079 if (stat(shallow, &st)) {
1080 if (mtime.sec)
1081 die("shallow file was removed during fetch");
1082 } else if (st.st_mtime != mtime.sec
1083 #ifdef USE_NSEC
1084 || ST_MTIME_NSEC(st) != mtime.nsec
1085 #endif
1087 die("shallow file was changed during fetch");
1089 fd = hold_lock_file_for_update(&lock, shallow,
1090 LOCK_DIE_ON_ERROR);
1091 if (!write_shallow_commits(&sb, 0)
1092 || write_in_full(fd, sb.buf, sb.len) != sb.len) {
1093 unlink_or_warn(shallow);
1094 rollback_lock_file(&lock);
1095 } else {
1096 commit_lock_file(&lock);
1098 strbuf_release(&sb);
1101 reprepare_packed_git();
1102 return ref_cpy;