Merge branch 'tr/maint-strbuf-grow-nul-termination'
[git/mingw/j6t.git] / builtin / fetch-pack.c
blob412bd327b5b396c159c768b25be189e00531c38e
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"
14 static int transfer_unpack_limit = -1;
15 static int fetch_unpack_limit = -1;
16 static int unpack_limit = 100;
17 static int prefer_ofs_delta = 1;
18 static int no_done = 0;
19 static struct fetch_pack_args args = {
20 /* .uploadpack = */ "git-upload-pack",
23 static const char fetch_pack_usage[] =
24 "git fetch-pack [--all] [--quiet|-q] [--keep|-k] [--thin] [--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] [-v] [<host>:]<directory> [<refs>...]";
26 #define COMPLETE (1U << 0)
27 #define COMMON (1U << 1)
28 #define COMMON_REF (1U << 2)
29 #define SEEN (1U << 3)
30 #define POPPED (1U << 4)
32 static int marked;
35 * After sending this many "have"s if we do not get any new ACK , we
36 * give up traversing our history.
38 #define MAX_IN_VAIN 256
40 static struct commit_list *rev_list;
41 static int non_common_revs, multi_ack, use_sideband;
43 static void rev_list_push(struct commit *commit, int mark)
45 if (!(commit->object.flags & mark)) {
46 commit->object.flags |= mark;
48 if (!(commit->object.parsed))
49 if (parse_commit(commit))
50 return;
52 commit_list_insert_by_date(commit, &rev_list);
54 if (!(commit->object.flags & COMMON))
55 non_common_revs++;
59 static int rev_list_insert_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
61 struct object *o = deref_tag(parse_object(sha1), path, 0);
63 if (o && o->type == OBJ_COMMIT)
64 rev_list_push((struct commit *)o, SEEN);
66 return 0;
69 static int clear_marks(const char *path, const unsigned char *sha1, int flag, void *cb_data)
71 struct object *o = deref_tag(parse_object(sha1), path, 0);
73 if (o && o->type == OBJ_COMMIT)
74 clear_commit_marks((struct commit *)o,
75 COMMON | COMMON_REF | SEEN | POPPED);
76 return 0;
80 This function marks a rev and its ancestors as common.
81 In some cases, it is desirable to mark only the ancestors (for example
82 when only the server does not yet know that they are common).
85 static void mark_common(struct commit *commit,
86 int ancestors_only, int dont_parse)
88 if (commit != NULL && !(commit->object.flags & COMMON)) {
89 struct object *o = (struct object *)commit;
91 if (!ancestors_only)
92 o->flags |= COMMON;
94 if (!(o->flags & SEEN))
95 rev_list_push(commit, SEEN);
96 else {
97 struct commit_list *parents;
99 if (!ancestors_only && !(o->flags & POPPED))
100 non_common_revs--;
101 if (!o->parsed && !dont_parse)
102 if (parse_commit(commit))
103 return;
105 for (parents = commit->parents;
106 parents;
107 parents = parents->next)
108 mark_common(parents->item, 0, dont_parse);
114 Get the next rev to send, ignoring the common.
117 static const unsigned char *get_rev(void)
119 struct commit *commit = NULL;
121 while (commit == NULL) {
122 unsigned int mark;
123 struct commit_list *parents;
125 if (rev_list == NULL || non_common_revs == 0)
126 return NULL;
128 commit = rev_list->item;
129 if (!commit->object.parsed)
130 parse_commit(commit);
131 parents = commit->parents;
133 commit->object.flags |= POPPED;
134 if (!(commit->object.flags & COMMON))
135 non_common_revs--;
137 if (commit->object.flags & COMMON) {
138 /* do not send "have", and ignore ancestors */
139 commit = NULL;
140 mark = COMMON | SEEN;
141 } else if (commit->object.flags & COMMON_REF)
142 /* send "have", and ignore ancestors */
143 mark = COMMON | SEEN;
144 else
145 /* send "have", also for its ancestors */
146 mark = SEEN;
148 while (parents) {
149 if (!(parents->item->object.flags & SEEN))
150 rev_list_push(parents->item, mark);
151 if (mark & COMMON)
152 mark_common(parents->item, 1, 0);
153 parents = parents->next;
156 rev_list = rev_list->next;
159 return commit->object.sha1;
162 enum ack_type {
163 NAK = 0,
164 ACK,
165 ACK_continue,
166 ACK_common,
167 ACK_ready
170 static void consume_shallow_list(int fd)
172 if (args.stateless_rpc && args.depth > 0) {
173 /* If we sent a depth we will get back "duplicate"
174 * shallow and unshallow commands every time there
175 * is a block of have lines exchanged.
177 char line[1000];
178 while (packet_read_line(fd, line, sizeof(line))) {
179 if (!prefixcmp(line, "shallow "))
180 continue;
181 if (!prefixcmp(line, "unshallow "))
182 continue;
183 die("git fetch-pack: expected shallow list");
188 struct write_shallow_data {
189 struct strbuf *out;
190 int use_pack_protocol;
191 int count;
194 static int write_one_shallow(const struct commit_graft *graft, void *cb_data)
196 struct write_shallow_data *data = cb_data;
197 const char *hex = sha1_to_hex(graft->sha1);
198 data->count++;
199 if (data->use_pack_protocol)
200 packet_buf_write(data->out, "shallow %s", hex);
201 else {
202 strbuf_addstr(data->out, hex);
203 strbuf_addch(data->out, '\n');
205 return 0;
208 static int write_shallow_commits(struct strbuf *out, int use_pack_protocol)
210 struct write_shallow_data data;
211 data.out = out;
212 data.use_pack_protocol = use_pack_protocol;
213 data.count = 0;
214 for_each_commit_graft(write_one_shallow, &data);
215 return data.count;
218 static enum ack_type get_ack(int fd, unsigned char *result_sha1)
220 static char line[1000];
221 int len = packet_read_line(fd, line, sizeof(line));
223 if (!len)
224 die("git fetch-pack: expected ACK/NAK, got EOF");
225 if (line[len-1] == '\n')
226 line[--len] = 0;
227 if (!strcmp(line, "NAK"))
228 return NAK;
229 if (!prefixcmp(line, "ACK ")) {
230 if (!get_sha1_hex(line+4, result_sha1)) {
231 if (strstr(line+45, "continue"))
232 return ACK_continue;
233 if (strstr(line+45, "common"))
234 return ACK_common;
235 if (strstr(line+45, "ready"))
236 return ACK_ready;
237 return ACK;
240 die("git fetch_pack: expected ACK/NAK, got '%s'", line);
243 static void send_request(int fd, struct strbuf *buf)
245 if (args.stateless_rpc) {
246 send_sideband(fd, -1, buf->buf, buf->len, LARGE_PACKET_MAX);
247 packet_flush(fd);
248 } else
249 safe_write(fd, buf->buf, buf->len);
252 static void insert_one_alternate_ref(const struct ref *ref, void *unused)
254 rev_list_insert_ref(NULL, ref->old_sha1, 0, NULL);
257 static void insert_alternate_refs(void)
259 for_each_alternate_ref(insert_one_alternate_ref, NULL);
262 #define INITIAL_FLUSH 16
263 #define PIPESAFE_FLUSH 32
264 #define LARGE_FLUSH 1024
266 static int next_flush(int count)
268 int flush_limit = args.stateless_rpc ? LARGE_FLUSH : PIPESAFE_FLUSH;
270 if (count < flush_limit)
271 count <<= 1;
272 else
273 count += flush_limit;
274 return count;
277 static int find_common(int fd[2], unsigned char *result_sha1,
278 struct ref *refs)
280 int fetching;
281 int count = 0, flushes = 0, flush_at = INITIAL_FLUSH, retval;
282 const unsigned char *sha1;
283 unsigned in_vain = 0;
284 int got_continue = 0;
285 int got_ready = 0;
286 struct strbuf req_buf = STRBUF_INIT;
287 size_t state_len = 0;
289 if (args.stateless_rpc && multi_ack == 1)
290 die("--stateless-rpc requires multi_ack_detailed");
291 if (marked)
292 for_each_ref(clear_marks, NULL);
293 marked = 1;
295 for_each_ref(rev_list_insert_ref, NULL);
296 insert_alternate_refs();
298 fetching = 0;
299 for ( ; refs ; refs = refs->next) {
300 unsigned char *remote = refs->old_sha1;
301 const char *remote_hex;
302 struct object *o;
305 * If that object is complete (i.e. it is an ancestor of a
306 * local ref), we tell them we have it but do not have to
307 * tell them about its ancestors, which they already know
308 * about.
310 * We use lookup_object here because we are only
311 * interested in the case we *know* the object is
312 * reachable and we have already scanned it.
314 if (((o = lookup_object(remote)) != NULL) &&
315 (o->flags & COMPLETE)) {
316 continue;
319 remote_hex = sha1_to_hex(remote);
320 if (!fetching) {
321 struct strbuf c = STRBUF_INIT;
322 if (multi_ack == 2) strbuf_addstr(&c, " multi_ack_detailed");
323 if (multi_ack == 1) strbuf_addstr(&c, " multi_ack");
324 if (no_done) strbuf_addstr(&c, " no-done");
325 if (use_sideband == 2) strbuf_addstr(&c, " side-band-64k");
326 if (use_sideband == 1) strbuf_addstr(&c, " side-band");
327 if (args.use_thin_pack) strbuf_addstr(&c, " thin-pack");
328 if (args.no_progress) strbuf_addstr(&c, " no-progress");
329 if (args.include_tag) strbuf_addstr(&c, " include-tag");
330 if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta");
331 packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
332 strbuf_release(&c);
333 } else
334 packet_buf_write(&req_buf, "want %s\n", remote_hex);
335 fetching++;
338 if (!fetching) {
339 strbuf_release(&req_buf);
340 packet_flush(fd[1]);
341 return 1;
344 if (is_repository_shallow())
345 write_shallow_commits(&req_buf, 1);
346 if (args.depth > 0)
347 packet_buf_write(&req_buf, "deepen %d", args.depth);
348 packet_buf_flush(&req_buf);
349 state_len = req_buf.len;
351 if (args.depth > 0) {
352 char line[1024];
353 unsigned char sha1[20];
355 send_request(fd[1], &req_buf);
356 while (packet_read_line(fd[0], line, sizeof(line))) {
357 if (!prefixcmp(line, "shallow ")) {
358 if (get_sha1_hex(line + 8, sha1))
359 die("invalid shallow line: %s", line);
360 register_shallow(sha1);
361 continue;
363 if (!prefixcmp(line, "unshallow ")) {
364 if (get_sha1_hex(line + 10, sha1))
365 die("invalid unshallow line: %s", line);
366 if (!lookup_object(sha1))
367 die("object not found: %s", line);
368 /* make sure that it is parsed as shallow */
369 if (!parse_object(sha1))
370 die("error in object: %s", line);
371 if (unregister_shallow(sha1))
372 die("no shallow found: %s", line);
373 continue;
375 die("expected shallow/unshallow, got %s", line);
377 } else if (!args.stateless_rpc)
378 send_request(fd[1], &req_buf);
380 if (!args.stateless_rpc) {
381 /* If we aren't using the stateless-rpc interface
382 * we don't need to retain the headers.
384 strbuf_setlen(&req_buf, 0);
385 state_len = 0;
388 flushes = 0;
389 retval = -1;
390 while ((sha1 = get_rev())) {
391 packet_buf_write(&req_buf, "have %s\n", sha1_to_hex(sha1));
392 if (args.verbose)
393 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
394 in_vain++;
395 if (flush_at <= ++count) {
396 int ack;
398 packet_buf_flush(&req_buf);
399 send_request(fd[1], &req_buf);
400 strbuf_setlen(&req_buf, state_len);
401 flushes++;
402 flush_at = next_flush(count);
405 * We keep one window "ahead" of the other side, and
406 * will wait for an ACK only on the next one
408 if (!args.stateless_rpc && count == INITIAL_FLUSH)
409 continue;
411 consume_shallow_list(fd[0]);
412 do {
413 ack = get_ack(fd[0], result_sha1);
414 if (args.verbose && ack)
415 fprintf(stderr, "got ack %d %s\n", ack,
416 sha1_to_hex(result_sha1));
417 switch (ack) {
418 case ACK:
419 flushes = 0;
420 multi_ack = 0;
421 retval = 0;
422 goto done;
423 case ACK_common:
424 case ACK_ready:
425 case ACK_continue: {
426 struct commit *commit =
427 lookup_commit(result_sha1);
428 if (!commit)
429 die("invalid commit %s", sha1_to_hex(result_sha1));
430 if (args.stateless_rpc
431 && ack == ACK_common
432 && !(commit->object.flags & COMMON)) {
433 /* We need to replay the have for this object
434 * on the next RPC request so the peer knows
435 * it is in common with us.
437 const char *hex = sha1_to_hex(result_sha1);
438 packet_buf_write(&req_buf, "have %s\n", hex);
439 state_len = req_buf.len;
441 mark_common(commit, 0, 1);
442 retval = 0;
443 in_vain = 0;
444 got_continue = 1;
445 if (ack == ACK_ready) {
446 rev_list = NULL;
447 got_ready = 1;
449 break;
452 } while (ack);
453 flushes--;
454 if (got_continue && MAX_IN_VAIN < in_vain) {
455 if (args.verbose)
456 fprintf(stderr, "giving up\n");
457 break; /* give up */
461 done:
462 if (!got_ready || !no_done) {
463 packet_buf_write(&req_buf, "done\n");
464 send_request(fd[1], &req_buf);
466 if (args.verbose)
467 fprintf(stderr, "done\n");
468 if (retval != 0) {
469 multi_ack = 0;
470 flushes++;
472 strbuf_release(&req_buf);
474 consume_shallow_list(fd[0]);
475 while (flushes || multi_ack) {
476 int ack = get_ack(fd[0], result_sha1);
477 if (ack) {
478 if (args.verbose)
479 fprintf(stderr, "got ack (%d) %s\n", ack,
480 sha1_to_hex(result_sha1));
481 if (ack == ACK)
482 return 0;
483 multi_ack = 1;
484 continue;
486 flushes--;
488 /* it is no error to fetch into a completely empty repo */
489 return count ? retval : 0;
492 static struct commit_list *complete;
494 static int mark_complete(const char *path, const unsigned char *sha1, int flag, void *cb_data)
496 struct object *o = parse_object(sha1);
498 while (o && o->type == OBJ_TAG) {
499 struct tag *t = (struct tag *) o;
500 if (!t->tagged)
501 break; /* broken repository */
502 o->flags |= COMPLETE;
503 o = parse_object(t->tagged->sha1);
505 if (o && o->type == OBJ_COMMIT) {
506 struct commit *commit = (struct commit *)o;
507 if (!(commit->object.flags & COMPLETE)) {
508 commit->object.flags |= COMPLETE;
509 commit_list_insert_by_date(commit, &complete);
512 return 0;
515 static void mark_recent_complete_commits(unsigned long cutoff)
517 while (complete && cutoff <= complete->item->date) {
518 if (args.verbose)
519 fprintf(stderr, "Marking %s as complete\n",
520 sha1_to_hex(complete->item->object.sha1));
521 pop_most_recent_commit(&complete, COMPLETE);
525 static void filter_refs(struct ref **refs, int nr_match, char **match)
527 struct ref **return_refs;
528 struct ref *newlist = NULL;
529 struct ref **newtail = &newlist;
530 struct ref *ref, *next;
531 struct ref *fastarray[32];
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);
541 else
542 return_refs = NULL;
544 for (ref = *refs; ref; ref = next) {
545 next = ref->next;
546 if (!memcmp(ref->name, "refs/", 5) &&
547 check_ref_format(ref->name + 5))
548 ; /* trash */
549 else if (args.fetch_all &&
550 (!args.depth || prefixcmp(ref->name, "refs/tags/") )) {
551 *newtail = ref;
552 ref->next = NULL;
553 newtail = &ref->next;
554 continue;
556 else {
557 int order = path_match(ref->name, nr_match, match);
558 if (order) {
559 return_refs[order-1] = ref;
560 continue; /* we will link it later */
563 free(ref);
566 if (!args.fetch_all) {
567 int i;
568 for (i = 0; i < nr_match; i++) {
569 ref = return_refs[i];
570 if (ref) {
571 *newtail = ref;
572 ref->next = NULL;
573 newtail = &ref->next;
576 if (return_refs != fastarray)
577 free(return_refs);
579 *refs = newlist;
582 static int everything_local(struct ref **refs, int nr_match, char **match)
584 struct ref *ref;
585 int retval;
586 unsigned long cutoff = 0;
588 save_commit_buffer = 0;
590 for (ref = *refs; ref; ref = ref->next) {
591 struct object *o;
593 o = parse_object(ref->old_sha1);
594 if (!o)
595 continue;
597 /* We already have it -- which may mean that we were
598 * in sync with the other side at some time after
599 * that (it is OK if we guess wrong here).
601 if (o->type == OBJ_COMMIT) {
602 struct commit *commit = (struct commit *)o;
603 if (!cutoff || cutoff < commit->date)
604 cutoff = commit->date;
608 if (!args.depth) {
609 for_each_ref(mark_complete, NULL);
610 if (cutoff)
611 mark_recent_complete_commits(cutoff);
615 * Mark all complete remote refs as common refs.
616 * Don't mark them common yet; the server has to be told so first.
618 for (ref = *refs; ref; ref = ref->next) {
619 struct object *o = deref_tag(lookup_object(ref->old_sha1),
620 NULL, 0);
622 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
623 continue;
625 if (!(o->flags & SEEN)) {
626 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
628 mark_common((struct commit *)o, 1, 1);
632 filter_refs(refs, nr_match, match);
634 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
635 const unsigned char *remote = ref->old_sha1;
636 unsigned char local[20];
637 struct object *o;
639 o = lookup_object(remote);
640 if (!o || !(o->flags & COMPLETE)) {
641 retval = 0;
642 if (!args.verbose)
643 continue;
644 fprintf(stderr,
645 "want %s (%s)\n", sha1_to_hex(remote),
646 ref->name);
647 continue;
650 hashcpy(ref->new_sha1, local);
651 if (!args.verbose)
652 continue;
653 fprintf(stderr,
654 "already have %s (%s)\n", sha1_to_hex(remote),
655 ref->name);
657 return retval;
660 static int sideband_demux(int in, int out, void *data)
662 int *xd = data;
664 int ret = recv_sideband("fetch-pack", xd[0], out);
665 close(out);
666 return ret;
669 static int get_pack(int xd[2], char **pack_lockfile)
671 struct async demux;
672 const char *argv[20];
673 char keep_arg[256];
674 char hdr_arg[256];
675 const char **av;
676 int do_keep = args.keep_pack;
677 struct child_process cmd;
679 memset(&demux, 0, sizeof(demux));
680 if (use_sideband) {
681 /* xd[] is talking with upload-pack; subprocess reads from
682 * xd[0], spits out band#2 to stderr, and feeds us band#1
683 * through demux->out.
685 demux.proc = sideband_demux;
686 demux.data = xd;
687 demux.out = -1;
688 if (start_async(&demux))
689 die("fetch-pack: unable to fork off sideband"
690 " demultiplexer");
692 else
693 demux.out = xd[0];
695 memset(&cmd, 0, sizeof(cmd));
696 cmd.argv = argv;
697 av = argv;
698 *hdr_arg = 0;
699 if (!args.keep_pack && unpack_limit) {
700 struct pack_header header;
702 if (read_pack_header(demux.out, &header))
703 die("protocol error: bad pack header");
704 snprintf(hdr_arg, sizeof(hdr_arg),
705 "--pack_header=%"PRIu32",%"PRIu32,
706 ntohl(header.hdr_version), ntohl(header.hdr_entries));
707 if (ntohl(header.hdr_entries) < unpack_limit)
708 do_keep = 0;
709 else
710 do_keep = 1;
713 if (do_keep) {
714 if (pack_lockfile)
715 cmd.out = -1;
716 *av++ = "index-pack";
717 *av++ = "--stdin";
718 if (!args.quiet && !args.no_progress)
719 *av++ = "-v";
720 if (args.use_thin_pack)
721 *av++ = "--fix-thin";
722 if (args.lock_pack || unpack_limit) {
723 int s = sprintf(keep_arg,
724 "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
725 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
726 strcpy(keep_arg + s, "localhost");
727 *av++ = keep_arg;
730 else {
731 *av++ = "unpack-objects";
732 if (args.quiet)
733 *av++ = "-q";
735 if (*hdr_arg)
736 *av++ = hdr_arg;
737 *av++ = NULL;
739 cmd.in = demux.out;
740 cmd.git_cmd = 1;
741 if (start_command(&cmd))
742 die("fetch-pack: unable to fork off %s", argv[0]);
743 if (do_keep && pack_lockfile) {
744 *pack_lockfile = index_pack_lockfile(cmd.out);
745 close(cmd.out);
748 if (finish_command(&cmd))
749 die("%s failed", argv[0]);
750 if (use_sideband && finish_async(&demux))
751 die("error in sideband demultiplexer");
752 return 0;
755 static struct ref *do_fetch_pack(int fd[2],
756 const struct ref *orig_ref,
757 int nr_match,
758 char **match,
759 char **pack_lockfile)
761 struct ref *ref = copy_ref_list(orig_ref);
762 unsigned char sha1[20];
764 if (is_repository_shallow() && !server_supports("shallow"))
765 die("Server does not support shallow clients");
766 if (server_supports("multi_ack_detailed")) {
767 if (args.verbose)
768 fprintf(stderr, "Server supports multi_ack_detailed\n");
769 multi_ack = 2;
770 if (server_supports("no-done")) {
771 if (args.verbose)
772 fprintf(stderr, "Server supports no-done\n");
773 if (args.stateless_rpc)
774 no_done = 1;
777 else if (server_supports("multi_ack")) {
778 if (args.verbose)
779 fprintf(stderr, "Server supports multi_ack\n");
780 multi_ack = 1;
782 if (server_supports("side-band-64k")) {
783 if (args.verbose)
784 fprintf(stderr, "Server supports side-band-64k\n");
785 use_sideband = 2;
787 else if (server_supports("side-band")) {
788 if (args.verbose)
789 fprintf(stderr, "Server supports side-band\n");
790 use_sideband = 1;
792 if (server_supports("ofs-delta")) {
793 if (args.verbose)
794 fprintf(stderr, "Server supports ofs-delta\n");
795 } else
796 prefer_ofs_delta = 0;
797 if (everything_local(&ref, nr_match, match)) {
798 packet_flush(fd[1]);
799 goto all_done;
801 if (find_common(fd, sha1, ref) < 0)
802 if (!args.keep_pack)
803 /* When cloning, it is not unusual to have
804 * no common commit.
806 warning("no common commits");
808 if (args.stateless_rpc)
809 packet_flush(fd[1]);
810 if (get_pack(fd, pack_lockfile))
811 die("git fetch-pack: fetch failed.");
813 all_done:
814 return ref;
817 static int remove_duplicates(int nr_heads, char **heads)
819 int src, dst;
821 for (src = dst = 0; src < nr_heads; src++) {
822 /* If heads[src] is different from any of
823 * heads[0..dst], push it in.
825 int i;
826 for (i = 0; i < dst; i++) {
827 if (!strcmp(heads[i], heads[src]))
828 break;
830 if (i < dst)
831 continue;
832 if (src != dst)
833 heads[dst] = heads[src];
834 dst++;
836 return dst;
839 static int fetch_pack_config(const char *var, const char *value, void *cb)
841 if (strcmp(var, "fetch.unpacklimit") == 0) {
842 fetch_unpack_limit = git_config_int(var, value);
843 return 0;
846 if (strcmp(var, "transfer.unpacklimit") == 0) {
847 transfer_unpack_limit = git_config_int(var, value);
848 return 0;
851 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
852 prefer_ofs_delta = git_config_bool(var, value);
853 return 0;
856 return git_default_config(var, value, cb);
859 static struct lock_file lock;
861 static void fetch_pack_setup(void)
863 static int did_setup;
864 if (did_setup)
865 return;
866 git_config(fetch_pack_config, NULL);
867 if (0 <= transfer_unpack_limit)
868 unpack_limit = transfer_unpack_limit;
869 else if (0 <= fetch_unpack_limit)
870 unpack_limit = fetch_unpack_limit;
871 did_setup = 1;
874 int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
876 int i, ret, nr_heads;
877 struct ref *ref = NULL;
878 char *dest = NULL, **heads;
879 int fd[2];
880 char *pack_lockfile = NULL;
881 char **pack_lockfile_ptr = NULL;
882 struct child_process *conn;
884 packet_trace_identity("fetch-pack");
886 nr_heads = 0;
887 heads = NULL;
888 for (i = 1; i < argc; i++) {
889 const char *arg = argv[i];
891 if (*arg == '-') {
892 if (!prefixcmp(arg, "--upload-pack=")) {
893 args.uploadpack = arg + 14;
894 continue;
896 if (!prefixcmp(arg, "--exec=")) {
897 args.uploadpack = arg + 7;
898 continue;
900 if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
901 args.quiet = 1;
902 continue;
904 if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
905 args.lock_pack = args.keep_pack;
906 args.keep_pack = 1;
907 continue;
909 if (!strcmp("--thin", arg)) {
910 args.use_thin_pack = 1;
911 continue;
913 if (!strcmp("--include-tag", arg)) {
914 args.include_tag = 1;
915 continue;
917 if (!strcmp("--all", arg)) {
918 args.fetch_all = 1;
919 continue;
921 if (!strcmp("-v", arg)) {
922 args.verbose = 1;
923 continue;
925 if (!prefixcmp(arg, "--depth=")) {
926 args.depth = strtol(arg + 8, NULL, 0);
927 continue;
929 if (!strcmp("--no-progress", arg)) {
930 args.no_progress = 1;
931 continue;
933 if (!strcmp("--stateless-rpc", arg)) {
934 args.stateless_rpc = 1;
935 continue;
937 if (!strcmp("--lock-pack", arg)) {
938 args.lock_pack = 1;
939 pack_lockfile_ptr = &pack_lockfile;
940 continue;
942 usage(fetch_pack_usage);
944 dest = (char *)arg;
945 heads = (char **)(argv + i + 1);
946 nr_heads = argc - i - 1;
947 break;
949 if (!dest)
950 usage(fetch_pack_usage);
952 if (args.stateless_rpc) {
953 conn = NULL;
954 fd[0] = 0;
955 fd[1] = 1;
956 } else {
957 conn = git_connect(fd, (char *)dest, args.uploadpack,
958 args.verbose ? CONNECT_VERBOSE : 0);
961 get_remote_heads(fd[0], &ref, 0, NULL, 0, NULL);
963 ref = fetch_pack(&args, fd, conn, ref, dest,
964 nr_heads, heads, pack_lockfile_ptr);
965 if (pack_lockfile) {
966 printf("lock %s\n", pack_lockfile);
967 fflush(stdout);
969 close(fd[0]);
970 close(fd[1]);
971 if (finish_connect(conn))
972 ref = NULL;
973 ret = !ref;
975 if (!ret && nr_heads) {
976 /* If the heads to pull were given, we should have
977 * consumed all of them by matching the remote.
978 * Otherwise, 'git fetch remote no-such-ref' would
979 * silently succeed without issuing an error.
981 for (i = 0; i < nr_heads; i++)
982 if (heads[i] && heads[i][0]) {
983 error("no such remote ref %s", heads[i]);
984 ret = 1;
987 while (ref) {
988 printf("%s %s\n",
989 sha1_to_hex(ref->old_sha1), ref->name);
990 ref = ref->next;
993 return ret;
996 struct ref *fetch_pack(struct fetch_pack_args *my_args,
997 int fd[], struct child_process *conn,
998 const struct ref *ref,
999 const char *dest,
1000 int nr_heads,
1001 char **heads,
1002 char **pack_lockfile)
1004 struct stat st;
1005 struct ref *ref_cpy;
1007 fetch_pack_setup();
1008 if (&args != my_args)
1009 memcpy(&args, my_args, sizeof(args));
1010 if (args.depth > 0) {
1011 if (stat(git_path("shallow"), &st))
1012 st.st_mtime = 0;
1015 if (heads && nr_heads)
1016 nr_heads = remove_duplicates(nr_heads, heads);
1017 if (!ref) {
1018 packet_flush(fd[1]);
1019 die("no matching remote head");
1021 ref_cpy = do_fetch_pack(fd, ref, nr_heads, heads, pack_lockfile);
1023 if (args.depth > 0) {
1024 struct cache_time mtime;
1025 struct strbuf sb = STRBUF_INIT;
1026 char *shallow = git_path("shallow");
1027 int fd;
1029 mtime.sec = st.st_mtime;
1030 mtime.nsec = ST_MTIME_NSEC(st);
1031 if (stat(shallow, &st)) {
1032 if (mtime.sec)
1033 die("shallow file was removed during fetch");
1034 } else if (st.st_mtime != mtime.sec
1035 #ifdef USE_NSEC
1036 || ST_MTIME_NSEC(st) != mtime.nsec
1037 #endif
1039 die("shallow file was changed during fetch");
1041 fd = hold_lock_file_for_update(&lock, shallow,
1042 LOCK_DIE_ON_ERROR);
1043 if (!write_shallow_commits(&sb, 0)
1044 || write_in_full(fd, sb.buf, sb.len) != sb.len) {
1045 unlink_or_warn(shallow);
1046 rollback_lock_file(&lock);
1047 } else {
1048 commit_lock_file(&lock);
1050 strbuf_release(&sb);
1053 reprepare_packed_git();
1054 return ref_cpy;