upload-pack: pass upload_pack_data to ok_to_give_up()
[git] / upload-pack.c
1 #include "cache.h"
2 #include "config.h"
3 #include "refs.h"
4 #include "pkt-line.h"
5 #include "sideband.h"
6 #include "repository.h"
7 #include "object-store.h"
8 #include "tag.h"
9 #include "object.h"
10 #include "commit.h"
11 #include "diff.h"
12 #include "revision.h"
13 #include "list-objects.h"
14 #include "list-objects-filter.h"
15 #include "list-objects-filter-options.h"
16 #include "run-command.h"
17 #include "connect.h"
18 #include "sigchain.h"
19 #include "version.h"
20 #include "string-list.h"
21 #include "argv-array.h"
22 #include "prio-queue.h"
23 #include "protocol.h"
24 #include "quote.h"
25 #include "upload-pack.h"
26 #include "serve.h"
27 #include "commit-graph.h"
28 #include "commit-reach.h"
29 #include "shallow.h"
30
31 /* Remember to update object flag allocation in object.h */
32 #define THEY_HAVE       (1u << 11)
33 #define OUR_REF         (1u << 12)
34 #define WANTED          (1u << 13)
35 #define COMMON_KNOWN    (1u << 14)
36
37 #define SHALLOW         (1u << 16)
38 #define NOT_SHALLOW     (1u << 17)
39 #define CLIENT_SHALLOW  (1u << 18)
40 #define HIDDEN_REF      (1u << 19)
41
42 #define ALL_FLAGS (THEY_HAVE | OUR_REF | WANTED | COMMON_KNOWN | SHALLOW | \
43                 NOT_SHALLOW | CLIENT_SHALLOW | HIDDEN_REF)
44
45 static timestamp_t oldest_have;
46
47 /* Enum for allowed unadvertised object request (UOR) */
48 enum allow_uor {
49         /* Allow specifying sha1 if it is a ref tip. */
50         ALLOW_TIP_SHA1 = 0x01,
51         /* Allow request of a sha1 if it is reachable from a ref (possibly hidden ref). */
52         ALLOW_REACHABLE_SHA1 = 0x02,
53         /* Allow request of any sha1. Implies ALLOW_TIP_SHA1 and ALLOW_REACHABLE_SHA1. */
54         ALLOW_ANY_SHA1 = 0x07
55 };
56
57 /*
58  * Please annotate, and if possible group together, fields used only
59  * for protocol v0 or only for protocol v2.
60  */
61 struct upload_pack_data {
62         struct string_list symref;                              /* v0 only */
63         struct object_array want_obj;
64         struct object_array have_obj;
65         struct oid_array haves;                                 /* v2 only */
66         struct string_list wanted_refs;                         /* v2 only */
67
68         struct object_array shallows;
69         struct string_list deepen_not;
70         struct object_array extra_edge_obj;
71         int depth;
72         timestamp_t deepen_since;
73         int deepen_rev_list;
74         int deepen_relative;
75         int keepalive;
76         int shallow_nr;
77
78         unsigned int timeout;                                   /* v0 only */
79         enum {
80                 NO_MULTI_ACK = 0,
81                 MULTI_ACK = 1,
82                 MULTI_ACK_DETAILED = 2
83         } multi_ack;                                            /* v0 only */
84
85         /* 0 for no sideband, otherwise DEFAULT_PACKET_MAX or LARGE_PACKET_MAX */
86         int use_sideband;
87
88         enum allow_uor allow_uor;
89
90         struct list_objects_filter_options filter_options;
91
92         struct packet_writer writer;
93
94         const char *pack_objects_hook;
95
96         unsigned stateless_rpc : 1;                             /* v0 only */
97         unsigned no_done : 1;                                   /* v0 only */
98         unsigned daemon_mode : 1;                               /* v0 only */
99         unsigned filter_capability_requested : 1;               /* v0 only */
100
101         unsigned use_thin_pack : 1;
102         unsigned use_ofs_delta : 1;
103         unsigned no_progress : 1;
104         unsigned use_include_tag : 1;
105         unsigned allow_filter : 1;
106
107         unsigned done : 1;                                      /* v2 only */
108         unsigned allow_ref_in_want : 1;                         /* v2 only */
109         unsigned allow_sideband_all : 1;                        /* v2 only */
110 };
111
112 static void upload_pack_data_init(struct upload_pack_data *data)
113 {
114         struct string_list symref = STRING_LIST_INIT_DUP;
115         struct string_list wanted_refs = STRING_LIST_INIT_DUP;
116         struct object_array want_obj = OBJECT_ARRAY_INIT;
117         struct object_array have_obj = OBJECT_ARRAY_INIT;
118         struct oid_array haves = OID_ARRAY_INIT;
119         struct object_array shallows = OBJECT_ARRAY_INIT;
120         struct string_list deepen_not = STRING_LIST_INIT_DUP;
121         struct object_array extra_edge_obj = OBJECT_ARRAY_INIT;
122
123         memset(data, 0, sizeof(*data));
124         data->symref = symref;
125         data->wanted_refs = wanted_refs;
126         data->want_obj = want_obj;
127         data->have_obj = have_obj;
128         data->haves = haves;
129         data->shallows = shallows;
130         data->deepen_not = deepen_not;
131         data->extra_edge_obj = extra_edge_obj;
132         packet_writer_init(&data->writer, 1);
133
134         data->keepalive = 5;
135 }
136
137 static void upload_pack_data_clear(struct upload_pack_data *data)
138 {
139         string_list_clear(&data->symref, 1);
140         string_list_clear(&data->wanted_refs, 1);
141         object_array_clear(&data->want_obj);
142         object_array_clear(&data->have_obj);
143         oid_array_clear(&data->haves);
144         object_array_clear(&data->shallows);
145         string_list_clear(&data->deepen_not, 0);
146         object_array_clear(&data->extra_edge_obj);
147         list_objects_filter_release(&data->filter_options);
148
149         free((char *)data->pack_objects_hook);
150 }
151
152 static void reset_timeout(unsigned int timeout)
153 {
154         alarm(timeout);
155 }
156
157 static void send_client_data(int fd, const char *data, ssize_t sz,
158                              int use_sideband)
159 {
160         if (use_sideband) {
161                 send_sideband(1, fd, data, sz, use_sideband);
162                 return;
163         }
164         if (fd == 3)
165                 /* emergency quit */
166                 fd = 2;
167         if (fd == 2) {
168                 /* XXX: are we happy to lose stuff here? */
169                 xwrite(fd, data, sz);
170                 return;
171         }
172         write_or_die(fd, data, sz);
173 }
174
175 static int write_one_shallow(const struct commit_graft *graft, void *cb_data)
176 {
177         FILE *fp = cb_data;
178         if (graft->nr_parent == -1)
179                 fprintf(fp, "--shallow %s\n", oid_to_hex(&graft->oid));
180         return 0;
181 }
182
183 static void create_pack_file(struct upload_pack_data *pack_data)
184 {
185         struct child_process pack_objects = CHILD_PROCESS_INIT;
186         char data[8193], progress[128];
187         char abort_msg[] = "aborting due to possible repository "
188                 "corruption on the remote side.";
189         int buffered = -1;
190         ssize_t sz;
191         int i;
192         FILE *pipe_fd;
193
194         if (!pack_data->pack_objects_hook)
195                 pack_objects.git_cmd = 1;
196         else {
197                 argv_array_push(&pack_objects.args, pack_data->pack_objects_hook);
198                 argv_array_push(&pack_objects.args, "git");
199                 pack_objects.use_shell = 1;
200         }
201
202         if (pack_data->shallow_nr) {
203                 argv_array_push(&pack_objects.args, "--shallow-file");
204                 argv_array_push(&pack_objects.args, "");
205         }
206         argv_array_push(&pack_objects.args, "pack-objects");
207         argv_array_push(&pack_objects.args, "--revs");
208         if (pack_data->use_thin_pack)
209                 argv_array_push(&pack_objects.args, "--thin");
210
211         argv_array_push(&pack_objects.args, "--stdout");
212         if (pack_data->shallow_nr)
213                 argv_array_push(&pack_objects.args, "--shallow");
214         if (!pack_data->no_progress)
215                 argv_array_push(&pack_objects.args, "--progress");
216         if (pack_data->use_ofs_delta)
217                 argv_array_push(&pack_objects.args, "--delta-base-offset");
218         if (pack_data->use_include_tag)
219                 argv_array_push(&pack_objects.args, "--include-tag");
220         if (pack_data->filter_options.choice) {
221                 const char *spec =
222                         expand_list_objects_filter_spec(&pack_data->filter_options);
223                 if (pack_objects.use_shell) {
224                         struct strbuf buf = STRBUF_INIT;
225                         sq_quote_buf(&buf, spec);
226                         argv_array_pushf(&pack_objects.args, "--filter=%s", buf.buf);
227                         strbuf_release(&buf);
228                 } else {
229                         argv_array_pushf(&pack_objects.args, "--filter=%s",
230                                          spec);
231                 }
232         }
233
234         pack_objects.in = -1;
235         pack_objects.out = -1;
236         pack_objects.err = -1;
237
238         if (start_command(&pack_objects))
239                 die("git upload-pack: unable to fork git-pack-objects");
240
241         pipe_fd = xfdopen(pack_objects.in, "w");
242
243         if (pack_data->shallow_nr)
244                 for_each_commit_graft(write_one_shallow, pipe_fd);
245
246         for (i = 0; i < pack_data->want_obj.nr; i++)
247                 fprintf(pipe_fd, "%s\n",
248                         oid_to_hex(&pack_data->want_obj.objects[i].item->oid));
249         fprintf(pipe_fd, "--not\n");
250         for (i = 0; i < pack_data->have_obj.nr; i++)
251                 fprintf(pipe_fd, "%s\n",
252                         oid_to_hex(&pack_data->have_obj.objects[i].item->oid));
253         for (i = 0; i < pack_data->extra_edge_obj.nr; i++)
254                 fprintf(pipe_fd, "%s\n",
255                         oid_to_hex(&pack_data->extra_edge_obj.objects[i].item->oid));
256         fprintf(pipe_fd, "\n");
257         fflush(pipe_fd);
258         fclose(pipe_fd);
259
260         /* We read from pack_objects.err to capture stderr output for
261          * progress bar, and pack_objects.out to capture the pack data.
262          */
263
264         while (1) {
265                 struct pollfd pfd[2];
266                 int pe, pu, pollsize, polltimeout;
267                 int ret;
268
269                 reset_timeout(pack_data->timeout);
270
271                 pollsize = 0;
272                 pe = pu = -1;
273
274                 if (0 <= pack_objects.out) {
275                         pfd[pollsize].fd = pack_objects.out;
276                         pfd[pollsize].events = POLLIN;
277                         pu = pollsize;
278                         pollsize++;
279                 }
280                 if (0 <= pack_objects.err) {
281                         pfd[pollsize].fd = pack_objects.err;
282                         pfd[pollsize].events = POLLIN;
283                         pe = pollsize;
284                         pollsize++;
285                 }
286
287                 if (!pollsize)
288                         break;
289
290                 polltimeout = pack_data->keepalive < 0
291                         ? -1
292                         : 1000 * pack_data->keepalive;
293
294                 ret = poll(pfd, pollsize, polltimeout);
295
296                 if (ret < 0) {
297                         if (errno != EINTR) {
298                                 error_errno("poll failed, resuming");
299                                 sleep(1);
300                         }
301                         continue;
302                 }
303                 if (0 <= pe && (pfd[pe].revents & (POLLIN|POLLHUP))) {
304                         /* Status ready; we ship that in the side-band
305                          * or dump to the standard error.
306                          */
307                         sz = xread(pack_objects.err, progress,
308                                   sizeof(progress));
309                         if (0 < sz)
310                                 send_client_data(2, progress, sz,
311                                                  pack_data->use_sideband);
312                         else if (sz == 0) {
313                                 close(pack_objects.err);
314                                 pack_objects.err = -1;
315                         }
316                         else
317                                 goto fail;
318                         /* give priority to status messages */
319                         continue;
320                 }
321                 if (0 <= pu && (pfd[pu].revents & (POLLIN|POLLHUP))) {
322                         /* Data ready; we keep the last byte to ourselves
323                          * in case we detect broken rev-list, so that we
324                          * can leave the stream corrupted.  This is
325                          * unfortunate -- unpack-objects would happily
326                          * accept a valid packdata with trailing garbage,
327                          * so appending garbage after we pass all the
328                          * pack data is not good enough to signal
329                          * breakage to downstream.
330                          */
331                         char *cp = data;
332                         ssize_t outsz = 0;
333                         if (0 <= buffered) {
334                                 *cp++ = buffered;
335                                 outsz++;
336                         }
337                         sz = xread(pack_objects.out, cp,
338                                   sizeof(data) - outsz);
339                         if (0 < sz)
340                                 ;
341                         else if (sz == 0) {
342                                 close(pack_objects.out);
343                                 pack_objects.out = -1;
344                         }
345                         else
346                                 goto fail;
347                         sz += outsz;
348                         if (1 < sz) {
349                                 buffered = data[sz-1] & 0xFF;
350                                 sz--;
351                         }
352                         else
353                                 buffered = -1;
354                         send_client_data(1, data, sz,
355                                          pack_data->use_sideband);
356                 }
357
358                 /*
359                  * We hit the keepalive timeout without saying anything; send
360                  * an empty message on the data sideband just to let the other
361                  * side know we're still working on it, but don't have any data
362                  * yet.
363                  *
364                  * If we don't have a sideband channel, there's no room in the
365                  * protocol to say anything, so those clients are just out of
366                  * luck.
367                  */
368                 if (!ret && pack_data->use_sideband) {
369                         static const char buf[] = "0005\1";
370                         write_or_die(1, buf, 5);
371                 }
372         }
373
374         if (finish_command(&pack_objects)) {
375                 error("git upload-pack: git-pack-objects died with error.");
376                 goto fail;
377         }
378
379         /* flush the data */
380         if (0 <= buffered) {
381                 data[0] = buffered;
382                 send_client_data(1, data, 1,
383                                  pack_data->use_sideband);
384                 fprintf(stderr, "flushed.\n");
385         }
386         if (pack_data->use_sideband)
387                 packet_flush(1);
388         return;
389
390  fail:
391         send_client_data(3, abort_msg, sizeof(abort_msg),
392                          pack_data->use_sideband);
393         die("git upload-pack: %s", abort_msg);
394 }
395
396 static int got_oid(const char *hex, struct object_id *oid,
397                    struct object_array *have_obj)
398 {
399         struct object *o;
400         int we_knew_they_have = 0;
401
402         if (get_oid_hex(hex, oid))
403                 die("git upload-pack: expected SHA1 object, got '%s'", hex);
404         if (!has_object_file(oid))
405                 return -1;
406
407         o = parse_object(the_repository, oid);
408         if (!o)
409                 die("oops (%s)", oid_to_hex(oid));
410         if (o->type == OBJ_COMMIT) {
411                 struct commit_list *parents;
412                 struct commit *commit = (struct commit *)o;
413                 if (o->flags & THEY_HAVE)
414                         we_knew_they_have = 1;
415                 else
416                         o->flags |= THEY_HAVE;
417                 if (!oldest_have || (commit->date < oldest_have))
418                         oldest_have = commit->date;
419                 for (parents = commit->parents;
420                      parents;
421                      parents = parents->next)
422                         parents->item->object.flags |= THEY_HAVE;
423         }
424         if (!we_knew_they_have) {
425                 add_object_array(o, NULL, have_obj);
426                 return 1;
427         }
428         return 0;
429 }
430
431 static int ok_to_give_up(struct upload_pack_data *data)
432 {
433         uint32_t min_generation = GENERATION_NUMBER_ZERO;
434
435         if (!data->have_obj.nr)
436                 return 0;
437
438         return can_all_from_reach_with_flag(&data->want_obj, THEY_HAVE,
439                                             COMMON_KNOWN, oldest_have,
440                                             min_generation);
441 }
442
443 static int get_common_commits(struct upload_pack_data *data,
444                               struct packet_reader *reader)
445 {
446         struct object_id oid;
447         char last_hex[GIT_MAX_HEXSZ + 1];
448         int got_common = 0;
449         int got_other = 0;
450         int sent_ready = 0;
451
452         save_commit_buffer = 0;
453
454         for (;;) {
455                 const char *arg;
456
457                 reset_timeout(data->timeout);
458
459                 if (packet_reader_read(reader) != PACKET_READ_NORMAL) {
460                         if (data->multi_ack == MULTI_ACK_DETAILED
461                             && got_common
462                             && !got_other
463                             && ok_to_give_up(data)) {
464                                 sent_ready = 1;
465                                 packet_write_fmt(1, "ACK %s ready\n", last_hex);
466                         }
467                         if (data->have_obj.nr == 0 || data->multi_ack)
468                                 packet_write_fmt(1, "NAK\n");
469
470                         if (data->no_done && sent_ready) {
471                                 packet_write_fmt(1, "ACK %s\n", last_hex);
472                                 return 0;
473                         }
474                         if (data->stateless_rpc)
475                                 exit(0);
476                         got_common = 0;
477                         got_other = 0;
478                         continue;
479                 }
480                 if (skip_prefix(reader->line, "have ", &arg)) {
481                         switch (got_oid(arg, &oid, &data->have_obj)) {
482                         case -1: /* they have what we do not */
483                                 got_other = 1;
484                                 if (data->multi_ack
485                                     && ok_to_give_up(data)) {
486                                         const char *hex = oid_to_hex(&oid);
487                                         if (data->multi_ack == MULTI_ACK_DETAILED) {
488                                                 sent_ready = 1;
489                                                 packet_write_fmt(1, "ACK %s ready\n", hex);
490                                         } else
491                                                 packet_write_fmt(1, "ACK %s continue\n", hex);
492                                 }
493                                 break;
494                         default:
495                                 got_common = 1;
496                                 oid_to_hex_r(last_hex, &oid);
497                                 if (data->multi_ack == MULTI_ACK_DETAILED)
498                                         packet_write_fmt(1, "ACK %s common\n", last_hex);
499                                 else if (data->multi_ack)
500                                         packet_write_fmt(1, "ACK %s continue\n", last_hex);
501                                 else if (data->have_obj.nr == 1)
502                                         packet_write_fmt(1, "ACK %s\n", last_hex);
503                                 break;
504                         }
505                         continue;
506                 }
507                 if (!strcmp(reader->line, "done")) {
508                         if (data->have_obj.nr > 0) {
509                                 if (data->multi_ack)
510                                         packet_write_fmt(1, "ACK %s\n", last_hex);
511                                 return 0;
512                         }
513                         packet_write_fmt(1, "NAK\n");
514                         return -1;
515                 }
516                 die("git upload-pack: expected SHA1 list, got '%s'", reader->line);
517         }
518 }
519
520 static int is_our_ref(struct object *o, enum allow_uor allow_uor)
521 {
522         int allow_hidden_ref = (allow_uor &
523                                 (ALLOW_TIP_SHA1 | ALLOW_REACHABLE_SHA1));
524         return o->flags & ((allow_hidden_ref ? HIDDEN_REF : 0) | OUR_REF);
525 }
526
527 /*
528  * on successful case, it's up to the caller to close cmd->out
529  */
530 static int do_reachable_revlist(struct child_process *cmd,
531                                 struct object_array *src,
532                                 struct object_array *reachable,
533                                 enum allow_uor allow_uor)
534 {
535         static const char *argv[] = {
536                 "rev-list", "--stdin", NULL,
537         };
538         struct object *o;
539         char namebuf[GIT_MAX_HEXSZ + 2]; /* ^ + hash + LF */
540         int i;
541         const unsigned hexsz = the_hash_algo->hexsz;
542
543         cmd->argv = argv;
544         cmd->git_cmd = 1;
545         cmd->no_stderr = 1;
546         cmd->in = -1;
547         cmd->out = -1;
548
549         /*
550          * If the next rev-list --stdin encounters an unknown commit,
551          * it terminates, which will cause SIGPIPE in the write loop
552          * below.
553          */
554         sigchain_push(SIGPIPE, SIG_IGN);
555
556         if (start_command(cmd))
557                 goto error;
558
559         namebuf[0] = '^';
560         namebuf[hexsz + 1] = '\n';
561         for (i = get_max_object_index(); 0 < i; ) {
562                 o = get_indexed_object(--i);
563                 if (!o)
564                         continue;
565                 if (reachable && o->type == OBJ_COMMIT)
566                         o->flags &= ~TMP_MARK;
567                 if (!is_our_ref(o, allow_uor))
568                         continue;
569                 memcpy(namebuf + 1, oid_to_hex(&o->oid), hexsz);
570                 if (write_in_full(cmd->in, namebuf, hexsz + 2) < 0)
571                         goto error;
572         }
573         namebuf[hexsz] = '\n';
574         for (i = 0; i < src->nr; i++) {
575                 o = src->objects[i].item;
576                 if (is_our_ref(o, allow_uor)) {
577                         if (reachable)
578                                 add_object_array(o, NULL, reachable);
579                         continue;
580                 }
581                 if (reachable && o->type == OBJ_COMMIT)
582                         o->flags |= TMP_MARK;
583                 memcpy(namebuf, oid_to_hex(&o->oid), hexsz);
584                 if (write_in_full(cmd->in, namebuf, hexsz + 1) < 0)
585                         goto error;
586         }
587         close(cmd->in);
588         cmd->in = -1;
589         sigchain_pop(SIGPIPE);
590
591         return 0;
592
593 error:
594         sigchain_pop(SIGPIPE);
595
596         if (cmd->in >= 0)
597                 close(cmd->in);
598         if (cmd->out >= 0)
599                 close(cmd->out);
600         return -1;
601 }
602
603 static int get_reachable_list(struct upload_pack_data *data,
604                               struct object_array *reachable)
605 {
606         struct child_process cmd = CHILD_PROCESS_INIT;
607         int i;
608         struct object *o;
609         char namebuf[GIT_MAX_HEXSZ + 2]; /* ^ + hash + LF */
610         const unsigned hexsz = the_hash_algo->hexsz;
611
612         if (do_reachable_revlist(&cmd, &data->shallows, reachable,
613                                  data->allow_uor) < 0)
614                 return -1;
615
616         while ((i = read_in_full(cmd.out, namebuf, hexsz + 1)) == hexsz + 1) {
617                 struct object_id oid;
618                 const char *p;
619
620                 if (parse_oid_hex(namebuf, &oid, &p) || *p != '\n')
621                         break;
622
623                 o = lookup_object(the_repository, &oid);
624                 if (o && o->type == OBJ_COMMIT) {
625                         o->flags &= ~TMP_MARK;
626                 }
627         }
628         for (i = get_max_object_index(); 0 < i; i--) {
629                 o = get_indexed_object(i - 1);
630                 if (o && o->type == OBJ_COMMIT &&
631                     (o->flags & TMP_MARK)) {
632                         add_object_array(o, NULL, reachable);
633                                 o->flags &= ~TMP_MARK;
634                 }
635         }
636         close(cmd.out);
637
638         if (finish_command(&cmd))
639                 return -1;
640
641         return 0;
642 }
643
644 static int has_unreachable(struct object_array *src, enum allow_uor allow_uor)
645 {
646         struct child_process cmd = CHILD_PROCESS_INIT;
647         char buf[1];
648         int i;
649
650         if (do_reachable_revlist(&cmd, src, NULL, allow_uor) < 0)
651                 return 1;
652
653         /*
654          * The commits out of the rev-list are not ancestors of
655          * our ref.
656          */
657         i = read_in_full(cmd.out, buf, 1);
658         if (i)
659                 goto error;
660         close(cmd.out);
661         cmd.out = -1;
662
663         /*
664          * rev-list may have died by encountering a bad commit
665          * in the history, in which case we do want to bail out
666          * even when it showed no commit.
667          */
668         if (finish_command(&cmd))
669                 goto error;
670
671         /* All the non-tip ones are ancestors of what we advertised */
672         return 0;
673
674 error:
675         sigchain_pop(SIGPIPE);
676         if (cmd.out >= 0)
677                 close(cmd.out);
678         return 1;
679 }
680
681 static void check_non_tip(struct upload_pack_data *data)
682 {
683         int i;
684
685         /*
686          * In the normal in-process case without
687          * uploadpack.allowReachableSHA1InWant,
688          * non-tip requests can never happen.
689          */
690         if (!data->stateless_rpc && !(data->allow_uor & ALLOW_REACHABLE_SHA1))
691                 goto error;
692         if (!has_unreachable(&data->want_obj, data->allow_uor))
693                 /* All the non-tip ones are ancestors of what we advertised */
694                 return;
695
696 error:
697         /* Pick one of them (we know there at least is one) */
698         for (i = 0; i < data->want_obj.nr; i++) {
699                 struct object *o = data->want_obj.objects[i].item;
700                 if (!is_our_ref(o, data->allow_uor)) {
701                         packet_writer_error(&data->writer,
702                                             "upload-pack: not our ref %s",
703                                             oid_to_hex(&o->oid));
704                         die("git upload-pack: not our ref %s",
705                             oid_to_hex(&o->oid));
706                 }
707         }
708 }
709
710 static void send_shallow(struct upload_pack_data *data,
711                          struct commit_list *result)
712 {
713         while (result) {
714                 struct object *object = &result->item->object;
715                 if (!(object->flags & (CLIENT_SHALLOW|NOT_SHALLOW))) {
716                         packet_writer_write(&data->writer, "shallow %s",
717                                             oid_to_hex(&object->oid));
718                         register_shallow(the_repository, &object->oid);
719                         data->shallow_nr++;
720                 }
721                 result = result->next;
722         }
723 }
724
725 static void send_unshallow(struct upload_pack_data *data)
726 {
727         int i;
728
729         for (i = 0; i < data->shallows.nr; i++) {
730                 struct object *object = data->shallows.objects[i].item;
731                 if (object->flags & NOT_SHALLOW) {
732                         struct commit_list *parents;
733                         packet_writer_write(&data->writer, "unshallow %s",
734                                             oid_to_hex(&object->oid));
735                         object->flags &= ~CLIENT_SHALLOW;
736                         /*
737                          * We want to _register_ "object" as shallow, but we
738                          * also need to traverse object's parents to deepen a
739                          * shallow clone. Unregister it for now so we can
740                          * parse and add the parents to the want list, then
741                          * re-register it.
742                          */
743                         unregister_shallow(&object->oid);
744                         object->parsed = 0;
745                         parse_commit_or_die((struct commit *)object);
746                         parents = ((struct commit *)object)->parents;
747                         while (parents) {
748                                 add_object_array(&parents->item->object,
749                                                  NULL, &data->want_obj);
750                                 parents = parents->next;
751                         }
752                         add_object_array(object, NULL, &data->extra_edge_obj);
753                 }
754                 /* make sure commit traversal conforms to client */
755                 register_shallow(the_repository, &object->oid);
756         }
757 }
758
759 static int check_ref(const char *refname_full, const struct object_id *oid,
760                      int flag, void *cb_data);
761 static void deepen(struct upload_pack_data *data, int depth)
762 {
763         if (depth == INFINITE_DEPTH && !is_repository_shallow(the_repository)) {
764                 int i;
765
766                 for (i = 0; i < data->shallows.nr; i++) {
767                         struct object *object = data->shallows.objects[i].item;
768                         object->flags |= NOT_SHALLOW;
769                 }
770         } else if (data->deepen_relative) {
771                 struct object_array reachable_shallows = OBJECT_ARRAY_INIT;
772                 struct commit_list *result;
773
774                 /*
775                  * Checking for reachable shallows requires that our refs be
776                  * marked with OUR_REF.
777                  */
778                 head_ref_namespaced(check_ref, NULL);
779                 for_each_namespaced_ref(check_ref, NULL);
780
781                 get_reachable_list(data, &reachable_shallows);
782                 result = get_shallow_commits(&reachable_shallows,
783                                              depth + 1,
784                                              SHALLOW, NOT_SHALLOW);
785                 send_shallow(data, result);
786                 free_commit_list(result);
787                 object_array_clear(&reachable_shallows);
788         } else {
789                 struct commit_list *result;
790
791                 result = get_shallow_commits(&data->want_obj, depth,
792                                              SHALLOW, NOT_SHALLOW);
793                 send_shallow(data, result);
794                 free_commit_list(result);
795         }
796
797         send_unshallow(data);
798 }
799
800 static void deepen_by_rev_list(struct upload_pack_data *data,
801                                int ac,
802                                const char **av)
803 {
804         struct commit_list *result;
805
806         disable_commit_graph(the_repository);
807         result = get_shallow_commits_by_rev_list(ac, av, SHALLOW, NOT_SHALLOW);
808         send_shallow(data, result);
809         free_commit_list(result);
810         send_unshallow(data);
811 }
812
813 /* Returns 1 if a shallow list is sent or 0 otherwise */
814 static int send_shallow_list(struct upload_pack_data *data)
815 {
816         int ret = 0;
817
818         if (data->depth > 0 && data->deepen_rev_list)
819                 die("git upload-pack: deepen and deepen-since (or deepen-not) cannot be used together");
820         if (data->depth > 0) {
821                 deepen(data, data->depth);
822                 ret = 1;
823         } else if (data->deepen_rev_list) {
824                 struct argv_array av = ARGV_ARRAY_INIT;
825                 int i;
826
827                 argv_array_push(&av, "rev-list");
828                 if (data->deepen_since)
829                         argv_array_pushf(&av, "--max-age=%"PRItime, data->deepen_since);
830                 if (data->deepen_not.nr) {
831                         argv_array_push(&av, "--not");
832                         for (i = 0; i < data->deepen_not.nr; i++) {
833                                 struct string_list_item *s = data->deepen_not.items + i;
834                                 argv_array_push(&av, s->string);
835                         }
836                         argv_array_push(&av, "--not");
837                 }
838                 for (i = 0; i < data->want_obj.nr; i++) {
839                         struct object *o = data->want_obj.objects[i].item;
840                         argv_array_push(&av, oid_to_hex(&o->oid));
841                 }
842                 deepen_by_rev_list(data, av.argc, av.argv);
843                 argv_array_clear(&av);
844                 ret = 1;
845         } else {
846                 if (data->shallows.nr > 0) {
847                         int i;
848                         for (i = 0; i < data->shallows.nr; i++)
849                                 register_shallow(the_repository,
850                                                  &data->shallows.objects[i].item->oid);
851                 }
852         }
853
854         data->shallow_nr += data->shallows.nr;
855         return ret;
856 }
857
858 static int process_shallow(const char *line, struct object_array *shallows)
859 {
860         const char *arg;
861         if (skip_prefix(line, "shallow ", &arg)) {
862                 struct object_id oid;
863                 struct object *object;
864                 if (get_oid_hex(arg, &oid))
865                         die("invalid shallow line: %s", line);
866                 object = parse_object(the_repository, &oid);
867                 if (!object)
868                         return 1;
869                 if (object->type != OBJ_COMMIT)
870                         die("invalid shallow object %s", oid_to_hex(&oid));
871                 if (!(object->flags & CLIENT_SHALLOW)) {
872                         object->flags |= CLIENT_SHALLOW;
873                         add_object_array(object, NULL, shallows);
874                 }
875                 return 1;
876         }
877
878         return 0;
879 }
880
881 static int process_deepen(const char *line, int *depth)
882 {
883         const char *arg;
884         if (skip_prefix(line, "deepen ", &arg)) {
885                 char *end = NULL;
886                 *depth = (int)strtol(arg, &end, 0);
887                 if (!end || *end || *depth <= 0)
888                         die("Invalid deepen: %s", line);
889                 return 1;
890         }
891
892         return 0;
893 }
894
895 static int process_deepen_since(const char *line, timestamp_t *deepen_since, int *deepen_rev_list)
896 {
897         const char *arg;
898         if (skip_prefix(line, "deepen-since ", &arg)) {
899                 char *end = NULL;
900                 *deepen_since = parse_timestamp(arg, &end, 0);
901                 if (!end || *end || !deepen_since ||
902                     /* revisions.c's max_age -1 is special */
903                     *deepen_since == -1)
904                         die("Invalid deepen-since: %s", line);
905                 *deepen_rev_list = 1;
906                 return 1;
907         }
908         return 0;
909 }
910
911 static int process_deepen_not(const char *line, struct string_list *deepen_not, int *deepen_rev_list)
912 {
913         const char *arg;
914         if (skip_prefix(line, "deepen-not ", &arg)) {
915                 char *ref = NULL;
916                 struct object_id oid;
917                 if (expand_ref(the_repository, arg, strlen(arg), &oid, &ref) != 1)
918                         die("git upload-pack: ambiguous deepen-not: %s", line);
919                 string_list_append(deepen_not, ref);
920                 free(ref);
921                 *deepen_rev_list = 1;
922                 return 1;
923         }
924         return 0;
925 }
926
927 static void receive_needs(struct upload_pack_data *data,
928                           struct packet_reader *reader)
929 {
930         int has_non_tip = 0;
931
932         data->shallow_nr = 0;
933         for (;;) {
934                 struct object *o;
935                 const char *features;
936                 struct object_id oid_buf;
937                 const char *arg;
938
939                 reset_timeout(data->timeout);
940                 if (packet_reader_read(reader) != PACKET_READ_NORMAL)
941                         break;
942
943                 if (process_shallow(reader->line, &data->shallows))
944                         continue;
945                 if (process_deepen(reader->line, &data->depth))
946                         continue;
947                 if (process_deepen_since(reader->line, &data->deepen_since, &data->deepen_rev_list))
948                         continue;
949                 if (process_deepen_not(reader->line, &data->deepen_not, &data->deepen_rev_list))
950                         continue;
951
952                 if (skip_prefix(reader->line, "filter ", &arg)) {
953                         if (!data->filter_capability_requested)
954                                 die("git upload-pack: filtering capability not negotiated");
955                         list_objects_filter_die_if_populated(&data->filter_options);
956                         parse_list_objects_filter(&data->filter_options, arg);
957                         continue;
958                 }
959
960                 if (!skip_prefix(reader->line, "want ", &arg) ||
961                     parse_oid_hex(arg, &oid_buf, &features))
962                         die("git upload-pack: protocol error, "
963                             "expected to get object ID, not '%s'", reader->line);
964
965                 if (parse_feature_request(features, "deepen-relative"))
966                         data->deepen_relative = 1;
967                 if (parse_feature_request(features, "multi_ack_detailed"))
968                         data->multi_ack = MULTI_ACK_DETAILED;
969                 else if (parse_feature_request(features, "multi_ack"))
970                         data->multi_ack = MULTI_ACK;
971                 if (parse_feature_request(features, "no-done"))
972                         data->no_done = 1;
973                 if (parse_feature_request(features, "thin-pack"))
974                         data->use_thin_pack = 1;
975                 if (parse_feature_request(features, "ofs-delta"))
976                         data->use_ofs_delta = 1;
977                 if (parse_feature_request(features, "side-band-64k"))
978                         data->use_sideband = LARGE_PACKET_MAX;
979                 else if (parse_feature_request(features, "side-band"))
980                         data->use_sideband = DEFAULT_PACKET_MAX;
981                 if (parse_feature_request(features, "no-progress"))
982                         data->no_progress = 1;
983                 if (parse_feature_request(features, "include-tag"))
984                         data->use_include_tag = 1;
985                 if (data->allow_filter &&
986                     parse_feature_request(features, "filter"))
987                         data->filter_capability_requested = 1;
988
989                 o = parse_object(the_repository, &oid_buf);
990                 if (!o) {
991                         packet_writer_error(&data->writer,
992                                             "upload-pack: not our ref %s",
993                                             oid_to_hex(&oid_buf));
994                         die("git upload-pack: not our ref %s",
995                             oid_to_hex(&oid_buf));
996                 }
997                 if (!(o->flags & WANTED)) {
998                         o->flags |= WANTED;
999                         if (!((data->allow_uor & ALLOW_ANY_SHA1) == ALLOW_ANY_SHA1
1000                               || is_our_ref(o, data->allow_uor)))
1001                                 has_non_tip = 1;
1002                         add_object_array(o, NULL, &data->want_obj);
1003                 }
1004         }
1005
1006         /*
1007          * We have sent all our refs already, and the other end
1008          * should have chosen out of them. When we are operating
1009          * in the stateless RPC mode, however, their choice may
1010          * have been based on the set of older refs advertised
1011          * by another process that handled the initial request.
1012          */
1013         if (has_non_tip)
1014                 check_non_tip(data);
1015
1016         if (!data->use_sideband && data->daemon_mode)
1017                 data->no_progress = 1;
1018
1019         if (data->depth == 0 && !data->deepen_rev_list && data->shallows.nr == 0)
1020                 return;
1021
1022         if (send_shallow_list(data))
1023                 packet_flush(1);
1024 }
1025
1026 /* return non-zero if the ref is hidden, otherwise 0 */
1027 static int mark_our_ref(const char *refname, const char *refname_full,
1028                         const struct object_id *oid)
1029 {
1030         struct object *o = lookup_unknown_object(oid);
1031
1032         if (ref_is_hidden(refname, refname_full)) {
1033                 o->flags |= HIDDEN_REF;
1034                 return 1;
1035         }
1036         o->flags |= OUR_REF;
1037         return 0;
1038 }
1039
1040 static int check_ref(const char *refname_full, const struct object_id *oid,
1041                      int flag, void *cb_data)
1042 {
1043         const char *refname = strip_namespace(refname_full);
1044
1045         mark_our_ref(refname, refname_full, oid);
1046         return 0;
1047 }
1048
1049 static void format_symref_info(struct strbuf *buf, struct string_list *symref)
1050 {
1051         struct string_list_item *item;
1052
1053         if (!symref->nr)
1054                 return;
1055         for_each_string_list_item(item, symref)
1056                 strbuf_addf(buf, " symref=%s:%s", item->string, (char *)item->util);
1057 }
1058
1059 static int send_ref(const char *refname, const struct object_id *oid,
1060                     int flag, void *cb_data)
1061 {
1062         static const char *capabilities = "multi_ack thin-pack side-band"
1063                 " side-band-64k ofs-delta shallow deepen-since deepen-not"
1064                 " deepen-relative no-progress include-tag multi_ack_detailed";
1065         const char *refname_nons = strip_namespace(refname);
1066         struct object_id peeled;
1067         struct upload_pack_data *data = cb_data;
1068
1069         if (mark_our_ref(refname_nons, refname, oid))
1070                 return 0;
1071
1072         if (capabilities) {
1073                 struct strbuf symref_info = STRBUF_INIT;
1074
1075                 format_symref_info(&symref_info, &data->symref);
1076                 packet_write_fmt(1, "%s %s%c%s%s%s%s%s%s agent=%s\n",
1077                              oid_to_hex(oid), refname_nons,
1078                              0, capabilities,
1079                              (data->allow_uor & ALLOW_TIP_SHA1) ?
1080                                      " allow-tip-sha1-in-want" : "",
1081                              (data->allow_uor & ALLOW_REACHABLE_SHA1) ?
1082                                      " allow-reachable-sha1-in-want" : "",
1083                              data->stateless_rpc ? " no-done" : "",
1084                              symref_info.buf,
1085                              data->allow_filter ? " filter" : "",
1086                              git_user_agent_sanitized());
1087                 strbuf_release(&symref_info);
1088         } else {
1089                 packet_write_fmt(1, "%s %s\n", oid_to_hex(oid), refname_nons);
1090         }
1091         capabilities = NULL;
1092         if (!peel_ref(refname, &peeled))
1093                 packet_write_fmt(1, "%s %s^{}\n", oid_to_hex(&peeled), refname_nons);
1094         return 0;
1095 }
1096
1097 static int find_symref(const char *refname, const struct object_id *oid,
1098                        int flag, void *cb_data)
1099 {
1100         const char *symref_target;
1101         struct string_list_item *item;
1102
1103         if ((flag & REF_ISSYMREF) == 0)
1104                 return 0;
1105         symref_target = resolve_ref_unsafe(refname, 0, NULL, &flag);
1106         if (!symref_target || (flag & REF_ISSYMREF) == 0)
1107                 die("'%s' is a symref but it is not?", refname);
1108         item = string_list_append(cb_data, strip_namespace(refname));
1109         item->util = xstrdup(strip_namespace(symref_target));
1110         return 0;
1111 }
1112
1113 static int upload_pack_config(const char *var, const char *value, void *cb_data)
1114 {
1115         struct upload_pack_data *data = cb_data;
1116
1117         if (!strcmp("uploadpack.allowtipsha1inwant", var)) {
1118                 if (git_config_bool(var, value))
1119                         data->allow_uor |= ALLOW_TIP_SHA1;
1120                 else
1121                         data->allow_uor &= ~ALLOW_TIP_SHA1;
1122         } else if (!strcmp("uploadpack.allowreachablesha1inwant", var)) {
1123                 if (git_config_bool(var, value))
1124                         data->allow_uor |= ALLOW_REACHABLE_SHA1;
1125                 else
1126                         data->allow_uor &= ~ALLOW_REACHABLE_SHA1;
1127         } else if (!strcmp("uploadpack.allowanysha1inwant", var)) {
1128                 if (git_config_bool(var, value))
1129                         data->allow_uor |= ALLOW_ANY_SHA1;
1130                 else
1131                         data->allow_uor &= ~ALLOW_ANY_SHA1;
1132         } else if (!strcmp("uploadpack.keepalive", var)) {
1133                 data->keepalive = git_config_int(var, value);
1134                 if (!data->keepalive)
1135                         data->keepalive = -1;
1136         } else if (!strcmp("uploadpack.allowfilter", var)) {
1137                 data->allow_filter = git_config_bool(var, value);
1138         } else if (!strcmp("uploadpack.allowrefinwant", var)) {
1139                 data->allow_ref_in_want = git_config_bool(var, value);
1140         } else if (!strcmp("uploadpack.allowsidebandall", var)) {
1141                 data->allow_sideband_all = git_config_bool(var, value);
1142         } else if (!strcmp("core.precomposeunicode", var)) {
1143                 precomposed_unicode = git_config_bool(var, value);
1144         }
1145
1146         if (current_config_scope() != CONFIG_SCOPE_LOCAL &&
1147         current_config_scope() != CONFIG_SCOPE_WORKTREE) {
1148                 if (!strcmp("uploadpack.packobjectshook", var))
1149                         return git_config_string(&data->pack_objects_hook, var, value);
1150         }
1151
1152         return parse_hide_refs_config(var, value, "uploadpack");
1153 }
1154
1155 void upload_pack(struct upload_pack_options *options)
1156 {
1157         struct packet_reader reader;
1158         struct upload_pack_data data;
1159
1160         upload_pack_data_init(&data);
1161
1162         git_config(upload_pack_config, &data);
1163
1164         data.stateless_rpc = options->stateless_rpc;
1165         data.daemon_mode = options->daemon_mode;
1166         data.timeout = options->timeout;
1167
1168         head_ref_namespaced(find_symref, &data.symref);
1169
1170         if (options->advertise_refs || !data.stateless_rpc) {
1171                 reset_timeout(data.timeout);
1172                 head_ref_namespaced(send_ref, &data);
1173                 for_each_namespaced_ref(send_ref, &data);
1174                 advertise_shallow_grafts(1);
1175                 packet_flush(1);
1176         } else {
1177                 head_ref_namespaced(check_ref, NULL);
1178                 for_each_namespaced_ref(check_ref, NULL);
1179         }
1180
1181         if (!options->advertise_refs) {
1182                 packet_reader_init(&reader, 0, NULL, 0,
1183                                    PACKET_READ_CHOMP_NEWLINE |
1184                                    PACKET_READ_DIE_ON_ERR_PACKET);
1185
1186                 receive_needs(&data, &reader);
1187                 if (data.want_obj.nr) {
1188                         get_common_commits(&data, &reader);
1189                         create_pack_file(&data);
1190                 }
1191         }
1192
1193         upload_pack_data_clear(&data);
1194 }
1195
1196 static int parse_want(struct packet_writer *writer, const char *line,
1197                       struct object_array *want_obj)
1198 {
1199         const char *arg;
1200         if (skip_prefix(line, "want ", &arg)) {
1201                 struct object_id oid;
1202                 struct object *o;
1203
1204                 if (get_oid_hex(arg, &oid))
1205                         die("git upload-pack: protocol error, "
1206                             "expected to get oid, not '%s'", line);
1207
1208                 o = parse_object(the_repository, &oid);
1209                 if (!o) {
1210                         packet_writer_error(writer,
1211                                             "upload-pack: not our ref %s",
1212                                             oid_to_hex(&oid));
1213                         die("git upload-pack: not our ref %s",
1214                             oid_to_hex(&oid));
1215                 }
1216
1217                 if (!(o->flags & WANTED)) {
1218                         o->flags |= WANTED;
1219                         add_object_array(o, NULL, want_obj);
1220                 }
1221
1222                 return 1;
1223         }
1224
1225         return 0;
1226 }
1227
1228 static int parse_want_ref(struct packet_writer *writer, const char *line,
1229                           struct string_list *wanted_refs,
1230                           struct object_array *want_obj)
1231 {
1232         const char *arg;
1233         if (skip_prefix(line, "want-ref ", &arg)) {
1234                 struct object_id oid;
1235                 struct string_list_item *item;
1236                 struct object *o;
1237
1238                 if (read_ref(arg, &oid)) {
1239                         packet_writer_error(writer, "unknown ref %s", arg);
1240                         die("unknown ref %s", arg);
1241                 }
1242
1243                 item = string_list_append(wanted_refs, arg);
1244                 item->util = oiddup(&oid);
1245
1246                 o = parse_object_or_die(&oid, arg);
1247                 if (!(o->flags & WANTED)) {
1248                         o->flags |= WANTED;
1249                         add_object_array(o, NULL, want_obj);
1250                 }
1251
1252                 return 1;
1253         }
1254
1255         return 0;
1256 }
1257
1258 static int parse_have(const char *line, struct oid_array *haves)
1259 {
1260         const char *arg;
1261         if (skip_prefix(line, "have ", &arg)) {
1262                 struct object_id oid;
1263
1264                 if (get_oid_hex(arg, &oid))
1265                         die("git upload-pack: expected SHA1 object, got '%s'", arg);
1266                 oid_array_append(haves, &oid);
1267                 return 1;
1268         }
1269
1270         return 0;
1271 }
1272
1273 static void process_args(struct packet_reader *request,
1274                          struct upload_pack_data *data)
1275 {
1276         while (packet_reader_read(request) == PACKET_READ_NORMAL) {
1277                 const char *arg = request->line;
1278                 const char *p;
1279
1280                 /* process want */
1281                 if (parse_want(&data->writer, arg, &data->want_obj))
1282                         continue;
1283                 if (data->allow_ref_in_want &&
1284                     parse_want_ref(&data->writer, arg, &data->wanted_refs,
1285                                    &data->want_obj))
1286                         continue;
1287                 /* process have line */
1288                 if (parse_have(arg, &data->haves))
1289                         continue;
1290
1291                 /* process args like thin-pack */
1292                 if (!strcmp(arg, "thin-pack")) {
1293                         data->use_thin_pack = 1;
1294                         continue;
1295                 }
1296                 if (!strcmp(arg, "ofs-delta")) {
1297                         data->use_ofs_delta = 1;
1298                         continue;
1299                 }
1300                 if (!strcmp(arg, "no-progress")) {
1301                         data->no_progress = 1;
1302                         continue;
1303                 }
1304                 if (!strcmp(arg, "include-tag")) {
1305                         data->use_include_tag = 1;
1306                         continue;
1307                 }
1308                 if (!strcmp(arg, "done")) {
1309                         data->done = 1;
1310                         continue;
1311                 }
1312
1313                 /* Shallow related arguments */
1314                 if (process_shallow(arg, &data->shallows))
1315                         continue;
1316                 if (process_deepen(arg, &data->depth))
1317                         continue;
1318                 if (process_deepen_since(arg, &data->deepen_since,
1319                                          &data->deepen_rev_list))
1320                         continue;
1321                 if (process_deepen_not(arg, &data->deepen_not,
1322                                        &data->deepen_rev_list))
1323                         continue;
1324                 if (!strcmp(arg, "deepen-relative")) {
1325                         data->deepen_relative = 1;
1326                         continue;
1327                 }
1328
1329                 if (data->allow_filter && skip_prefix(arg, "filter ", &p)) {
1330                         list_objects_filter_die_if_populated(&data->filter_options);
1331                         parse_list_objects_filter(&data->filter_options, p);
1332                         continue;
1333                 }
1334
1335                 if ((git_env_bool("GIT_TEST_SIDEBAND_ALL", 0) ||
1336                      data->allow_sideband_all) &&
1337                     !strcmp(arg, "sideband-all")) {
1338                         data->writer.use_sideband = 1;
1339                         continue;
1340                 }
1341
1342                 /* ignore unknown lines maybe? */
1343                 die("unexpected line: '%s'", arg);
1344         }
1345
1346         if (request->status != PACKET_READ_FLUSH)
1347                 die(_("expected flush after fetch arguments"));
1348 }
1349
1350 static int process_haves(struct upload_pack_data *data, struct oid_array *common)
1351 {
1352         int i;
1353
1354         /* Process haves */
1355         for (i = 0; i < data->haves.nr; i++) {
1356                 const struct object_id *oid = &data->haves.oid[i];
1357                 struct object *o;
1358                 int we_knew_they_have = 0;
1359
1360                 if (!has_object_file(oid))
1361                         continue;
1362
1363                 oid_array_append(common, oid);
1364
1365                 o = parse_object(the_repository, oid);
1366                 if (!o)
1367                         die("oops (%s)", oid_to_hex(oid));
1368                 if (o->type == OBJ_COMMIT) {
1369                         struct commit_list *parents;
1370                         struct commit *commit = (struct commit *)o;
1371                         if (o->flags & THEY_HAVE)
1372                                 we_knew_they_have = 1;
1373                         else
1374                                 o->flags |= THEY_HAVE;
1375                         if (!oldest_have || (commit->date < oldest_have))
1376                                 oldest_have = commit->date;
1377                         for (parents = commit->parents;
1378                              parents;
1379                              parents = parents->next)
1380                                 parents->item->object.flags |= THEY_HAVE;
1381                 }
1382                 if (!we_knew_they_have)
1383                         add_object_array(o, NULL, &data->have_obj);
1384         }
1385
1386         return 0;
1387 }
1388
1389 static int send_acks(struct upload_pack_data *data, struct oid_array *acks)
1390 {
1391         int i;
1392
1393         packet_writer_write(&data->writer, "acknowledgments\n");
1394
1395         /* Send Acks */
1396         if (!acks->nr)
1397                 packet_writer_write(&data->writer, "NAK\n");
1398
1399         for (i = 0; i < acks->nr; i++) {
1400                 packet_writer_write(&data->writer, "ACK %s\n",
1401                                     oid_to_hex(&acks->oid[i]));
1402         }
1403
1404         if (ok_to_give_up(data)) {
1405                 /* Send Ready */
1406                 packet_writer_write(&data->writer, "ready\n");
1407                 return 1;
1408         }
1409
1410         return 0;
1411 }
1412
1413 static int process_haves_and_send_acks(struct upload_pack_data *data)
1414 {
1415         struct oid_array common = OID_ARRAY_INIT;
1416         int ret = 0;
1417
1418         process_haves(data, &common);
1419         if (data->done) {
1420                 ret = 1;
1421         } else if (send_acks(data, &common)) {
1422                 packet_writer_delim(&data->writer);
1423                 ret = 1;
1424         } else {
1425                 /* Add Flush */
1426                 packet_writer_flush(&data->writer);
1427                 ret = 0;
1428         }
1429
1430         oid_array_clear(&data->haves);
1431         oid_array_clear(&common);
1432         return ret;
1433 }
1434
1435 static void send_wanted_ref_info(struct upload_pack_data *data)
1436 {
1437         const struct string_list_item *item;
1438
1439         if (!data->wanted_refs.nr)
1440                 return;
1441
1442         packet_writer_write(&data->writer, "wanted-refs\n");
1443
1444         for_each_string_list_item(item, &data->wanted_refs) {
1445                 packet_writer_write(&data->writer, "%s %s\n",
1446                                     oid_to_hex(item->util),
1447                                     item->string);
1448         }
1449
1450         packet_writer_delim(&data->writer);
1451 }
1452
1453 static void send_shallow_info(struct upload_pack_data *data)
1454 {
1455         /* No shallow info needs to be sent */
1456         if (!data->depth && !data->deepen_rev_list && !data->shallows.nr &&
1457             !is_repository_shallow(the_repository))
1458                 return;
1459
1460         packet_writer_write(&data->writer, "shallow-info\n");
1461
1462         if (!send_shallow_list(data) &&
1463             is_repository_shallow(the_repository))
1464                 deepen(data, INFINITE_DEPTH);
1465
1466         packet_delim(1);
1467 }
1468
1469 enum fetch_state {
1470         FETCH_PROCESS_ARGS = 0,
1471         FETCH_SEND_ACKS,
1472         FETCH_SEND_PACK,
1473         FETCH_DONE,
1474 };
1475
1476 int upload_pack_v2(struct repository *r, struct argv_array *keys,
1477                    struct packet_reader *request)
1478 {
1479         enum fetch_state state = FETCH_PROCESS_ARGS;
1480         struct upload_pack_data data;
1481
1482         clear_object_flags(ALL_FLAGS);
1483
1484         upload_pack_data_init(&data);
1485         data.use_sideband = LARGE_PACKET_MAX;
1486
1487         git_config(upload_pack_config, &data);
1488
1489         while (state != FETCH_DONE) {
1490                 switch (state) {
1491                 case FETCH_PROCESS_ARGS:
1492                         process_args(request, &data);
1493
1494                         if (!data.want_obj.nr) {
1495                                 /*
1496                                  * Request didn't contain any 'want' lines,
1497                                  * guess they didn't want anything.
1498                                  */
1499                                 state = FETCH_DONE;
1500                         } else if (data.haves.nr) {
1501                                 /*
1502                                  * Request had 'have' lines, so lets ACK them.
1503                                  */
1504                                 state = FETCH_SEND_ACKS;
1505                         } else {
1506                                 /*
1507                                  * Request had 'want's but no 'have's so we can
1508                                  * immedietly go to construct and send a pack.
1509                                  */
1510                                 state = FETCH_SEND_PACK;
1511                         }
1512                         break;
1513                 case FETCH_SEND_ACKS:
1514                         if (process_haves_and_send_acks(&data))
1515                                 state = FETCH_SEND_PACK;
1516                         else
1517                                 state = FETCH_DONE;
1518                         break;
1519                 case FETCH_SEND_PACK:
1520                         send_wanted_ref_info(&data);
1521                         send_shallow_info(&data);
1522
1523                         packet_writer_write(&data.writer, "packfile\n");
1524                         create_pack_file(&data);
1525                         state = FETCH_DONE;
1526                         break;
1527                 case FETCH_DONE:
1528                         continue;
1529                 }
1530         }
1531
1532         upload_pack_data_clear(&data);
1533         return 0;
1534 }
1535
1536 int upload_pack_advertise(struct repository *r,
1537                           struct strbuf *value)
1538 {
1539         if (value) {
1540                 int allow_filter_value;
1541                 int allow_ref_in_want;
1542                 int allow_sideband_all_value;
1543
1544                 strbuf_addstr(value, "shallow");
1545
1546                 if (!repo_config_get_bool(the_repository,
1547                                          "uploadpack.allowfilter",
1548                                          &allow_filter_value) &&
1549                     allow_filter_value)
1550                         strbuf_addstr(value, " filter");
1551
1552                 if (!repo_config_get_bool(the_repository,
1553                                          "uploadpack.allowrefinwant",
1554                                          &allow_ref_in_want) &&
1555                     allow_ref_in_want)
1556                         strbuf_addstr(value, " ref-in-want");
1557
1558                 if (git_env_bool("GIT_TEST_SIDEBAND_ALL", 0) ||
1559                     (!repo_config_get_bool(the_repository,
1560                                            "uploadpack.allowsidebandall",
1561                                            &allow_sideband_all_value) &&
1562                      allow_sideband_all_value))
1563                         strbuf_addstr(value, " sideband-all");
1564         }
1565
1566         return 1;
1567 }