Code

fetch-pack: progressively use larger handshake windows
[git.git] / builtin / fetch-pack.c
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",
20 };
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;
33 /*
34  * After sending this many "have"s if we do not get any new ACK , we
35  * give up traversing our history.
36  */
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)
43 {
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++;
55         }
56 }
58 static int rev_list_insert_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
59 {
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;
66 }
68 static int clear_marks(const char *path, const unsigned char *sha1, int flag, void *cb_data)
69 {
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;
76 }
78 /*
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).
82 */
84 static void mark_common(struct commit *commit,
85                 int ancestors_only, int dont_parse)
86 {
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);
108                 }
109         }
112 /*
113   Get the next rev to send, ignoring the common.
114 */
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;
153                 }
155                 rev_list = rev_list->next;
156         }
158         return commit->object.sha1;
161 enum ack_type {
162         NAK = 0,
163         ACK,
164         ACK_continue,
165         ACK_common,
166         ACK_ready
167 };
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.
175                  */
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");
183                 }
184         }
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;
207                 }
208         }
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 32
222 #define LARGE_FLUSH 1024
224 static int next_flush(int count)
226         if (count < LARGE_FLUSH)
227                 count <<= 1;
228         else
229                 count += LARGE_FLUSH;
230         return count;
233 static int find_common(int fd[2], unsigned char *result_sha1,
234                        struct ref *refs)
236         int fetching;
237         int count = 0, flushes = 0, flush_at = INITIAL_FLUSH, retval;
238         const unsigned char *sha1;
239         unsigned in_vain = 0;
240         int got_continue = 0;
241         int got_ready = 0;
242         struct strbuf req_buf = STRBUF_INIT;
243         size_t state_len = 0;
245         if (args.stateless_rpc && multi_ack == 1)
246                 die("--stateless-rpc requires multi_ack_detailed");
247         if (marked)
248                 for_each_ref(clear_marks, NULL);
249         marked = 1;
251         for_each_ref(rev_list_insert_ref, NULL);
253         fetching = 0;
254         for ( ; refs ; refs = refs->next) {
255                 unsigned char *remote = refs->old_sha1;
256                 const char *remote_hex;
257                 struct object *o;
259                 /*
260                  * If that object is complete (i.e. it is an ancestor of a
261                  * local ref), we tell them we have it but do not have to
262                  * tell them about its ancestors, which they already know
263                  * about.
264                  *
265                  * We use lookup_object here because we are only
266                  * interested in the case we *know* the object is
267                  * reachable and we have already scanned it.
268                  */
269                 if (((o = lookup_object(remote)) != NULL) &&
270                                 (o->flags & COMPLETE)) {
271                         continue;
272                 }
274                 remote_hex = sha1_to_hex(remote);
275                 if (!fetching) {
276                         struct strbuf c = STRBUF_INIT;
277                         if (multi_ack == 2)     strbuf_addstr(&c, " multi_ack_detailed");
278                         if (multi_ack == 1)     strbuf_addstr(&c, " multi_ack");
279                         if (no_done)            strbuf_addstr(&c, " no-done");
280                         if (use_sideband == 2)  strbuf_addstr(&c, " side-band-64k");
281                         if (use_sideband == 1)  strbuf_addstr(&c, " side-band");
282                         if (args.use_thin_pack) strbuf_addstr(&c, " thin-pack");
283                         if (args.no_progress)   strbuf_addstr(&c, " no-progress");
284                         if (args.include_tag)   strbuf_addstr(&c, " include-tag");
285                         if (prefer_ofs_delta)   strbuf_addstr(&c, " ofs-delta");
286                         packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
287                         strbuf_release(&c);
288                 } else
289                         packet_buf_write(&req_buf, "want %s\n", remote_hex);
290                 fetching++;
291         }
293         if (!fetching) {
294                 strbuf_release(&req_buf);
295                 packet_flush(fd[1]);
296                 return 1;
297         }
299         if (is_repository_shallow())
300                 write_shallow_commits(&req_buf, 1);
301         if (args.depth > 0)
302                 packet_buf_write(&req_buf, "deepen %d", args.depth);
303         packet_buf_flush(&req_buf);
304         state_len = req_buf.len;
306         if (args.depth > 0) {
307                 char line[1024];
308                 unsigned char sha1[20];
310                 send_request(fd[1], &req_buf);
311                 while (packet_read_line(fd[0], line, sizeof(line))) {
312                         if (!prefixcmp(line, "shallow ")) {
313                                 if (get_sha1_hex(line + 8, sha1))
314                                         die("invalid shallow line: %s", line);
315                                 register_shallow(sha1);
316                                 continue;
317                         }
318                         if (!prefixcmp(line, "unshallow ")) {
319                                 if (get_sha1_hex(line + 10, sha1))
320                                         die("invalid unshallow line: %s", line);
321                                 if (!lookup_object(sha1))
322                                         die("object not found: %s", line);
323                                 /* make sure that it is parsed as shallow */
324                                 if (!parse_object(sha1))
325                                         die("error in object: %s", line);
326                                 if (unregister_shallow(sha1))
327                                         die("no shallow found: %s", line);
328                                 continue;
329                         }
330                         die("expected shallow/unshallow, got %s", line);
331                 }
332         } else if (!args.stateless_rpc)
333                 send_request(fd[1], &req_buf);
335         if (!args.stateless_rpc) {
336                 /* If we aren't using the stateless-rpc interface
337                  * we don't need to retain the headers.
338                  */
339                 strbuf_setlen(&req_buf, 0);
340                 state_len = 0;
341         }
343         flushes = 0;
344         retval = -1;
345         while ((sha1 = get_rev())) {
346                 packet_buf_write(&req_buf, "have %s\n", sha1_to_hex(sha1));
347                 if (args.verbose)
348                         fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
349                 in_vain++;
350                 if (flush_at <= ++count) {
351                         int ack;
353                         packet_buf_flush(&req_buf);
354                         send_request(fd[1], &req_buf);
355                         strbuf_setlen(&req_buf, state_len);
356                         flushes++;
357                         flush_at = next_flush(count);
359                         /*
360                          * We keep one window "ahead" of the other side, and
361                          * will wait for an ACK only on the next one
362                          */
363                         if (!args.stateless_rpc && count == INITIAL_FLUSH)
364                                 continue;
366                         consume_shallow_list(fd[0]);
367                         do {
368                                 ack = get_ack(fd[0], result_sha1);
369                                 if (args.verbose && ack)
370                                         fprintf(stderr, "got ack %d %s\n", ack,
371                                                         sha1_to_hex(result_sha1));
372                                 switch (ack) {
373                                 case ACK:
374                                         flushes = 0;
375                                         multi_ack = 0;
376                                         retval = 0;
377                                         goto done;
378                                 case ACK_common:
379                                 case ACK_ready:
380                                 case ACK_continue: {
381                                         struct commit *commit =
382                                                 lookup_commit(result_sha1);
383                                         if (args.stateless_rpc
384                                          && ack == ACK_common
385                                          && !(commit->object.flags & COMMON)) {
386                                                 /* We need to replay the have for this object
387                                                  * on the next RPC request so the peer knows
388                                                  * it is in common with us.
389                                                  */
390                                                 const char *hex = sha1_to_hex(result_sha1);
391                                                 packet_buf_write(&req_buf, "have %s\n", hex);
392                                                 state_len = req_buf.len;
393                                         }
394                                         mark_common(commit, 0, 1);
395                                         retval = 0;
396                                         in_vain = 0;
397                                         got_continue = 1;
398                                         if (ack == ACK_ready) {
399                                                 rev_list = NULL;
400                                                 got_ready = 1;
401                                         }
402                                         break;
403                                         }
404                                 }
405                         } while (ack);
406                         flushes--;
407                         if (got_continue && MAX_IN_VAIN < in_vain) {
408                                 if (args.verbose)
409                                         fprintf(stderr, "giving up\n");
410                                 break; /* give up */
411                         }
412                 }
413         }
414 done:
415         if (!got_ready || !no_done) {
416                 packet_buf_write(&req_buf, "done\n");
417                 send_request(fd[1], &req_buf);
418         }
419         if (args.verbose)
420                 fprintf(stderr, "done\n");
421         if (retval != 0) {
422                 multi_ack = 0;
423                 flushes++;
424         }
425         strbuf_release(&req_buf);
427         consume_shallow_list(fd[0]);
428         while (flushes || multi_ack) {
429                 int ack = get_ack(fd[0], result_sha1);
430                 if (ack) {
431                         if (args.verbose)
432                                 fprintf(stderr, "got ack (%d) %s\n", ack,
433                                         sha1_to_hex(result_sha1));
434                         if (ack == ACK)
435                                 return 0;
436                         multi_ack = 1;
437                         continue;
438                 }
439                 flushes--;
440         }
441         /* it is no error to fetch into a completely empty repo */
442         return count ? retval : 0;
445 static struct commit_list *complete;
447 static int mark_complete(const char *path, const unsigned char *sha1, int flag, void *cb_data)
449         struct object *o = parse_object(sha1);
451         while (o && o->type == OBJ_TAG) {
452                 struct tag *t = (struct tag *) o;
453                 if (!t->tagged)
454                         break; /* broken repository */
455                 o->flags |= COMPLETE;
456                 o = parse_object(t->tagged->sha1);
457         }
458         if (o && o->type == OBJ_COMMIT) {
459                 struct commit *commit = (struct commit *)o;
460                 commit->object.flags |= COMPLETE;
461                 commit_list_insert_by_date(commit, &complete);
462         }
463         return 0;
466 static void mark_recent_complete_commits(unsigned long cutoff)
468         while (complete && cutoff <= complete->item->date) {
469                 if (args.verbose)
470                         fprintf(stderr, "Marking %s as complete\n",
471                                 sha1_to_hex(complete->item->object.sha1));
472                 pop_most_recent_commit(&complete, COMPLETE);
473         }
476 static void filter_refs(struct ref **refs, int nr_match, char **match)
478         struct ref **return_refs;
479         struct ref *newlist = NULL;
480         struct ref **newtail = &newlist;
481         struct ref *ref, *next;
482         struct ref *fastarray[32];
484         if (nr_match && !args.fetch_all) {
485                 if (ARRAY_SIZE(fastarray) < nr_match)
486                         return_refs = xcalloc(nr_match, sizeof(struct ref *));
487                 else {
488                         return_refs = fastarray;
489                         memset(return_refs, 0, sizeof(struct ref *) * nr_match);
490                 }
491         }
492         else
493                 return_refs = NULL;
495         for (ref = *refs; ref; ref = next) {
496                 next = ref->next;
497                 if (!memcmp(ref->name, "refs/", 5) &&
498                     check_ref_format(ref->name + 5))
499                         ; /* trash */
500                 else if (args.fetch_all &&
501                          (!args.depth || prefixcmp(ref->name, "refs/tags/") )) {
502                         *newtail = ref;
503                         ref->next = NULL;
504                         newtail = &ref->next;
505                         continue;
506                 }
507                 else {
508                         int order = path_match(ref->name, nr_match, match);
509                         if (order) {
510                                 return_refs[order-1] = ref;
511                                 continue; /* we will link it later */
512                         }
513                 }
514                 free(ref);
515         }
517         if (!args.fetch_all) {
518                 int i;
519                 for (i = 0; i < nr_match; i++) {
520                         ref = return_refs[i];
521                         if (ref) {
522                                 *newtail = ref;
523                                 ref->next = NULL;
524                                 newtail = &ref->next;
525                         }
526                 }
527                 if (return_refs != fastarray)
528                         free(return_refs);
529         }
530         *refs = newlist;
533 static int everything_local(struct ref **refs, int nr_match, char **match)
535         struct ref *ref;
536         int retval;
537         unsigned long cutoff = 0;
539         save_commit_buffer = 0;
541         for (ref = *refs; ref; ref = ref->next) {
542                 struct object *o;
544                 o = parse_object(ref->old_sha1);
545                 if (!o)
546                         continue;
548                 /* We already have it -- which may mean that we were
549                  * in sync with the other side at some time after
550                  * that (it is OK if we guess wrong here).
551                  */
552                 if (o->type == OBJ_COMMIT) {
553                         struct commit *commit = (struct commit *)o;
554                         if (!cutoff || cutoff < commit->date)
555                                 cutoff = commit->date;
556                 }
557         }
559         if (!args.depth) {
560                 for_each_ref(mark_complete, NULL);
561                 if (cutoff)
562                         mark_recent_complete_commits(cutoff);
563         }
565         /*
566          * Mark all complete remote refs as common refs.
567          * Don't mark them common yet; the server has to be told so first.
568          */
569         for (ref = *refs; ref; ref = ref->next) {
570                 struct object *o = deref_tag(lookup_object(ref->old_sha1),
571                                              NULL, 0);
573                 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
574                         continue;
576                 if (!(o->flags & SEEN)) {
577                         rev_list_push((struct commit *)o, COMMON_REF | SEEN);
579                         mark_common((struct commit *)o, 1, 1);
580                 }
581         }
583         filter_refs(refs, nr_match, match);
585         for (retval = 1, ref = *refs; ref ; ref = ref->next) {
586                 const unsigned char *remote = ref->old_sha1;
587                 unsigned char local[20];
588                 struct object *o;
590                 o = lookup_object(remote);
591                 if (!o || !(o->flags & COMPLETE)) {
592                         retval = 0;
593                         if (!args.verbose)
594                                 continue;
595                         fprintf(stderr,
596                                 "want %s (%s)\n", sha1_to_hex(remote),
597                                 ref->name);
598                         continue;
599                 }
601                 hashcpy(ref->new_sha1, local);
602                 if (!args.verbose)
603                         continue;
604                 fprintf(stderr,
605                         "already have %s (%s)\n", sha1_to_hex(remote),
606                         ref->name);
607         }
608         return retval;
611 static int sideband_demux(int in, int out, void *data)
613         int *xd = data;
615         int ret = recv_sideband("fetch-pack", xd[0], out);
616         close(out);
617         return ret;
620 static int get_pack(int xd[2], char **pack_lockfile)
622         struct async demux;
623         const char *argv[20];
624         char keep_arg[256];
625         char hdr_arg[256];
626         const char **av;
627         int do_keep = args.keep_pack;
628         struct child_process cmd;
630         memset(&demux, 0, sizeof(demux));
631         if (use_sideband) {
632                 /* xd[] is talking with upload-pack; subprocess reads from
633                  * xd[0], spits out band#2 to stderr, and feeds us band#1
634                  * through demux->out.
635                  */
636                 demux.proc = sideband_demux;
637                 demux.data = xd;
638                 demux.out = -1;
639                 if (start_async(&demux))
640                         die("fetch-pack: unable to fork off sideband"
641                             " demultiplexer");
642         }
643         else
644                 demux.out = xd[0];
646         memset(&cmd, 0, sizeof(cmd));
647         cmd.argv = argv;
648         av = argv;
649         *hdr_arg = 0;
650         if (!args.keep_pack && unpack_limit) {
651                 struct pack_header header;
653                 if (read_pack_header(demux.out, &header))
654                         die("protocol error: bad pack header");
655                 snprintf(hdr_arg, sizeof(hdr_arg),
656                          "--pack_header=%"PRIu32",%"PRIu32,
657                          ntohl(header.hdr_version), ntohl(header.hdr_entries));
658                 if (ntohl(header.hdr_entries) < unpack_limit)
659                         do_keep = 0;
660                 else
661                         do_keep = 1;
662         }
664         if (do_keep) {
665                 if (pack_lockfile)
666                         cmd.out = -1;
667                 *av++ = "index-pack";
668                 *av++ = "--stdin";
669                 if (!args.quiet && !args.no_progress)
670                         *av++ = "-v";
671                 if (args.use_thin_pack)
672                         *av++ = "--fix-thin";
673                 if (args.lock_pack || unpack_limit) {
674                         int s = sprintf(keep_arg,
675                                         "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
676                         if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
677                                 strcpy(keep_arg + s, "localhost");
678                         *av++ = keep_arg;
679                 }
680         }
681         else {
682                 *av++ = "unpack-objects";
683                 if (args.quiet)
684                         *av++ = "-q";
685         }
686         if (*hdr_arg)
687                 *av++ = hdr_arg;
688         *av++ = NULL;
690         cmd.in = demux.out;
691         cmd.git_cmd = 1;
692         if (start_command(&cmd))
693                 die("fetch-pack: unable to fork off %s", argv[0]);
694         if (do_keep && pack_lockfile) {
695                 *pack_lockfile = index_pack_lockfile(cmd.out);
696                 close(cmd.out);
697         }
699         if (finish_command(&cmd))
700                 die("%s failed", argv[0]);
701         if (use_sideband && finish_async(&demux))
702                 die("error in sideband demultiplexer");
703         return 0;
706 static struct ref *do_fetch_pack(int fd[2],
707                 const struct ref *orig_ref,
708                 int nr_match,
709                 char **match,
710                 char **pack_lockfile)
712         struct ref *ref = copy_ref_list(orig_ref);
713         unsigned char sha1[20];
715         if (is_repository_shallow() && !server_supports("shallow"))
716                 die("Server does not support shallow clients");
717         if (server_supports("multi_ack_detailed")) {
718                 if (args.verbose)
719                         fprintf(stderr, "Server supports multi_ack_detailed\n");
720                 multi_ack = 2;
721                 if (server_supports("no-done")) {
722                         if (args.verbose)
723                                 fprintf(stderr, "Server supports no-done\n");
724                         no_done = 1;
725                 }
726         }
727         else if (server_supports("multi_ack")) {
728                 if (args.verbose)
729                         fprintf(stderr, "Server supports multi_ack\n");
730                 multi_ack = 1;
731         }
732         if (server_supports("side-band-64k")) {
733                 if (args.verbose)
734                         fprintf(stderr, "Server supports side-band-64k\n");
735                 use_sideband = 2;
736         }
737         else if (server_supports("side-band")) {
738                 if (args.verbose)
739                         fprintf(stderr, "Server supports side-band\n");
740                 use_sideband = 1;
741         }
742         if (server_supports("ofs-delta")) {
743                 if (args.verbose)
744                         fprintf(stderr, "Server supports ofs-delta\n");
745         } else
746                 prefer_ofs_delta = 0;
747         if (everything_local(&ref, nr_match, match)) {
748                 packet_flush(fd[1]);
749                 goto all_done;
750         }
751         if (find_common(fd, sha1, ref) < 0)
752                 if (!args.keep_pack)
753                         /* When cloning, it is not unusual to have
754                          * no common commit.
755                          */
756                         warning("no common commits");
758         if (args.stateless_rpc)
759                 packet_flush(fd[1]);
760         if (get_pack(fd, pack_lockfile))
761                 die("git fetch-pack: fetch failed.");
763  all_done:
764         return ref;
767 static int remove_duplicates(int nr_heads, char **heads)
769         int src, dst;
771         for (src = dst = 0; src < nr_heads; src++) {
772                 /* If heads[src] is different from any of
773                  * heads[0..dst], push it in.
774                  */
775                 int i;
776                 for (i = 0; i < dst; i++) {
777                         if (!strcmp(heads[i], heads[src]))
778                                 break;
779                 }
780                 if (i < dst)
781                         continue;
782                 if (src != dst)
783                         heads[dst] = heads[src];
784                 dst++;
785         }
786         return dst;
789 static int fetch_pack_config(const char *var, const char *value, void *cb)
791         if (strcmp(var, "fetch.unpacklimit") == 0) {
792                 fetch_unpack_limit = git_config_int(var, value);
793                 return 0;
794         }
796         if (strcmp(var, "transfer.unpacklimit") == 0) {
797                 transfer_unpack_limit = git_config_int(var, value);
798                 return 0;
799         }
801         if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
802                 prefer_ofs_delta = git_config_bool(var, value);
803                 return 0;
804         }
806         return git_default_config(var, value, cb);
809 static struct lock_file lock;
811 static void fetch_pack_setup(void)
813         static int did_setup;
814         if (did_setup)
815                 return;
816         git_config(fetch_pack_config, NULL);
817         if (0 <= transfer_unpack_limit)
818                 unpack_limit = transfer_unpack_limit;
819         else if (0 <= fetch_unpack_limit)
820                 unpack_limit = fetch_unpack_limit;
821         did_setup = 1;
824 int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
826         int i, ret, nr_heads;
827         struct ref *ref = NULL;
828         char *dest = NULL, **heads;
829         int fd[2];
830         char *pack_lockfile = NULL;
831         char **pack_lockfile_ptr = NULL;
832         struct child_process *conn;
834         nr_heads = 0;
835         heads = NULL;
836         for (i = 1; i < argc; i++) {
837                 const char *arg = argv[i];
839                 if (*arg == '-') {
840                         if (!prefixcmp(arg, "--upload-pack=")) {
841                                 args.uploadpack = arg + 14;
842                                 continue;
843                         }
844                         if (!prefixcmp(arg, "--exec=")) {
845                                 args.uploadpack = arg + 7;
846                                 continue;
847                         }
848                         if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
849                                 args.quiet = 1;
850                                 continue;
851                         }
852                         if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
853                                 args.lock_pack = args.keep_pack;
854                                 args.keep_pack = 1;
855                                 continue;
856                         }
857                         if (!strcmp("--thin", arg)) {
858                                 args.use_thin_pack = 1;
859                                 continue;
860                         }
861                         if (!strcmp("--include-tag", arg)) {
862                                 args.include_tag = 1;
863                                 continue;
864                         }
865                         if (!strcmp("--all", arg)) {
866                                 args.fetch_all = 1;
867                                 continue;
868                         }
869                         if (!strcmp("-v", arg)) {
870                                 args.verbose = 1;
871                                 continue;
872                         }
873                         if (!prefixcmp(arg, "--depth=")) {
874                                 args.depth = strtol(arg + 8, NULL, 0);
875                                 continue;
876                         }
877                         if (!strcmp("--no-progress", arg)) {
878                                 args.no_progress = 1;
879                                 continue;
880                         }
881                         if (!strcmp("--stateless-rpc", arg)) {
882                                 args.stateless_rpc = 1;
883                                 continue;
884                         }
885                         if (!strcmp("--lock-pack", arg)) {
886                                 args.lock_pack = 1;
887                                 pack_lockfile_ptr = &pack_lockfile;
888                                 continue;
889                         }
890                         usage(fetch_pack_usage);
891                 }
892                 dest = (char *)arg;
893                 heads = (char **)(argv + i + 1);
894                 nr_heads = argc - i - 1;
895                 break;
896         }
897         if (!dest)
898                 usage(fetch_pack_usage);
900         if (args.stateless_rpc) {
901                 conn = NULL;
902                 fd[0] = 0;
903                 fd[1] = 1;
904         } else {
905                 conn = git_connect(fd, (char *)dest, args.uploadpack,
906                                    args.verbose ? CONNECT_VERBOSE : 0);
907         }
909         get_remote_heads(fd[0], &ref, 0, NULL, 0, NULL);
911         ref = fetch_pack(&args, fd, conn, ref, dest,
912                 nr_heads, heads, pack_lockfile_ptr);
913         if (pack_lockfile) {
914                 printf("lock %s\n", pack_lockfile);
915                 fflush(stdout);
916         }
917         close(fd[0]);
918         close(fd[1]);
919         if (finish_connect(conn))
920                 ref = NULL;
921         ret = !ref;
923         if (!ret && nr_heads) {
924                 /* If the heads to pull were given, we should have
925                  * consumed all of them by matching the remote.
926                  * Otherwise, 'git fetch remote no-such-ref' would
927                  * silently succeed without issuing an error.
928                  */
929                 for (i = 0; i < nr_heads; i++)
930                         if (heads[i] && heads[i][0]) {
931                                 error("no such remote ref %s", heads[i]);
932                                 ret = 1;
933                         }
934         }
935         while (ref) {
936                 printf("%s %s\n",
937                        sha1_to_hex(ref->old_sha1), ref->name);
938                 ref = ref->next;
939         }
941         return ret;
944 struct ref *fetch_pack(struct fetch_pack_args *my_args,
945                        int fd[], struct child_process *conn,
946                        const struct ref *ref,
947                 const char *dest,
948                 int nr_heads,
949                 char **heads,
950                 char **pack_lockfile)
952         struct stat st;
953         struct ref *ref_cpy;
955         fetch_pack_setup();
956         if (&args != my_args)
957                 memcpy(&args, my_args, sizeof(args));
958         if (args.depth > 0) {
959                 if (stat(git_path("shallow"), &st))
960                         st.st_mtime = 0;
961         }
963         if (heads && nr_heads)
964                 nr_heads = remove_duplicates(nr_heads, heads);
965         if (!ref) {
966                 packet_flush(fd[1]);
967                 die("no matching remote head");
968         }
969         ref_cpy = do_fetch_pack(fd, ref, nr_heads, heads, pack_lockfile);
971         if (args.depth > 0) {
972                 struct cache_time mtime;
973                 struct strbuf sb = STRBUF_INIT;
974                 char *shallow = git_path("shallow");
975                 int fd;
977                 mtime.sec = st.st_mtime;
978                 mtime.nsec = ST_MTIME_NSEC(st);
979                 if (stat(shallow, &st)) {
980                         if (mtime.sec)
981                                 die("shallow file was removed during fetch");
982                 } else if (st.st_mtime != mtime.sec
983 #ifdef USE_NSEC
984                                 || ST_MTIME_NSEC(st) != mtime.nsec
985 #endif
986                           )
987                         die("shallow file was changed during fetch");
989                 fd = hold_lock_file_for_update(&lock, shallow,
990                                                LOCK_DIE_ON_ERROR);
991                 if (!write_shallow_commits(&sb, 0)
992                  || write_in_full(fd, sb.buf, sb.len) != sb.len) {
993                         unlink_or_warn(shallow);
994                         rollback_lock_file(&lock);
995                 } else {
996                         commit_lock_file(&lock);
997                 }
998                 strbuf_release(&sb);
999         }
1001         reprepare_packed_git();
1002         return ref_cpy;