fetch-pack: use smaller handshake window for initial request
[git.git] / builtin / fetch-pack.c
blob3c2c9406c499102138495638d98797886855c073
1 #include "cache.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"
13 static int transfer_unpack_limit = -1;
14 static int fetch_unpack_limit = -1;
15 static int unpack_limit = 100;
16 static int prefer_ofs_delta = 1;
17 static int no_done = 0;
18 static struct fetch_pack_args args = {
19 /* .uploadpack = */ "git-upload-pack",
22 static const char fetch_pack_usage[] =
23 "git fetch-pack [--all] [--quiet|-q] [--keep|-k] [--thin] [--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] [-v] [<host>:]<directory> [<refs>...]";
25 #define COMPLETE (1U << 0)
26 #define COMMON (1U << 1)
27 #define COMMON_REF (1U << 2)
28 #define SEEN (1U << 3)
29 #define POPPED (1U << 4)
31 static int marked;
34 * After sending this many "have"s if we do not get any new ACK , we
35 * give up traversing our history.
37 #define MAX_IN_VAIN 256
39 static struct commit_list *rev_list;
40 static int non_common_revs, multi_ack, use_sideband;
42 static void rev_list_push(struct commit *commit, int mark)
44 if (!(commit->object.flags & mark)) {
45 commit->object.flags |= mark;
47 if (!(commit->object.parsed))
48 if (parse_commit(commit))
49 return;
51 commit_list_insert_by_date(commit, &rev_list);
53 if (!(commit->object.flags & COMMON))
54 non_common_revs++;
58 static int rev_list_insert_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
60 struct object *o = deref_tag(parse_object(sha1), path, 0);
62 if (o && o->type == OBJ_COMMIT)
63 rev_list_push((struct commit *)o, SEEN);
65 return 0;
68 static int clear_marks(const char *path, const unsigned char *sha1, int flag, void *cb_data)
70 struct object *o = deref_tag(parse_object(sha1), path, 0);
72 if (o && o->type == OBJ_COMMIT)
73 clear_commit_marks((struct commit *)o,
74 COMMON | COMMON_REF | SEEN | POPPED);
75 return 0;
79 This function marks a rev and its ancestors as common.
80 In some cases, it is desirable to mark only the ancestors (for example
81 when only the server does not yet know that they are common).
84 static void mark_common(struct commit *commit,
85 int ancestors_only, int dont_parse)
87 if (commit != NULL && !(commit->object.flags & COMMON)) {
88 struct object *o = (struct object *)commit;
90 if (!ancestors_only)
91 o->flags |= COMMON;
93 if (!(o->flags & SEEN))
94 rev_list_push(commit, SEEN);
95 else {
96 struct commit_list *parents;
98 if (!ancestors_only && !(o->flags & POPPED))
99 non_common_revs--;
100 if (!o->parsed && !dont_parse)
101 if (parse_commit(commit))
102 return;
104 for (parents = commit->parents;
105 parents;
106 parents = parents->next)
107 mark_common(parents->item, 0, dont_parse);
113 Get the next rev to send, ignoring the common.
116 static const unsigned char *get_rev(void)
118 struct commit *commit = NULL;
120 while (commit == NULL) {
121 unsigned int mark;
122 struct commit_list *parents;
124 if (rev_list == NULL || non_common_revs == 0)
125 return NULL;
127 commit = rev_list->item;
128 if (!commit->object.parsed)
129 parse_commit(commit);
130 parents = commit->parents;
132 commit->object.flags |= POPPED;
133 if (!(commit->object.flags & COMMON))
134 non_common_revs--;
136 if (commit->object.flags & COMMON) {
137 /* do not send "have", and ignore ancestors */
138 commit = NULL;
139 mark = COMMON | SEEN;
140 } else if (commit->object.flags & COMMON_REF)
141 /* send "have", and ignore ancestors */
142 mark = COMMON | SEEN;
143 else
144 /* send "have", also for its ancestors */
145 mark = SEEN;
147 while (parents) {
148 if (!(parents->item->object.flags & SEEN))
149 rev_list_push(parents->item, mark);
150 if (mark & COMMON)
151 mark_common(parents->item, 1, 0);
152 parents = parents->next;
155 rev_list = rev_list->next;
158 return commit->object.sha1;
161 enum ack_type {
162 NAK = 0,
163 ACK,
164 ACK_continue,
165 ACK_common,
166 ACK_ready
169 static void consume_shallow_list(int fd)
171 if (args.stateless_rpc && args.depth > 0) {
172 /* If we sent a depth we will get back "duplicate"
173 * shallow and unshallow commands every time there
174 * is a block of have lines exchanged.
176 char line[1000];
177 while (packet_read_line(fd, line, sizeof(line))) {
178 if (!prefixcmp(line, "shallow "))
179 continue;
180 if (!prefixcmp(line, "unshallow "))
181 continue;
182 die("git fetch-pack: expected shallow list");
187 static enum ack_type get_ack(int fd, unsigned char *result_sha1)
189 static char line[1000];
190 int len = packet_read_line(fd, line, sizeof(line));
192 if (!len)
193 die("git fetch-pack: expected ACK/NAK, got EOF");
194 if (line[len-1] == '\n')
195 line[--len] = 0;
196 if (!strcmp(line, "NAK"))
197 return NAK;
198 if (!prefixcmp(line, "ACK ")) {
199 if (!get_sha1_hex(line+4, result_sha1)) {
200 if (strstr(line+45, "continue"))
201 return ACK_continue;
202 if (strstr(line+45, "common"))
203 return ACK_common;
204 if (strstr(line+45, "ready"))
205 return ACK_ready;
206 return ACK;
209 die("git fetch_pack: expected ACK/NAK, got '%s'", line);
212 static void send_request(int fd, struct strbuf *buf)
214 if (args.stateless_rpc) {
215 send_sideband(fd, -1, buf->buf, buf->len, LARGE_PACKET_MAX);
216 packet_flush(fd);
217 } else
218 safe_write(fd, buf->buf, buf->len);
221 #define INITIAL_FLUSH 16
222 #define LARGE_FLUSH 1024
224 static int next_flush(int count)
226 if (count < INITIAL_FLUSH * 2)
227 count += INITIAL_FLUSH;
228 else if (count < LARGE_FLUSH)
229 count <<= 1;
230 else
231 count += LARGE_FLUSH;
232 return count;
235 static int find_common(int fd[2], unsigned char *result_sha1,
236 struct ref *refs)
238 int fetching;
239 int count = 0, flushes = 0, flush_at = INITIAL_FLUSH, retval;
240 const unsigned char *sha1;
241 unsigned in_vain = 0;
242 int got_continue = 0;
243 int got_ready = 0;
244 struct strbuf req_buf = STRBUF_INIT;
245 size_t state_len = 0;
247 if (args.stateless_rpc && multi_ack == 1)
248 die("--stateless-rpc requires multi_ack_detailed");
249 if (marked)
250 for_each_ref(clear_marks, NULL);
251 marked = 1;
253 for_each_ref(rev_list_insert_ref, NULL);
255 fetching = 0;
256 for ( ; refs ; refs = refs->next) {
257 unsigned char *remote = refs->old_sha1;
258 const char *remote_hex;
259 struct object *o;
262 * If that object is complete (i.e. it is an ancestor of a
263 * local ref), we tell them we have it but do not have to
264 * tell them about its ancestors, which they already know
265 * about.
267 * We use lookup_object here because we are only
268 * interested in the case we *know* the object is
269 * reachable and we have already scanned it.
271 if (((o = lookup_object(remote)) != NULL) &&
272 (o->flags & COMPLETE)) {
273 continue;
276 remote_hex = sha1_to_hex(remote);
277 if (!fetching) {
278 struct strbuf c = STRBUF_INIT;
279 if (multi_ack == 2) strbuf_addstr(&c, " multi_ack_detailed");
280 if (multi_ack == 1) strbuf_addstr(&c, " multi_ack");
281 if (no_done) strbuf_addstr(&c, " no-done");
282 if (use_sideband == 2) strbuf_addstr(&c, " side-band-64k");
283 if (use_sideband == 1) strbuf_addstr(&c, " side-band");
284 if (args.use_thin_pack) strbuf_addstr(&c, " thin-pack");
285 if (args.no_progress) strbuf_addstr(&c, " no-progress");
286 if (args.include_tag) strbuf_addstr(&c, " include-tag");
287 if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta");
288 packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
289 strbuf_release(&c);
290 } else
291 packet_buf_write(&req_buf, "want %s\n", remote_hex);
292 fetching++;
295 if (!fetching) {
296 strbuf_release(&req_buf);
297 packet_flush(fd[1]);
298 return 1;
301 if (is_repository_shallow())
302 write_shallow_commits(&req_buf, 1);
303 if (args.depth > 0)
304 packet_buf_write(&req_buf, "deepen %d", args.depth);
305 packet_buf_flush(&req_buf);
306 state_len = req_buf.len;
308 if (args.depth > 0) {
309 char line[1024];
310 unsigned char sha1[20];
312 send_request(fd[1], &req_buf);
313 while (packet_read_line(fd[0], line, sizeof(line))) {
314 if (!prefixcmp(line, "shallow ")) {
315 if (get_sha1_hex(line + 8, sha1))
316 die("invalid shallow line: %s", line);
317 register_shallow(sha1);
318 continue;
320 if (!prefixcmp(line, "unshallow ")) {
321 if (get_sha1_hex(line + 10, sha1))
322 die("invalid unshallow line: %s", line);
323 if (!lookup_object(sha1))
324 die("object not found: %s", line);
325 /* make sure that it is parsed as shallow */
326 if (!parse_object(sha1))
327 die("error in object: %s", line);
328 if (unregister_shallow(sha1))
329 die("no shallow found: %s", line);
330 continue;
332 die("expected shallow/unshallow, got %s", line);
334 } else if (!args.stateless_rpc)
335 send_request(fd[1], &req_buf);
337 if (!args.stateless_rpc) {
338 /* If we aren't using the stateless-rpc interface
339 * we don't need to retain the headers.
341 strbuf_setlen(&req_buf, 0);
342 state_len = 0;
345 flushes = 0;
346 retval = -1;
347 while ((sha1 = get_rev())) {
348 packet_buf_write(&req_buf, "have %s\n", sha1_to_hex(sha1));
349 if (args.verbose)
350 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
351 in_vain++;
352 if (flush_at <= ++count) {
353 int ack;
355 packet_buf_flush(&req_buf);
356 send_request(fd[1], &req_buf);
357 strbuf_setlen(&req_buf, state_len);
358 flushes++;
359 flush_at = next_flush(count);
362 * We keep one window "ahead" of the other side, and
363 * will wait for an ACK only on the next one
365 if (!args.stateless_rpc && count == INITIAL_FLUSH)
366 continue;
368 consume_shallow_list(fd[0]);
369 do {
370 ack = get_ack(fd[0], result_sha1);
371 if (args.verbose && ack)
372 fprintf(stderr, "got ack %d %s\n", ack,
373 sha1_to_hex(result_sha1));
374 switch (ack) {
375 case ACK:
376 flushes = 0;
377 multi_ack = 0;
378 retval = 0;
379 goto done;
380 case ACK_common:
381 case ACK_ready:
382 case ACK_continue: {
383 struct commit *commit =
384 lookup_commit(result_sha1);
385 if (args.stateless_rpc
386 && ack == ACK_common
387 && !(commit->object.flags & COMMON)) {
388 /* We need to replay the have for this object
389 * on the next RPC request so the peer knows
390 * it is in common with us.
392 const char *hex = sha1_to_hex(result_sha1);
393 packet_buf_write(&req_buf, "have %s\n", hex);
394 state_len = req_buf.len;
396 mark_common(commit, 0, 1);
397 retval = 0;
398 in_vain = 0;
399 got_continue = 1;
400 if (ack == ACK_ready) {
401 rev_list = NULL;
402 got_ready = 1;
404 break;
407 } while (ack);
408 flushes--;
409 if (got_continue && MAX_IN_VAIN < in_vain) {
410 if (args.verbose)
411 fprintf(stderr, "giving up\n");
412 break; /* give up */
416 done:
417 if (!got_ready || !no_done) {
418 packet_buf_write(&req_buf, "done\n");
419 send_request(fd[1], &req_buf);
421 if (args.verbose)
422 fprintf(stderr, "done\n");
423 if (retval != 0) {
424 multi_ack = 0;
425 flushes++;
427 strbuf_release(&req_buf);
429 consume_shallow_list(fd[0]);
430 while (flushes || multi_ack) {
431 int ack = get_ack(fd[0], result_sha1);
432 if (ack) {
433 if (args.verbose)
434 fprintf(stderr, "got ack (%d) %s\n", ack,
435 sha1_to_hex(result_sha1));
436 if (ack == ACK)
437 return 0;
438 multi_ack = 1;
439 continue;
441 flushes--;
443 /* it is no error to fetch into a completely empty repo */
444 return count ? retval : 0;
447 static struct commit_list *complete;
449 static int mark_complete(const char *path, const unsigned char *sha1, int flag, void *cb_data)
451 struct object *o = parse_object(sha1);
453 while (o && o->type == OBJ_TAG) {
454 struct tag *t = (struct tag *) o;
455 if (!t->tagged)
456 break; /* broken repository */
457 o->flags |= COMPLETE;
458 o = parse_object(t->tagged->sha1);
460 if (o && o->type == OBJ_COMMIT) {
461 struct commit *commit = (struct commit *)o;
462 commit->object.flags |= COMPLETE;
463 commit_list_insert_by_date(commit, &complete);
465 return 0;
468 static void mark_recent_complete_commits(unsigned long cutoff)
470 while (complete && cutoff <= complete->item->date) {
471 if (args.verbose)
472 fprintf(stderr, "Marking %s as complete\n",
473 sha1_to_hex(complete->item->object.sha1));
474 pop_most_recent_commit(&complete, COMPLETE);
478 static void filter_refs(struct ref **refs, int nr_match, char **match)
480 struct ref **return_refs;
481 struct ref *newlist = NULL;
482 struct ref **newtail = &newlist;
483 struct ref *ref, *next;
484 struct ref *fastarray[32];
486 if (nr_match && !args.fetch_all) {
487 if (ARRAY_SIZE(fastarray) < nr_match)
488 return_refs = xcalloc(nr_match, sizeof(struct ref *));
489 else {
490 return_refs = fastarray;
491 memset(return_refs, 0, sizeof(struct ref *) * nr_match);
494 else
495 return_refs = NULL;
497 for (ref = *refs; ref; ref = next) {
498 next = ref->next;
499 if (!memcmp(ref->name, "refs/", 5) &&
500 check_ref_format(ref->name + 5))
501 ; /* trash */
502 else if (args.fetch_all &&
503 (!args.depth || prefixcmp(ref->name, "refs/tags/") )) {
504 *newtail = ref;
505 ref->next = NULL;
506 newtail = &ref->next;
507 continue;
509 else {
510 int order = path_match(ref->name, nr_match, match);
511 if (order) {
512 return_refs[order-1] = ref;
513 continue; /* we will link it later */
516 free(ref);
519 if (!args.fetch_all) {
520 int i;
521 for (i = 0; i < nr_match; i++) {
522 ref = return_refs[i];
523 if (ref) {
524 *newtail = ref;
525 ref->next = NULL;
526 newtail = &ref->next;
529 if (return_refs != fastarray)
530 free(return_refs);
532 *refs = newlist;
535 static int everything_local(struct ref **refs, int nr_match, char **match)
537 struct ref *ref;
538 int retval;
539 unsigned long cutoff = 0;
541 save_commit_buffer = 0;
543 for (ref = *refs; ref; ref = ref->next) {
544 struct object *o;
546 o = parse_object(ref->old_sha1);
547 if (!o)
548 continue;
550 /* We already have it -- which may mean that we were
551 * in sync with the other side at some time after
552 * that (it is OK if we guess wrong here).
554 if (o->type == OBJ_COMMIT) {
555 struct commit *commit = (struct commit *)o;
556 if (!cutoff || cutoff < commit->date)
557 cutoff = commit->date;
561 if (!args.depth) {
562 for_each_ref(mark_complete, NULL);
563 if (cutoff)
564 mark_recent_complete_commits(cutoff);
568 * Mark all complete remote refs as common refs.
569 * Don't mark them common yet; the server has to be told so first.
571 for (ref = *refs; ref; ref = ref->next) {
572 struct object *o = deref_tag(lookup_object(ref->old_sha1),
573 NULL, 0);
575 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
576 continue;
578 if (!(o->flags & SEEN)) {
579 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
581 mark_common((struct commit *)o, 1, 1);
585 filter_refs(refs, nr_match, match);
587 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
588 const unsigned char *remote = ref->old_sha1;
589 unsigned char local[20];
590 struct object *o;
592 o = lookup_object(remote);
593 if (!o || !(o->flags & COMPLETE)) {
594 retval = 0;
595 if (!args.verbose)
596 continue;
597 fprintf(stderr,
598 "want %s (%s)\n", sha1_to_hex(remote),
599 ref->name);
600 continue;
603 hashcpy(ref->new_sha1, local);
604 if (!args.verbose)
605 continue;
606 fprintf(stderr,
607 "already have %s (%s)\n", sha1_to_hex(remote),
608 ref->name);
610 return retval;
613 static int sideband_demux(int in, int out, void *data)
615 int *xd = data;
617 int ret = recv_sideband("fetch-pack", xd[0], out);
618 close(out);
619 return ret;
622 static int get_pack(int xd[2], char **pack_lockfile)
624 struct async demux;
625 const char *argv[20];
626 char keep_arg[256];
627 char hdr_arg[256];
628 const char **av;
629 int do_keep = args.keep_pack;
630 struct child_process cmd;
632 memset(&demux, 0, sizeof(demux));
633 if (use_sideband) {
634 /* xd[] is talking with upload-pack; subprocess reads from
635 * xd[0], spits out band#2 to stderr, and feeds us band#1
636 * through demux->out.
638 demux.proc = sideband_demux;
639 demux.data = xd;
640 demux.out = -1;
641 if (start_async(&demux))
642 die("fetch-pack: unable to fork off sideband"
643 " demultiplexer");
645 else
646 demux.out = xd[0];
648 memset(&cmd, 0, sizeof(cmd));
649 cmd.argv = argv;
650 av = argv;
651 *hdr_arg = 0;
652 if (!args.keep_pack && unpack_limit) {
653 struct pack_header header;
655 if (read_pack_header(demux.out, &header))
656 die("protocol error: bad pack header");
657 snprintf(hdr_arg, sizeof(hdr_arg),
658 "--pack_header=%"PRIu32",%"PRIu32,
659 ntohl(header.hdr_version), ntohl(header.hdr_entries));
660 if (ntohl(header.hdr_entries) < unpack_limit)
661 do_keep = 0;
662 else
663 do_keep = 1;
666 if (do_keep) {
667 if (pack_lockfile)
668 cmd.out = -1;
669 *av++ = "index-pack";
670 *av++ = "--stdin";
671 if (!args.quiet && !args.no_progress)
672 *av++ = "-v";
673 if (args.use_thin_pack)
674 *av++ = "--fix-thin";
675 if (args.lock_pack || unpack_limit) {
676 int s = sprintf(keep_arg,
677 "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
678 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
679 strcpy(keep_arg + s, "localhost");
680 *av++ = keep_arg;
683 else {
684 *av++ = "unpack-objects";
685 if (args.quiet)
686 *av++ = "-q";
688 if (*hdr_arg)
689 *av++ = hdr_arg;
690 *av++ = NULL;
692 cmd.in = demux.out;
693 cmd.git_cmd = 1;
694 if (start_command(&cmd))
695 die("fetch-pack: unable to fork off %s", argv[0]);
696 if (do_keep && pack_lockfile) {
697 *pack_lockfile = index_pack_lockfile(cmd.out);
698 close(cmd.out);
701 if (finish_command(&cmd))
702 die("%s failed", argv[0]);
703 if (use_sideband && finish_async(&demux))
704 die("error in sideband demultiplexer");
705 return 0;
708 static struct ref *do_fetch_pack(int fd[2],
709 const struct ref *orig_ref,
710 int nr_match,
711 char **match,
712 char **pack_lockfile)
714 struct ref *ref = copy_ref_list(orig_ref);
715 unsigned char sha1[20];
717 if (is_repository_shallow() && !server_supports("shallow"))
718 die("Server does not support shallow clients");
719 if (server_supports("multi_ack_detailed")) {
720 if (args.verbose)
721 fprintf(stderr, "Server supports multi_ack_detailed\n");
722 multi_ack = 2;
723 if (server_supports("no-done")) {
724 if (args.verbose)
725 fprintf(stderr, "Server supports no-done\n");
726 no_done = 1;
729 else if (server_supports("multi_ack")) {
730 if (args.verbose)
731 fprintf(stderr, "Server supports multi_ack\n");
732 multi_ack = 1;
734 if (server_supports("side-band-64k")) {
735 if (args.verbose)
736 fprintf(stderr, "Server supports side-band-64k\n");
737 use_sideband = 2;
739 else if (server_supports("side-band")) {
740 if (args.verbose)
741 fprintf(stderr, "Server supports side-band\n");
742 use_sideband = 1;
744 if (server_supports("ofs-delta")) {
745 if (args.verbose)
746 fprintf(stderr, "Server supports ofs-delta\n");
747 } else
748 prefer_ofs_delta = 0;
749 if (everything_local(&ref, nr_match, match)) {
750 packet_flush(fd[1]);
751 goto all_done;
753 if (find_common(fd, sha1, ref) < 0)
754 if (!args.keep_pack)
755 /* When cloning, it is not unusual to have
756 * no common commit.
758 warning("no common commits");
760 if (args.stateless_rpc)
761 packet_flush(fd[1]);
762 if (get_pack(fd, pack_lockfile))
763 die("git fetch-pack: fetch failed.");
765 all_done:
766 return ref;
769 static int remove_duplicates(int nr_heads, char **heads)
771 int src, dst;
773 for (src = dst = 0; src < nr_heads; src++) {
774 /* If heads[src] is different from any of
775 * heads[0..dst], push it in.
777 int i;
778 for (i = 0; i < dst; i++) {
779 if (!strcmp(heads[i], heads[src]))
780 break;
782 if (i < dst)
783 continue;
784 if (src != dst)
785 heads[dst] = heads[src];
786 dst++;
788 return dst;
791 static int fetch_pack_config(const char *var, const char *value, void *cb)
793 if (strcmp(var, "fetch.unpacklimit") == 0) {
794 fetch_unpack_limit = git_config_int(var, value);
795 return 0;
798 if (strcmp(var, "transfer.unpacklimit") == 0) {
799 transfer_unpack_limit = git_config_int(var, value);
800 return 0;
803 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
804 prefer_ofs_delta = git_config_bool(var, value);
805 return 0;
808 return git_default_config(var, value, cb);
811 static struct lock_file lock;
813 static void fetch_pack_setup(void)
815 static int did_setup;
816 if (did_setup)
817 return;
818 git_config(fetch_pack_config, NULL);
819 if (0 <= transfer_unpack_limit)
820 unpack_limit = transfer_unpack_limit;
821 else if (0 <= fetch_unpack_limit)
822 unpack_limit = fetch_unpack_limit;
823 did_setup = 1;
826 int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
828 int i, ret, nr_heads;
829 struct ref *ref = NULL;
830 char *dest = NULL, **heads;
831 int fd[2];
832 char *pack_lockfile = NULL;
833 char **pack_lockfile_ptr = NULL;
834 struct child_process *conn;
836 nr_heads = 0;
837 heads = NULL;
838 for (i = 1; i < argc; i++) {
839 const char *arg = argv[i];
841 if (*arg == '-') {
842 if (!prefixcmp(arg, "--upload-pack=")) {
843 args.uploadpack = arg + 14;
844 continue;
846 if (!prefixcmp(arg, "--exec=")) {
847 args.uploadpack = arg + 7;
848 continue;
850 if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
851 args.quiet = 1;
852 continue;
854 if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
855 args.lock_pack = args.keep_pack;
856 args.keep_pack = 1;
857 continue;
859 if (!strcmp("--thin", arg)) {
860 args.use_thin_pack = 1;
861 continue;
863 if (!strcmp("--include-tag", arg)) {
864 args.include_tag = 1;
865 continue;
867 if (!strcmp("--all", arg)) {
868 args.fetch_all = 1;
869 continue;
871 if (!strcmp("-v", arg)) {
872 args.verbose = 1;
873 continue;
875 if (!prefixcmp(arg, "--depth=")) {
876 args.depth = strtol(arg + 8, NULL, 0);
877 continue;
879 if (!strcmp("--no-progress", arg)) {
880 args.no_progress = 1;
881 continue;
883 if (!strcmp("--stateless-rpc", arg)) {
884 args.stateless_rpc = 1;
885 continue;
887 if (!strcmp("--lock-pack", arg)) {
888 args.lock_pack = 1;
889 pack_lockfile_ptr = &pack_lockfile;
890 continue;
892 usage(fetch_pack_usage);
894 dest = (char *)arg;
895 heads = (char **)(argv + i + 1);
896 nr_heads = argc - i - 1;
897 break;
899 if (!dest)
900 usage(fetch_pack_usage);
902 if (args.stateless_rpc) {
903 conn = NULL;
904 fd[0] = 0;
905 fd[1] = 1;
906 } else {
907 conn = git_connect(fd, (char *)dest, args.uploadpack,
908 args.verbose ? CONNECT_VERBOSE : 0);
911 get_remote_heads(fd[0], &ref, 0, NULL, 0, NULL);
913 ref = fetch_pack(&args, fd, conn, ref, dest,
914 nr_heads, heads, pack_lockfile_ptr);
915 if (pack_lockfile) {
916 printf("lock %s\n", pack_lockfile);
917 fflush(stdout);
919 close(fd[0]);
920 close(fd[1]);
921 if (finish_connect(conn))
922 ref = NULL;
923 ret = !ref;
925 if (!ret && nr_heads) {
926 /* If the heads to pull were given, we should have
927 * consumed all of them by matching the remote.
928 * Otherwise, 'git fetch remote no-such-ref' would
929 * silently succeed without issuing an error.
931 for (i = 0; i < nr_heads; i++)
932 if (heads[i] && heads[i][0]) {
933 error("no such remote ref %s", heads[i]);
934 ret = 1;
937 while (ref) {
938 printf("%s %s\n",
939 sha1_to_hex(ref->old_sha1), ref->name);
940 ref = ref->next;
943 return ret;
946 struct ref *fetch_pack(struct fetch_pack_args *my_args,
947 int fd[], struct child_process *conn,
948 const struct ref *ref,
949 const char *dest,
950 int nr_heads,
951 char **heads,
952 char **pack_lockfile)
954 struct stat st;
955 struct ref *ref_cpy;
957 fetch_pack_setup();
958 if (&args != my_args)
959 memcpy(&args, my_args, sizeof(args));
960 if (args.depth > 0) {
961 if (stat(git_path("shallow"), &st))
962 st.st_mtime = 0;
965 if (heads && nr_heads)
966 nr_heads = remove_duplicates(nr_heads, heads);
967 if (!ref) {
968 packet_flush(fd[1]);
969 die("no matching remote head");
971 ref_cpy = do_fetch_pack(fd, ref, nr_heads, heads, pack_lockfile);
973 if (args.depth > 0) {
974 struct cache_time mtime;
975 struct strbuf sb = STRBUF_INIT;
976 char *shallow = git_path("shallow");
977 int fd;
979 mtime.sec = st.st_mtime;
980 mtime.nsec = ST_MTIME_NSEC(st);
981 if (stat(shallow, &st)) {
982 if (mtime.sec)
983 die("shallow file was removed during fetch");
984 } else if (st.st_mtime != mtime.sec
985 #ifdef USE_NSEC
986 || ST_MTIME_NSEC(st) != mtime.nsec
987 #endif
989 die("shallow file was changed during fetch");
991 fd = hold_lock_file_for_update(&lock, shallow,
992 LOCK_DIE_ON_ERROR);
993 if (!write_shallow_commits(&sb, 0)
994 || write_in_full(fd, sb.buf, sb.len) != sb.len) {
995 unlink_or_warn(shallow);
996 rollback_lock_file(&lock);
997 } else {
998 commit_lock_file(&lock);
1000 strbuf_release(&sb);
1003 reprepare_packed_git();
1004 return ref_cpy;