xdiff/xpatience: factor out fall-back-diff function
[git/debian.git] / builtin / fetch-pack.c
blob436798410210b868cfbe439a1603b0a340a32c50
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 static enum ack_type get_ack(int fd, unsigned char *result_sha1)
190 static char line[1000];
191 int len = packet_read_line(fd, line, sizeof(line));
193 if (!len)
194 die("git fetch-pack: expected ACK/NAK, got EOF");
195 if (line[len-1] == '\n')
196 line[--len] = 0;
197 if (!strcmp(line, "NAK"))
198 return NAK;
199 if (!prefixcmp(line, "ACK ")) {
200 if (!get_sha1_hex(line+4, result_sha1)) {
201 if (strstr(line+45, "continue"))
202 return ACK_continue;
203 if (strstr(line+45, "common"))
204 return ACK_common;
205 if (strstr(line+45, "ready"))
206 return ACK_ready;
207 return ACK;
210 die("git fetch_pack: expected ACK/NAK, got '%s'", line);
213 static void send_request(int fd, struct strbuf *buf)
215 if (args.stateless_rpc) {
216 send_sideband(fd, -1, buf->buf, buf->len, LARGE_PACKET_MAX);
217 packet_flush(fd);
218 } else
219 safe_write(fd, buf->buf, buf->len);
222 static void insert_one_alternate_ref(const struct ref *ref, void *unused)
224 rev_list_insert_ref(NULL, ref->old_sha1, 0, NULL);
227 static void insert_alternate_refs(void)
229 for_each_alternate_ref(insert_one_alternate_ref, NULL);
232 #define INITIAL_FLUSH 16
233 #define PIPESAFE_FLUSH 32
234 #define LARGE_FLUSH 1024
236 static int next_flush(int count)
238 int flush_limit = args.stateless_rpc ? LARGE_FLUSH : PIPESAFE_FLUSH;
240 if (count < flush_limit)
241 count <<= 1;
242 else
243 count += flush_limit;
244 return count;
247 static int find_common(int fd[2], unsigned char *result_sha1,
248 struct ref *refs)
250 int fetching;
251 int count = 0, flushes = 0, flush_at = INITIAL_FLUSH, retval;
252 const unsigned char *sha1;
253 unsigned in_vain = 0;
254 int got_continue = 0;
255 int got_ready = 0;
256 struct strbuf req_buf = STRBUF_INIT;
257 size_t state_len = 0;
259 if (args.stateless_rpc && multi_ack == 1)
260 die("--stateless-rpc requires multi_ack_detailed");
261 if (marked)
262 for_each_ref(clear_marks, NULL);
263 marked = 1;
265 for_each_ref(rev_list_insert_ref, NULL);
266 insert_alternate_refs();
268 fetching = 0;
269 for ( ; refs ; refs = refs->next) {
270 unsigned char *remote = refs->old_sha1;
271 const char *remote_hex;
272 struct object *o;
275 * If that object is complete (i.e. it is an ancestor of a
276 * local ref), we tell them we have it but do not have to
277 * tell them about its ancestors, which they already know
278 * about.
280 * We use lookup_object here because we are only
281 * interested in the case we *know* the object is
282 * reachable and we have already scanned it.
284 if (((o = lookup_object(remote)) != NULL) &&
285 (o->flags & COMPLETE)) {
286 continue;
289 remote_hex = sha1_to_hex(remote);
290 if (!fetching) {
291 struct strbuf c = STRBUF_INIT;
292 if (multi_ack == 2) strbuf_addstr(&c, " multi_ack_detailed");
293 if (multi_ack == 1) strbuf_addstr(&c, " multi_ack");
294 if (no_done) strbuf_addstr(&c, " no-done");
295 if (use_sideband == 2) strbuf_addstr(&c, " side-band-64k");
296 if (use_sideband == 1) strbuf_addstr(&c, " side-band");
297 if (args.use_thin_pack) strbuf_addstr(&c, " thin-pack");
298 if (args.no_progress) strbuf_addstr(&c, " no-progress");
299 if (args.include_tag) strbuf_addstr(&c, " include-tag");
300 if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta");
301 packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
302 strbuf_release(&c);
303 } else
304 packet_buf_write(&req_buf, "want %s\n", remote_hex);
305 fetching++;
308 if (!fetching) {
309 strbuf_release(&req_buf);
310 packet_flush(fd[1]);
311 return 1;
314 if (is_repository_shallow())
315 write_shallow_commits(&req_buf, 1);
316 if (args.depth > 0)
317 packet_buf_write(&req_buf, "deepen %d", args.depth);
318 packet_buf_flush(&req_buf);
319 state_len = req_buf.len;
321 if (args.depth > 0) {
322 char line[1024];
323 unsigned char sha1[20];
325 send_request(fd[1], &req_buf);
326 while (packet_read_line(fd[0], line, sizeof(line))) {
327 if (!prefixcmp(line, "shallow ")) {
328 if (get_sha1_hex(line + 8, sha1))
329 die("invalid shallow line: %s", line);
330 register_shallow(sha1);
331 continue;
333 if (!prefixcmp(line, "unshallow ")) {
334 if (get_sha1_hex(line + 10, sha1))
335 die("invalid unshallow line: %s", line);
336 if (!lookup_object(sha1))
337 die("object not found: %s", line);
338 /* make sure that it is parsed as shallow */
339 if (!parse_object(sha1))
340 die("error in object: %s", line);
341 if (unregister_shallow(sha1))
342 die("no shallow found: %s", line);
343 continue;
345 die("expected shallow/unshallow, got %s", line);
347 } else if (!args.stateless_rpc)
348 send_request(fd[1], &req_buf);
350 if (!args.stateless_rpc) {
351 /* If we aren't using the stateless-rpc interface
352 * we don't need to retain the headers.
354 strbuf_setlen(&req_buf, 0);
355 state_len = 0;
358 flushes = 0;
359 retval = -1;
360 while ((sha1 = get_rev())) {
361 packet_buf_write(&req_buf, "have %s\n", sha1_to_hex(sha1));
362 if (args.verbose)
363 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
364 in_vain++;
365 if (flush_at <= ++count) {
366 int ack;
368 packet_buf_flush(&req_buf);
369 send_request(fd[1], &req_buf);
370 strbuf_setlen(&req_buf, state_len);
371 flushes++;
372 flush_at = next_flush(count);
375 * We keep one window "ahead" of the other side, and
376 * will wait for an ACK only on the next one
378 if (!args.stateless_rpc && count == INITIAL_FLUSH)
379 continue;
381 consume_shallow_list(fd[0]);
382 do {
383 ack = get_ack(fd[0], result_sha1);
384 if (args.verbose && ack)
385 fprintf(stderr, "got ack %d %s\n", ack,
386 sha1_to_hex(result_sha1));
387 switch (ack) {
388 case ACK:
389 flushes = 0;
390 multi_ack = 0;
391 retval = 0;
392 goto done;
393 case ACK_common:
394 case ACK_ready:
395 case ACK_continue: {
396 struct commit *commit =
397 lookup_commit(result_sha1);
398 if (args.stateless_rpc
399 && ack == ACK_common
400 && !(commit->object.flags & COMMON)) {
401 /* We need to replay the have for this object
402 * on the next RPC request so the peer knows
403 * it is in common with us.
405 const char *hex = sha1_to_hex(result_sha1);
406 packet_buf_write(&req_buf, "have %s\n", hex);
407 state_len = req_buf.len;
409 mark_common(commit, 0, 1);
410 retval = 0;
411 in_vain = 0;
412 got_continue = 1;
413 if (ack == ACK_ready) {
414 rev_list = NULL;
415 got_ready = 1;
417 break;
420 } while (ack);
421 flushes--;
422 if (got_continue && MAX_IN_VAIN < in_vain) {
423 if (args.verbose)
424 fprintf(stderr, "giving up\n");
425 break; /* give up */
429 done:
430 if (!got_ready || !no_done) {
431 packet_buf_write(&req_buf, "done\n");
432 send_request(fd[1], &req_buf);
434 if (args.verbose)
435 fprintf(stderr, "done\n");
436 if (retval != 0) {
437 multi_ack = 0;
438 flushes++;
440 strbuf_release(&req_buf);
442 consume_shallow_list(fd[0]);
443 while (flushes || multi_ack) {
444 int ack = get_ack(fd[0], result_sha1);
445 if (ack) {
446 if (args.verbose)
447 fprintf(stderr, "got ack (%d) %s\n", ack,
448 sha1_to_hex(result_sha1));
449 if (ack == ACK)
450 return 0;
451 multi_ack = 1;
452 continue;
454 flushes--;
456 /* it is no error to fetch into a completely empty repo */
457 return count ? retval : 0;
460 static struct commit_list *complete;
462 static int mark_complete(const char *path, const unsigned char *sha1, int flag, void *cb_data)
464 struct object *o = parse_object(sha1);
466 while (o && o->type == OBJ_TAG) {
467 struct tag *t = (struct tag *) o;
468 if (!t->tagged)
469 break; /* broken repository */
470 o->flags |= COMPLETE;
471 o = parse_object(t->tagged->sha1);
473 if (o && o->type == OBJ_COMMIT) {
474 struct commit *commit = (struct commit *)o;
475 if (!(commit->object.flags & COMPLETE)) {
476 commit->object.flags |= COMPLETE;
477 commit_list_insert_by_date(commit, &complete);
480 return 0;
483 static void mark_recent_complete_commits(unsigned long cutoff)
485 while (complete && cutoff <= complete->item->date) {
486 if (args.verbose)
487 fprintf(stderr, "Marking %s as complete\n",
488 sha1_to_hex(complete->item->object.sha1));
489 pop_most_recent_commit(&complete, COMPLETE);
493 static void filter_refs(struct ref **refs, int nr_match, char **match)
495 struct ref **return_refs;
496 struct ref *newlist = NULL;
497 struct ref **newtail = &newlist;
498 struct ref *ref, *next;
499 struct ref *fastarray[32];
501 if (nr_match && !args.fetch_all) {
502 if (ARRAY_SIZE(fastarray) < nr_match)
503 return_refs = xcalloc(nr_match, sizeof(struct ref *));
504 else {
505 return_refs = fastarray;
506 memset(return_refs, 0, sizeof(struct ref *) * nr_match);
509 else
510 return_refs = NULL;
512 for (ref = *refs; ref; ref = next) {
513 next = ref->next;
514 if (!memcmp(ref->name, "refs/", 5) &&
515 check_ref_format(ref->name + 5))
516 ; /* trash */
517 else if (args.fetch_all &&
518 (!args.depth || prefixcmp(ref->name, "refs/tags/") )) {
519 *newtail = ref;
520 ref->next = NULL;
521 newtail = &ref->next;
522 continue;
524 else {
525 int order = path_match(ref->name, nr_match, match);
526 if (order) {
527 return_refs[order-1] = ref;
528 continue; /* we will link it later */
531 free(ref);
534 if (!args.fetch_all) {
535 int i;
536 for (i = 0; i < nr_match; i++) {
537 ref = return_refs[i];
538 if (ref) {
539 *newtail = ref;
540 ref->next = NULL;
541 newtail = &ref->next;
544 if (return_refs != fastarray)
545 free(return_refs);
547 *refs = newlist;
550 static int everything_local(struct ref **refs, int nr_match, char **match)
552 struct ref *ref;
553 int retval;
554 unsigned long cutoff = 0;
556 save_commit_buffer = 0;
558 for (ref = *refs; ref; ref = ref->next) {
559 struct object *o;
561 o = parse_object(ref->old_sha1);
562 if (!o)
563 continue;
565 /* We already have it -- which may mean that we were
566 * in sync with the other side at some time after
567 * that (it is OK if we guess wrong here).
569 if (o->type == OBJ_COMMIT) {
570 struct commit *commit = (struct commit *)o;
571 if (!cutoff || cutoff < commit->date)
572 cutoff = commit->date;
576 if (!args.depth) {
577 for_each_ref(mark_complete, NULL);
578 if (cutoff)
579 mark_recent_complete_commits(cutoff);
583 * Mark all complete remote refs as common refs.
584 * Don't mark them common yet; the server has to be told so first.
586 for (ref = *refs; ref; ref = ref->next) {
587 struct object *o = deref_tag(lookup_object(ref->old_sha1),
588 NULL, 0);
590 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
591 continue;
593 if (!(o->flags & SEEN)) {
594 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
596 mark_common((struct commit *)o, 1, 1);
600 filter_refs(refs, nr_match, match);
602 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
603 const unsigned char *remote = ref->old_sha1;
604 unsigned char local[20];
605 struct object *o;
607 o = lookup_object(remote);
608 if (!o || !(o->flags & COMPLETE)) {
609 retval = 0;
610 if (!args.verbose)
611 continue;
612 fprintf(stderr,
613 "want %s (%s)\n", sha1_to_hex(remote),
614 ref->name);
615 continue;
618 hashcpy(ref->new_sha1, local);
619 if (!args.verbose)
620 continue;
621 fprintf(stderr,
622 "already have %s (%s)\n", sha1_to_hex(remote),
623 ref->name);
625 return retval;
628 static int sideband_demux(int in, int out, void *data)
630 int *xd = data;
632 int ret = recv_sideband("fetch-pack", xd[0], out);
633 close(out);
634 return ret;
637 static int get_pack(int xd[2], char **pack_lockfile)
639 struct async demux;
640 const char *argv[20];
641 char keep_arg[256];
642 char hdr_arg[256];
643 const char **av;
644 int do_keep = args.keep_pack;
645 struct child_process cmd;
647 memset(&demux, 0, sizeof(demux));
648 if (use_sideband) {
649 /* xd[] is talking with upload-pack; subprocess reads from
650 * xd[0], spits out band#2 to stderr, and feeds us band#1
651 * through demux->out.
653 demux.proc = sideband_demux;
654 demux.data = xd;
655 demux.out = -1;
656 if (start_async(&demux))
657 die("fetch-pack: unable to fork off sideband"
658 " demultiplexer");
660 else
661 demux.out = xd[0];
663 memset(&cmd, 0, sizeof(cmd));
664 cmd.argv = argv;
665 av = argv;
666 *hdr_arg = 0;
667 if (!args.keep_pack && unpack_limit) {
668 struct pack_header header;
670 if (read_pack_header(demux.out, &header))
671 die("protocol error: bad pack header");
672 snprintf(hdr_arg, sizeof(hdr_arg),
673 "--pack_header=%"PRIu32",%"PRIu32,
674 ntohl(header.hdr_version), ntohl(header.hdr_entries));
675 if (ntohl(header.hdr_entries) < unpack_limit)
676 do_keep = 0;
677 else
678 do_keep = 1;
681 if (do_keep) {
682 if (pack_lockfile)
683 cmd.out = -1;
684 *av++ = "index-pack";
685 *av++ = "--stdin";
686 if (!args.quiet && !args.no_progress)
687 *av++ = "-v";
688 if (args.use_thin_pack)
689 *av++ = "--fix-thin";
690 if (args.lock_pack || unpack_limit) {
691 int s = sprintf(keep_arg,
692 "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
693 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
694 strcpy(keep_arg + s, "localhost");
695 *av++ = keep_arg;
698 else {
699 *av++ = "unpack-objects";
700 if (args.quiet)
701 *av++ = "-q";
703 if (*hdr_arg)
704 *av++ = hdr_arg;
705 *av++ = NULL;
707 cmd.in = demux.out;
708 cmd.git_cmd = 1;
709 if (start_command(&cmd))
710 die("fetch-pack: unable to fork off %s", argv[0]);
711 if (do_keep && pack_lockfile) {
712 *pack_lockfile = index_pack_lockfile(cmd.out);
713 close(cmd.out);
716 if (finish_command(&cmd))
717 die("%s failed", argv[0]);
718 if (use_sideband && finish_async(&demux))
719 die("error in sideband demultiplexer");
720 return 0;
723 static struct ref *do_fetch_pack(int fd[2],
724 const struct ref *orig_ref,
725 int nr_match,
726 char **match,
727 char **pack_lockfile)
729 struct ref *ref = copy_ref_list(orig_ref);
730 unsigned char sha1[20];
732 if (is_repository_shallow() && !server_supports("shallow"))
733 die("Server does not support shallow clients");
734 if (server_supports("multi_ack_detailed")) {
735 if (args.verbose)
736 fprintf(stderr, "Server supports multi_ack_detailed\n");
737 multi_ack = 2;
738 if (server_supports("no-done")) {
739 if (args.verbose)
740 fprintf(stderr, "Server supports no-done\n");
741 if (args.stateless_rpc)
742 no_done = 1;
745 else if (server_supports("multi_ack")) {
746 if (args.verbose)
747 fprintf(stderr, "Server supports multi_ack\n");
748 multi_ack = 1;
750 if (server_supports("side-band-64k")) {
751 if (args.verbose)
752 fprintf(stderr, "Server supports side-band-64k\n");
753 use_sideband = 2;
755 else if (server_supports("side-band")) {
756 if (args.verbose)
757 fprintf(stderr, "Server supports side-band\n");
758 use_sideband = 1;
760 if (server_supports("ofs-delta")) {
761 if (args.verbose)
762 fprintf(stderr, "Server supports ofs-delta\n");
763 } else
764 prefer_ofs_delta = 0;
765 if (everything_local(&ref, nr_match, match)) {
766 packet_flush(fd[1]);
767 goto all_done;
769 if (find_common(fd, sha1, ref) < 0)
770 if (!args.keep_pack)
771 /* When cloning, it is not unusual to have
772 * no common commit.
774 warning("no common commits");
776 if (args.stateless_rpc)
777 packet_flush(fd[1]);
778 if (get_pack(fd, pack_lockfile))
779 die("git fetch-pack: fetch failed.");
781 all_done:
782 return ref;
785 static int remove_duplicates(int nr_heads, char **heads)
787 int src, dst;
789 for (src = dst = 0; src < nr_heads; src++) {
790 /* If heads[src] is different from any of
791 * heads[0..dst], push it in.
793 int i;
794 for (i = 0; i < dst; i++) {
795 if (!strcmp(heads[i], heads[src]))
796 break;
798 if (i < dst)
799 continue;
800 if (src != dst)
801 heads[dst] = heads[src];
802 dst++;
804 return dst;
807 static int fetch_pack_config(const char *var, const char *value, void *cb)
809 if (strcmp(var, "fetch.unpacklimit") == 0) {
810 fetch_unpack_limit = git_config_int(var, value);
811 return 0;
814 if (strcmp(var, "transfer.unpacklimit") == 0) {
815 transfer_unpack_limit = git_config_int(var, value);
816 return 0;
819 if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
820 prefer_ofs_delta = git_config_bool(var, value);
821 return 0;
824 return git_default_config(var, value, cb);
827 static struct lock_file lock;
829 static void fetch_pack_setup(void)
831 static int did_setup;
832 if (did_setup)
833 return;
834 git_config(fetch_pack_config, NULL);
835 if (0 <= transfer_unpack_limit)
836 unpack_limit = transfer_unpack_limit;
837 else if (0 <= fetch_unpack_limit)
838 unpack_limit = fetch_unpack_limit;
839 did_setup = 1;
842 int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
844 int i, ret, nr_heads;
845 struct ref *ref = NULL;
846 char *dest = NULL, **heads;
847 int fd[2];
848 char *pack_lockfile = NULL;
849 char **pack_lockfile_ptr = NULL;
850 struct child_process *conn;
852 packet_trace_identity("fetch-pack");
854 nr_heads = 0;
855 heads = NULL;
856 for (i = 1; i < argc; i++) {
857 const char *arg = argv[i];
859 if (*arg == '-') {
860 if (!prefixcmp(arg, "--upload-pack=")) {
861 args.uploadpack = arg + 14;
862 continue;
864 if (!prefixcmp(arg, "--exec=")) {
865 args.uploadpack = arg + 7;
866 continue;
868 if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
869 args.quiet = 1;
870 continue;
872 if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
873 args.lock_pack = args.keep_pack;
874 args.keep_pack = 1;
875 continue;
877 if (!strcmp("--thin", arg)) {
878 args.use_thin_pack = 1;
879 continue;
881 if (!strcmp("--include-tag", arg)) {
882 args.include_tag = 1;
883 continue;
885 if (!strcmp("--all", arg)) {
886 args.fetch_all = 1;
887 continue;
889 if (!strcmp("-v", arg)) {
890 args.verbose = 1;
891 continue;
893 if (!prefixcmp(arg, "--depth=")) {
894 args.depth = strtol(arg + 8, NULL, 0);
895 continue;
897 if (!strcmp("--no-progress", arg)) {
898 args.no_progress = 1;
899 continue;
901 if (!strcmp("--stateless-rpc", arg)) {
902 args.stateless_rpc = 1;
903 continue;
905 if (!strcmp("--lock-pack", arg)) {
906 args.lock_pack = 1;
907 pack_lockfile_ptr = &pack_lockfile;
908 continue;
910 usage(fetch_pack_usage);
912 dest = (char *)arg;
913 heads = (char **)(argv + i + 1);
914 nr_heads = argc - i - 1;
915 break;
917 if (!dest)
918 usage(fetch_pack_usage);
920 if (args.stateless_rpc) {
921 conn = NULL;
922 fd[0] = 0;
923 fd[1] = 1;
924 } else {
925 conn = git_connect(fd, (char *)dest, args.uploadpack,
926 args.verbose ? CONNECT_VERBOSE : 0);
929 get_remote_heads(fd[0], &ref, 0, NULL, 0, NULL);
931 ref = fetch_pack(&args, fd, conn, ref, dest,
932 nr_heads, heads, pack_lockfile_ptr);
933 if (pack_lockfile) {
934 printf("lock %s\n", pack_lockfile);
935 fflush(stdout);
937 close(fd[0]);
938 close(fd[1]);
939 if (finish_connect(conn))
940 ref = NULL;
941 ret = !ref;
943 if (!ret && nr_heads) {
944 /* If the heads to pull were given, we should have
945 * consumed all of them by matching the remote.
946 * Otherwise, 'git fetch remote no-such-ref' would
947 * silently succeed without issuing an error.
949 for (i = 0; i < nr_heads; i++)
950 if (heads[i] && heads[i][0]) {
951 error("no such remote ref %s", heads[i]);
952 ret = 1;
955 while (ref) {
956 printf("%s %s\n",
957 sha1_to_hex(ref->old_sha1), ref->name);
958 ref = ref->next;
961 return ret;
964 struct ref *fetch_pack(struct fetch_pack_args *my_args,
965 int fd[], struct child_process *conn,
966 const struct ref *ref,
967 const char *dest,
968 int nr_heads,
969 char **heads,
970 char **pack_lockfile)
972 struct stat st;
973 struct ref *ref_cpy;
975 fetch_pack_setup();
976 if (&args != my_args)
977 memcpy(&args, my_args, sizeof(args));
978 if (args.depth > 0) {
979 if (stat(git_path("shallow"), &st))
980 st.st_mtime = 0;
983 if (heads && nr_heads)
984 nr_heads = remove_duplicates(nr_heads, heads);
985 if (!ref) {
986 packet_flush(fd[1]);
987 die("no matching remote head");
989 ref_cpy = do_fetch_pack(fd, ref, nr_heads, heads, pack_lockfile);
991 if (args.depth > 0) {
992 struct cache_time mtime;
993 struct strbuf sb = STRBUF_INIT;
994 char *shallow = git_path("shallow");
995 int fd;
997 mtime.sec = st.st_mtime;
998 mtime.nsec = ST_MTIME_NSEC(st);
999 if (stat(shallow, &st)) {
1000 if (mtime.sec)
1001 die("shallow file was removed during fetch");
1002 } else if (st.st_mtime != mtime.sec
1003 #ifdef USE_NSEC
1004 || ST_MTIME_NSEC(st) != mtime.nsec
1005 #endif
1007 die("shallow file was changed during fetch");
1009 fd = hold_lock_file_for_update(&lock, shallow,
1010 LOCK_DIE_ON_ERROR);
1011 if (!write_shallow_commits(&sb, 0)
1012 || write_in_full(fd, sb.buf, sb.len) != sb.len) {
1013 unlink_or_warn(shallow);
1014 rollback_lock_file(&lock);
1015 } else {
1016 commit_lock_file(&lock);
1018 strbuf_release(&sb);
1021 reprepare_packed_git();
1022 return ref_cpy;