fetch-pack: move core code to libgit.a

fetch_pack() is used by transport.c, part of libgit.a while it stays in builtin/fetch-pack.c. Move it to fetch-pack.c so that we won't get undefined reference if a program that uses libgit.a happens to pull it in. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Jeff King <peff@peff.net>

Nguyễn Thái Ngọc Duy committed Oct 26, 2012 at 22:53 UTC 745f7a8cacae55df3e00507344d8db2a31eb57e8
3 files changed +952 -948
Makefile
+1
@@ -746,6 +746,7 @@ LIB_OBJS += editor.o
746 LIB_OBJS += entry.o
747 LIB_OBJS += environment.o
748 LIB_OBJS += exec_cmd.o
749 +LIB_OBJS += fetch-pack.o
750 LIB_OBJS += fsck.o
751 LIB_OBJS += gettext.o
752 LIB_OBJS += gpg-interface.o
builtin/fetch-pack.c
-948
@@ -1,899 +1,12 @@
1 #include "builtin.h"
2 -#include "refs.h"
2 #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"
3 #include "fetch-pack.h"
10 -#include "remote.h"
11 -#include "run-command.h"
12 -#include "transport.h"
13 -#include "version.h"
14 -
15 -static int transfer_unpack_limit = -1;
16 -static int fetch_unpack_limit = -1;
17 -static int unpack_limit = 100;
18 -static int prefer_ofs_delta = 1;
19 -static int no_done;
20 -static int fetch_fsck_objects = -1;
21 -static int transfer_fsck_objects = -1;
22 -static int agent_supported;
4
5 static const char fetch_pack_usage[] =
6 "git fetch-pack [--all] [--stdin] [--quiet|-q] [--keep|-k] [--thin] "
7 "[--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] "
8 "[--no-progress] [-v] [<host>:]<directory> [<refs>...]";
9
29 -#define COMPLETE (1U << 0)
30 -#define COMMON (1U << 1)
31 -#define COMMON_REF (1U << 2)
32 -#define SEEN (1U << 3)
33 -#define POPPED (1U << 4)
34 -
35 -static int marked;
36 -
37 -/*
38 - * After sending this many "have"s if we do not get any new ACK , we
39 - * give up traversing our history.
40 - */
41 -#define MAX_IN_VAIN 256
42 -
43 -static struct commit_list *rev_list;
44 -static int non_common_revs, multi_ack, use_sideband;
45 -
46 -static void rev_list_push(struct commit *commit, int mark)
47 -{
48 - if (!(commit->object.flags & mark)) {
49 - commit->object.flags |= mark;
50 -
51 - if (!(commit->object.parsed))
52 - if (parse_commit(commit))
53 - return;
54 -
55 - commit_list_insert_by_date(commit, &rev_list);
56 -
57 - if (!(commit->object.flags & COMMON))
58 - non_common_revs++;
59 - }
60 -}
61 -
62 -static int rev_list_insert_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
63 -{
64 - struct object *o = deref_tag(parse_object(sha1), refname, 0);
65 -
66 - if (o && o->type == OBJ_COMMIT)
67 - rev_list_push((struct commit *)o, SEEN);
68 -
69 - return 0;
70 -}
71 -
72 -static int clear_marks(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
73 -{
74 - struct object *o = deref_tag(parse_object(sha1), refname, 0);
75 -
76 - if (o && o->type == OBJ_COMMIT)
77 - clear_commit_marks((struct commit *)o,
78 - COMMON | COMMON_REF | SEEN | POPPED);
79 - return 0;
80 -}
81 -
82 -/*
83 - This function marks a rev and its ancestors as common.
84 - In some cases, it is desirable to mark only the ancestors (for example
85 - when only the server does not yet know that they are common).
86 -*/
87 -
88 -static void mark_common(struct commit *commit,
89 - int ancestors_only, int dont_parse)
90 -{
91 - if (commit != NULL && !(commit->object.flags & COMMON)) {
92 - struct object *o = (struct object *)commit;
93 -
94 - if (!ancestors_only)
95 - o->flags |= COMMON;
96 -
97 - if (!(o->flags & SEEN))
98 - rev_list_push(commit, SEEN);
99 - else {
100 - struct commit_list *parents;
101 -
102 - if (!ancestors_only && !(o->flags & POPPED))
103 - non_common_revs--;
104 - if (!o->parsed && !dont_parse)
105 - if (parse_commit(commit))
106 - return;
107 -
108 - for (parents = commit->parents;
109 - parents;
110 - parents = parents->next)
111 - mark_common(parents->item, 0, dont_parse);
112 - }
113 - }
114 -}
115 -
116 -/*
117 - Get the next rev to send, ignoring the common.
118 -*/
119 -
120 -static const unsigned char *get_rev(void)
121 -{
122 - struct commit *commit = NULL;
123 -
124 - while (commit == NULL) {
125 - unsigned int mark;
126 - struct commit_list *parents;
127 -
128 - if (rev_list == NULL || non_common_revs == 0)
129 - return NULL;
130 -
131 - commit = rev_list->item;
132 - if (!commit->object.parsed)
133 - parse_commit(commit);
134 - parents = commit->parents;
135 -
136 - commit->object.flags |= POPPED;
137 - if (!(commit->object.flags & COMMON))
138 - non_common_revs--;
139 -
140 - if (commit->object.flags & COMMON) {
141 - /* do not send "have", and ignore ancestors */
142 - commit = NULL;
143 - mark = COMMON | SEEN;
144 - } else if (commit->object.flags & COMMON_REF)
145 - /* send "have", and ignore ancestors */
146 - mark = COMMON | SEEN;
147 - else
148 - /* send "have", also for its ancestors */
149 - mark = SEEN;
150 -
151 - while (parents) {
152 - if (!(parents->item->object.flags & SEEN))
153 - rev_list_push(parents->item, mark);
154 - if (mark & COMMON)
155 - mark_common(parents->item, 1, 0);
156 - parents = parents->next;
157 - }
158 -
159 - rev_list = rev_list->next;
160 - }
161 -
162 - return commit->object.sha1;
163 -}
164 -
165 -enum ack_type {
166 - NAK = 0,
167 - ACK,
168 - ACK_continue,
169 - ACK_common,
170 - ACK_ready
171 -};
172 -
173 -static void consume_shallow_list(struct fetch_pack_args *args, int fd)
174 -{
175 - if (args->stateless_rpc && args->depth > 0) {
176 - /* If we sent a depth we will get back "duplicate"
177 - * shallow and unshallow commands every time there
178 - * is a block of have lines exchanged.
179 - */
180 - char line[1000];
181 - while (packet_read_line(fd, line, sizeof(line))) {
182 - if (!prefixcmp(line, "shallow "))
183 - continue;
184 - if (!prefixcmp(line, "unshallow "))
185 - continue;
186 - die("git fetch-pack: expected shallow list");
187 - }
188 - }
189 -}
190 -
191 -struct write_shallow_data {
192 - struct strbuf *out;
193 - int use_pack_protocol;
194 - int count;
195 -};
196 -
197 -static int write_one_shallow(const struct commit_graft *graft, void *cb_data)
198 -{
199 - struct write_shallow_data *data = cb_data;
200 - const char *hex = sha1_to_hex(graft->sha1);
201 - data->count++;
202 - if (data->use_pack_protocol)
203 - packet_buf_write(data->out, "shallow %s", hex);
204 - else {
205 - strbuf_addstr(data->out, hex);
206 - strbuf_addch(data->out, '\n');
207 - }
208 - return 0;
209 -}
210 -
211 -static int write_shallow_commits(struct strbuf *out, int use_pack_protocol)
212 -{
213 - struct write_shallow_data data;
214 - data.out = out;
215 - data.use_pack_protocol = use_pack_protocol;
216 - data.count = 0;
217 - for_each_commit_graft(write_one_shallow, &data);
218 - return data.count;
219 -}
220 -
221 -static enum ack_type get_ack(int fd, unsigned char *result_sha1)
222 -{
223 - static char line[1000];
224 - int len = packet_read_line(fd, line, sizeof(line));
225 -
226 - if (!len)
227 - die("git fetch-pack: expected ACK/NAK, got EOF");
228 - if (line[len-1] == '\n')
229 - line[--len] = 0;
230 - if (!strcmp(line, "NAK"))
231 - return NAK;
232 - if (!prefixcmp(line, "ACK ")) {
233 - if (!get_sha1_hex(line+4, result_sha1)) {
234 - if (strstr(line+45, "continue"))
235 - return ACK_continue;
236 - if (strstr(line+45, "common"))
237 - return ACK_common;
238 - if (strstr(line+45, "ready"))
239 - return ACK_ready;
240 - return ACK;
241 - }
242 - }
243 - die("git fetch_pack: expected ACK/NAK, got '%s'", line);
244 -}
245 -
246 -static void send_request(struct fetch_pack_args *args,
247 - int fd, struct strbuf *buf)
248 -{
249 - if (args->stateless_rpc) {
250 - send_sideband(fd, -1, buf->buf, buf->len, LARGE_PACKET_MAX);
251 - packet_flush(fd);
252 - } else
253 - safe_write(fd, buf->buf, buf->len);
254 -}
255 -
256 -static void insert_one_alternate_ref(const struct ref *ref, void *unused)
257 -{
258 - rev_list_insert_ref(NULL, ref->old_sha1, 0, NULL);
259 -}
260 -
261 -#define INITIAL_FLUSH 16
262 -#define PIPESAFE_FLUSH 32
263 -#define LARGE_FLUSH 1024
264 -
265 -static int next_flush(struct fetch_pack_args *args, int count)
266 -{
267 - int flush_limit = args->stateless_rpc ? LARGE_FLUSH : PIPESAFE_FLUSH;
268 -
269 - if (count < flush_limit)
270 - count <<= 1;
271 - else
272 - count += flush_limit;
273 - return count;
274 -}
275 -
276 -static int find_common(struct fetch_pack_args *args,
277 - int fd[2], unsigned char *result_sha1,
278 - struct ref *refs)
279 -{
280 - int fetching;
281 - int count = 0, flushes = 0, flush_at = INITIAL_FLUSH, retval;
282 - const unsigned char *sha1;
283 - unsigned in_vain = 0;
284 - int got_continue = 0;
285 - int got_ready = 0;
286 - struct strbuf req_buf = STRBUF_INIT;
287 - size_t state_len = 0;
288 -
289 - if (args->stateless_rpc && multi_ack == 1)
290 - die("--stateless-rpc requires multi_ack_detailed");
291 - if (marked)
292 - for_each_ref(clear_marks, NULL);
293 - marked = 1;
294 -
295 - for_each_ref(rev_list_insert_ref, NULL);
296 - for_each_alternate_ref(insert_one_alternate_ref, NULL);
297 -
298 - fetching = 0;
299 - for ( ; refs ; refs = refs->next) {
300 - unsigned char *remote = refs->old_sha1;
301 - const char *remote_hex;
302 - struct object *o;
303 -
304 - /*
305 - * If that object is complete (i.e. it is an ancestor of a
306 - * local ref), we tell them we have it but do not have to
307 - * tell them about its ancestors, which they already know
308 - * about.
309 - *
310 - * We use lookup_object here because we are only
311 - * interested in the case we *know* the object is
312 - * reachable and we have already scanned it.
313 - */
314 - if (((o = lookup_object(remote)) != NULL) &&
315 - (o->flags & COMPLETE)) {
316 - continue;
317 - }
318 -
319 - remote_hex = sha1_to_hex(remote);
320 - if (!fetching) {
321 - struct strbuf c = STRBUF_INIT;
322 - if (multi_ack == 2) strbuf_addstr(&c, " multi_ack_detailed");
323 - if (multi_ack == 1) strbuf_addstr(&c, " multi_ack");
324 - if (no_done) strbuf_addstr(&c, " no-done");
325 - if (use_sideband == 2) strbuf_addstr(&c, " side-band-64k");
326 - if (use_sideband == 1) strbuf_addstr(&c, " side-band");
327 - if (args->use_thin_pack) strbuf_addstr(&c, " thin-pack");
328 - if (args->no_progress) strbuf_addstr(&c, " no-progress");
329 - if (args->include_tag) strbuf_addstr(&c, " include-tag");
330 - if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta");
331 - if (agent_supported) strbuf_addf(&c, " agent=%s",
332 - git_user_agent_sanitized());
333 - packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
334 - strbuf_release(&c);
335 - } else
336 - packet_buf_write(&req_buf, "want %s\n", remote_hex);
337 - fetching++;
338 - }
339 -
340 - if (!fetching) {
341 - strbuf_release(&req_buf);
342 - packet_flush(fd[1]);
343 - return 1;
344 - }
345 -
346 - if (is_repository_shallow())
347 - write_shallow_commits(&req_buf, 1);
348 - if (args->depth > 0)
349 - packet_buf_write(&req_buf, "deepen %d", args->depth);
350 - packet_buf_flush(&req_buf);
351 - state_len = req_buf.len;
352 -
353 - if (args->depth > 0) {
354 - char line[1024];
355 - unsigned char sha1[20];
356 -
357 - send_request(args, fd[1], &req_buf);
358 - while (packet_read_line(fd[0], line, sizeof(line))) {
359 - if (!prefixcmp(line, "shallow ")) {
360 - if (get_sha1_hex(line + 8, sha1))
361 - die("invalid shallow line: %s", line);
362 - register_shallow(sha1);
363 - continue;
364 - }
365 - if (!prefixcmp(line, "unshallow ")) {
366 - if (get_sha1_hex(line + 10, sha1))
367 - die("invalid unshallow line: %s", line);
368 - if (!lookup_object(sha1))
369 - die("object not found: %s", line);
370 - /* make sure that it is parsed as shallow */
371 - if (!parse_object(sha1))
372 - die("error in object: %s", line);
373 - if (unregister_shallow(sha1))
374 - die("no shallow found: %s", line);
375 - continue;
376 - }
377 - die("expected shallow/unshallow, got %s", line);
378 - }
379 - } else if (!args->stateless_rpc)
380 - send_request(args, fd[1], &req_buf);
381 -
382 - if (!args->stateless_rpc) {
383 - /* If we aren't using the stateless-rpc interface
384 - * we don't need to retain the headers.
385 - */
386 - strbuf_setlen(&req_buf, 0);
387 - state_len = 0;
388 - }
389 -
390 - flushes = 0;
391 - retval = -1;
392 - while ((sha1 = get_rev())) {
393 - packet_buf_write(&req_buf, "have %s\n", sha1_to_hex(sha1));
394 - if (args->verbose)
395 - fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
396 - in_vain++;
397 - if (flush_at <= ++count) {
398 - int ack;
399 -
400 - packet_buf_flush(&req_buf);
401 - send_request(args, fd[1], &req_buf);
402 - strbuf_setlen(&req_buf, state_len);
403 - flushes++;
404 - flush_at = next_flush(args, count);
405 -
406 - /*
407 - * We keep one window "ahead" of the other side, and
408 - * will wait for an ACK only on the next one
409 - */
410 - if (!args->stateless_rpc && count == INITIAL_FLUSH)
411 - continue;
412 -
413 - consume_shallow_list(args, fd[0]);
414 - do {
415 - ack = get_ack(fd[0], result_sha1);
416 - if (args->verbose && ack)
417 - fprintf(stderr, "got ack %d %s\n", ack,
418 - sha1_to_hex(result_sha1));
419 - switch (ack) {
420 - case ACK:
421 - flushes = 0;
422 - multi_ack = 0;
423 - retval = 0;
424 - goto done;
425 - case ACK_common:
426 - case ACK_ready:
427 - case ACK_continue: {
428 - struct commit *commit =
429 - lookup_commit(result_sha1);
430 - if (!commit)
431 - die("invalid commit %s", sha1_to_hex(result_sha1));
432 - if (args->stateless_rpc
433 - && ack == ACK_common
434 - && !(commit->object.flags & COMMON)) {
435 - /* We need to replay the have for this object
436 - * on the next RPC request so the peer knows
437 - * it is in common with us.
438 - */
439 - const char *hex = sha1_to_hex(result_sha1);
440 - packet_buf_write(&req_buf, "have %s\n", hex);
441 - state_len = req_buf.len;
442 - }
443 - mark_common(commit, 0, 1);
444 - retval = 0;
445 - in_vain = 0;
446 - got_continue = 1;
447 - if (ack == ACK_ready) {
448 - rev_list = NULL;
449 - got_ready = 1;
450 - }
451 - break;
452 - }
453 - }
454 - } while (ack);
455 - flushes--;
456 - if (got_continue && MAX_IN_VAIN < in_vain) {
457 - if (args->verbose)
458 - fprintf(stderr, "giving up\n");
459 - break; /* give up */
460 - }
461 - }
462 - }
463 -done:
464 - if (!got_ready || !no_done) {
465 - packet_buf_write(&req_buf, "done\n");
466 - send_request(args, fd[1], &req_buf);
467 - }
468 - if (args->verbose)
469 - fprintf(stderr, "done\n");
470 - if (retval != 0) {
471 - multi_ack = 0;
472 - flushes++;
473 - }
474 - strbuf_release(&req_buf);
475 -
476 - consume_shallow_list(args, fd[0]);
477 - while (flushes || multi_ack) {
478 - int ack = get_ack(fd[0], result_sha1);
479 - if (ack) {
480 - if (args->verbose)
481 - fprintf(stderr, "got ack (%d) %s\n", ack,
482 - sha1_to_hex(result_sha1));
483 - if (ack == ACK)
484 - return 0;
485 - multi_ack = 1;
486 - continue;
487 - }
488 - flushes--;
489 - }
490 - /* it is no error to fetch into a completely empty repo */
491 - return count ? retval : 0;
492 -}
493 -
494 -static struct commit_list *complete;
495 -
496 -static int mark_complete(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
497 -{
498 - struct object *o = parse_object(sha1);
499 -
500 - while (o && o->type == OBJ_TAG) {
501 - struct tag *t = (struct tag *) o;
502 - if (!t->tagged)
503 - break; /* broken repository */
504 - o->flags |= COMPLETE;
505 - o = parse_object(t->tagged->sha1);
506 - }
507 - if (o && o->type == OBJ_COMMIT) {
508 - struct commit *commit = (struct commit *)o;
509 - if (!(commit->object.flags & COMPLETE)) {
510 - commit->object.flags |= COMPLETE;
511 - commit_list_insert_by_date(commit, &complete);
512 - }
513 - }
514 - return 0;
515 -}
516 -
517 -static void mark_recent_complete_commits(struct fetch_pack_args *args,
518 - unsigned long cutoff)
519 -{
520 - while (complete && cutoff <= complete->item->date) {
521 - if (args->verbose)
522 - fprintf(stderr, "Marking %s as complete\n",
523 - sha1_to_hex(complete->item->object.sha1));
524 - pop_most_recent_commit(&complete, COMPLETE);
525 - }
526 -}
527 -
528 -static int non_matching_ref(struct string_list_item *item, void *unused)
529 -{
530 - if (item->util) {
531 - item->util = NULL;
532 - return 0;
533 - }
534 - else
535 - return 1;
536 -}
537 -
538 -static void filter_refs(struct fetch_pack_args *args,
539 - struct ref **refs, struct string_list *sought)
540 -{
541 - struct ref *newlist = NULL;
542 - struct ref **newtail = &newlist;
543 - struct ref *ref, *next;
544 - int sought_pos;
545 -
546 - sought_pos = 0;
547 - for (ref = *refs; ref; ref = next) {
548 - int keep = 0;
549 - next = ref->next;
550 - if (!memcmp(ref->name, "refs/", 5) &&
551 - check_refname_format(ref->name + 5, 0))
552 - ; /* trash */
553 - else {
554 - while (sought_pos < sought->nr) {
555 - int cmp = strcmp(ref->name, sought->items[sought_pos].string);
556 - if (cmp < 0)
557 - break; /* definitely do not have it */
558 - else if (cmp == 0) {
559 - keep = 1; /* definitely have it */
560 - sought->items[sought_pos++].util = "matched";
561 - break;
562 - }
563 - else
564 - sought_pos++; /* might have it; keep looking */
565 - }
566 - }
567 -
568 - if (! keep && args->fetch_all &&
569 - (!args->depth || prefixcmp(ref->name, "refs/tags/")))
570 - keep = 1;
571 -
572 - if (keep) {
573 - *newtail = ref;
574 - ref->next = NULL;
575 - newtail = &ref->next;
576 - } else {
577 - free(ref);
578 - }
579 - }
580 -
581 - filter_string_list(sought, 0, non_matching_ref, NULL);
582 - *refs = newlist;
583 -}
584 -
585 -static void mark_alternate_complete(const struct ref *ref, void *unused)
586 -{
587 - mark_complete(NULL, ref->old_sha1, 0, NULL);
588 -}
589 -
590 -static int everything_local(struct fetch_pack_args *args,
591 - struct ref **refs, struct string_list *sought)
592 -{
593 - struct ref *ref;
594 - int retval;
595 - unsigned long cutoff = 0;
596 -
597 - save_commit_buffer = 0;
598 -
599 - for (ref = *refs; ref; ref = ref->next) {
600 - struct object *o;
601 -
602 - o = parse_object(ref->old_sha1);
603 - if (!o)
604 - continue;
605 -
606 - /* We already have it -- which may mean that we were
607 - * in sync with the other side at some time after
608 - * that (it is OK if we guess wrong here).
609 - */
610 - if (o->type == OBJ_COMMIT) {
611 - struct commit *commit = (struct commit *)o;
612 - if (!cutoff || cutoff < commit->date)
613 - cutoff = commit->date;
614 - }
615 - }
616 -
617 - if (!args->depth) {
618 - for_each_ref(mark_complete, NULL);
619 - for_each_alternate_ref(mark_alternate_complete, NULL);
620 - if (cutoff)
621 - mark_recent_complete_commits(args, cutoff);
622 - }
623 -
624 - /*
625 - * Mark all complete remote refs as common refs.
626 - * Don't mark them common yet; the server has to be told so first.
627 - */
628 - for (ref = *refs; ref; ref = ref->next) {
629 - struct object *o = deref_tag(lookup_object(ref->old_sha1),
630 - NULL, 0);
631 -
632 - if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
633 - continue;
634 -
635 - if (!(o->flags & SEEN)) {
636 - rev_list_push((struct commit *)o, COMMON_REF | SEEN);
637 -
638 - mark_common((struct commit *)o, 1, 1);
639 - }
640 - }
641 -
642 - filter_refs(args, refs, sought);
643 -
644 - for (retval = 1, ref = *refs; ref ; ref = ref->next) {
645 - const unsigned char *remote = ref->old_sha1;
646 - unsigned char local[20];
647 - struct object *o;
648 -
649 - o = lookup_object(remote);
650 - if (!o || !(o->flags & COMPLETE)) {
651 - retval = 0;
652 - if (!args->verbose)
653 - continue;
654 - fprintf(stderr,
655 - "want %s (%s)\n", sha1_to_hex(remote),
656 - ref->name);
657 - continue;
658 - }
659 -
660 - hashcpy(ref->new_sha1, local);
661 - if (!args->verbose)
662 - continue;
663 - fprintf(stderr,
664 - "already have %s (%s)\n", sha1_to_hex(remote),
665 - ref->name);
666 - }
667 - return retval;
668 -}
669 -
670 -static int sideband_demux(int in, int out, void *data)
671 -{
672 - int *xd = data;
673 -
674 - int ret = recv_sideband("fetch-pack", xd[0], out);
675 - close(out);
676 - return ret;
677 -}
678 -
679 -static int get_pack(struct fetch_pack_args *args,
680 - int xd[2], char **pack_lockfile)
681 -{
682 - struct async demux;
683 - const char *argv[20];
684 - char keep_arg[256];
685 - char hdr_arg[256];
686 - const char **av;
687 - int do_keep = args->keep_pack;
688 - struct child_process cmd;
689 -
690 - memset(&demux, 0, sizeof(demux));
691 - if (use_sideband) {
692 - /* xd[] is talking with upload-pack; subprocess reads from
693 - * xd[0], spits out band#2 to stderr, and feeds us band#1
694 - * through demux->out.
695 - */
696 - demux.proc = sideband_demux;
697 - demux.data = xd;
698 - demux.out = -1;
699 - if (start_async(&demux))
700 - die("fetch-pack: unable to fork off sideband"
701 - " demultiplexer");
702 - }
703 - else
704 - demux.out = xd[0];
705 -
706 - memset(&cmd, 0, sizeof(cmd));
707 - cmd.argv = argv;
708 - av = argv;
709 - *hdr_arg = 0;
710 - if (!args->keep_pack && unpack_limit) {
711 - struct pack_header header;
712 -
713 - if (read_pack_header(demux.out, &header))
714 - die("protocol error: bad pack header");
715 - snprintf(hdr_arg, sizeof(hdr_arg),
716 - "--pack_header=%"PRIu32",%"PRIu32,
717 - ntohl(header.hdr_version), ntohl(header.hdr_entries));
718 - if (ntohl(header.hdr_entries) < unpack_limit)
719 - do_keep = 0;
720 - else
721 - do_keep = 1;
722 - }
723 -
724 - if (do_keep) {
725 - if (pack_lockfile)
726 - cmd.out = -1;
727 - *av++ = "index-pack";
728 - *av++ = "--stdin";
729 - if (!args->quiet && !args->no_progress)
730 - *av++ = "-v";
731 - if (args->use_thin_pack)
732 - *av++ = "--fix-thin";
733 - if (args->lock_pack || unpack_limit) {
734 - int s = sprintf(keep_arg,
735 - "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
736 - if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
737 - strcpy(keep_arg + s, "localhost");
738 - *av++ = keep_arg;
739 - }
740 - }
741 - else {
742 - *av++ = "unpack-objects";
743 - if (args->quiet || args->no_progress)
744 - *av++ = "-q";
745 - }
746 - if (*hdr_arg)
747 - *av++ = hdr_arg;
748 - if (fetch_fsck_objects >= 0
749 - ? fetch_fsck_objects
750 - : transfer_fsck_objects >= 0
751 - ? transfer_fsck_objects
752 - : 0)
753 - *av++ = "--strict";
754 - *av++ = NULL;
755 -
756 - cmd.in = demux.out;
757 - cmd.git_cmd = 1;
758 - if (start_command(&cmd))
759 - die("fetch-pack: unable to fork off %s", argv[0]);
760 - if (do_keep && pack_lockfile) {
761 - *pack_lockfile = index_pack_lockfile(cmd.out);
762 - close(cmd.out);
763 - }
764 -
765 - if (finish_command(&cmd))
766 - die("%s failed", argv[0]);
767 - if (use_sideband && finish_async(&demux))
768 - die("error in sideband demultiplexer");
769 - return 0;
770 -}
771 -
772 -static struct ref *do_fetch_pack(struct fetch_pack_args *args,
773 - int fd[2],
774 - const struct ref *orig_ref,
775 - struct string_list *sought,
776 - char **pack_lockfile)
777 -{
778 - struct ref *ref = copy_ref_list(orig_ref);
779 - unsigned char sha1[20];
780 - const char *agent_feature;
781 - int agent_len;
782 -
783 - sort_ref_list(&ref, ref_compare_name);
784 -
785 - if (is_repository_shallow() && !server_supports("shallow"))
786 - die("Server does not support shallow clients");
787 - if (server_supports("multi_ack_detailed")) {
788 - if (args->verbose)
789 - fprintf(stderr, "Server supports multi_ack_detailed\n");
790 - multi_ack = 2;
791 - if (server_supports("no-done")) {
792 - if (args->verbose)
793 - fprintf(stderr, "Server supports no-done\n");
794 - if (args->stateless_rpc)
795 - no_done = 1;
796 - }
797 - }
798 - else if (server_supports("multi_ack")) {
799 - if (args->verbose)
800 - fprintf(stderr, "Server supports multi_ack\n");
801 - multi_ack = 1;
802 - }
803 - if (server_supports("side-band-64k")) {
804 - if (args->verbose)
805 - fprintf(stderr, "Server supports side-band-64k\n");
806 - use_sideband = 2;
807 - }
808 - else if (server_supports("side-band")) {
809 - if (args->verbose)
810 - fprintf(stderr, "Server supports side-band\n");
811 - use_sideband = 1;
812 - }
813 - if (!server_supports("thin-pack"))
814 - args->use_thin_pack = 0;
815 - if (!server_supports("no-progress"))
816 - args->no_progress = 0;
817 - if (!server_supports("include-tag"))
818 - args->include_tag = 0;
819 - if (server_supports("ofs-delta")) {
820 - if (args->verbose)
821 - fprintf(stderr, "Server supports ofs-delta\n");
822 - } else
823 - prefer_ofs_delta = 0;
824 -
825 - if ((agent_feature = server_feature_value("agent", &agent_len))) {
826 - agent_supported = 1;
827 - if (args->verbose && agent_len)
828 - fprintf(stderr, "Server version is %.*s\n",
829 - agent_len, agent_feature);
830 - }
831 -
832 - if (everything_local(args, &ref, sought)) {
833 - packet_flush(fd[1]);
834 - goto all_done;
835 - }
836 - if (find_common(args, fd, sha1, ref) < 0)
837 - if (!args->keep_pack)
838 - /* When cloning, it is not unusual to have
839 - * no common commit.
840 - */
841 - warning("no common commits");
842 -
843 - if (args->stateless_rpc)
844 - packet_flush(fd[1]);
845 - if (get_pack(args, fd, pack_lockfile))
846 - die("git fetch-pack: fetch failed.");
847 -
848 - all_done:
849 - return ref;
850 -}
851 -
852 -static int fetch_pack_config(const char *var, const char *value, void *cb)
853 -{
854 - if (strcmp(var, "fetch.unpacklimit") == 0) {
855 - fetch_unpack_limit = git_config_int(var, value);
856 - return 0;
857 - }
858 -
859 - if (strcmp(var, "transfer.unpacklimit") == 0) {
860 - transfer_unpack_limit = git_config_int(var, value);
861 - return 0;
862 - }
863 -
864 - if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
865 - prefer_ofs_delta = git_config_bool(var, value);
866 - return 0;
867 - }
868 -
869 - if (!strcmp(var, "fetch.fsckobjects")) {
870 - fetch_fsck_objects = git_config_bool(var, value);
871 - return 0;
872 - }
873 -
874 - if (!strcmp(var, "transfer.fsckobjects")) {
875 - transfer_fsck_objects = git_config_bool(var, value);
876 - return 0;
877 - }
878 -
879 - return git_default_config(var, value, cb);
880 -}
881 -
882 -static struct lock_file lock;
883 -
884 -static void fetch_pack_setup(void)
885 -{
886 - static int did_setup;
887 - if (did_setup)
888 - return;
889 - git_config(fetch_pack_config, NULL);
890 - if (0 <= transfer_unpack_limit)
891 - unpack_limit = transfer_unpack_limit;
892 - else if (0 <= fetch_unpack_limit)
893 - unpack_limit = fetch_unpack_limit;
894 - did_setup = 1;
895 -}
896 -
10 int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
11 {
12 int i, ret;
@@ -1046,64 +159,3 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
159
160 return ret;
161 }
1049 -
1050 -struct ref *fetch_pack(struct fetch_pack_args *args,
1051 - int fd[], struct child_process *conn,
1052 - const struct ref *ref,
1053 - const char *dest,
1054 - struct string_list *sought,
1055 - char **pack_lockfile)
1056 -{
1057 - struct stat st;
1058 - struct ref *ref_cpy;
1059 -
1060 - fetch_pack_setup();
1061 - if (args->depth > 0) {
1062 - if (stat(git_path("shallow"), &st))
1063 - st.st_mtime = 0;
1064 - }
1065 -
1066 - if (sought->nr) {
1067 - sort_string_list(sought);
1068 - string_list_remove_duplicates(sought, 0);
1069 - }
1070 -
1071 - if (!ref) {
1072 - packet_flush(fd[1]);
1073 - die("no matching remote head");
1074 - }
1075 - ref_cpy = do_fetch_pack(args, fd, ref, sought, pack_lockfile);
1076 -
1077 - if (args->depth > 0) {
1078 - struct cache_time mtime;
1079 - struct strbuf sb = STRBUF_INIT;
1080 - char *shallow = git_path("shallow");
1081 - int fd;
1082 -
1083 - mtime.sec = st.st_mtime;
1084 - mtime.nsec = ST_MTIME_NSEC(st);
1085 - if (stat(shallow, &st)) {
1086 - if (mtime.sec)
1087 - die("shallow file was removed during fetch");
1088 - } else if (st.st_mtime != mtime.sec
1089 -#ifdef USE_NSEC
1090 - || ST_MTIME_NSEC(st) != mtime.nsec
1091 -#endif
1092 - )
1093 - die("shallow file was changed during fetch");
1094 -
1095 - fd = hold_lock_file_for_update(&lock, shallow,
1096 - LOCK_DIE_ON_ERROR);
1097 - if (!write_shallow_commits(&sb, 0)
1098 - || write_in_full(fd, sb.buf, sb.len) != sb.len) {
1099 - unlink_or_warn(shallow);
1100 - rollback_lock_file(&lock);
1101 - } else {
1102 - commit_lock_file(&lock);
1103 - }
1104 - strbuf_release(&sb);
1105 - }
1106 -
1107 - reprepare_packed_git();
1108 - return ref_cpy;
1109 -}
fetch-pack.c new
+951
@@ -0,0 +1,951 @@
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"
12 +#include "transport.h"
13 +#include "version.h"
14 +
15 +static int transfer_unpack_limit = -1;
16 +static int fetch_unpack_limit = -1;
17 +static int unpack_limit = 100;
18 +static int prefer_ofs_delta = 1;
19 +static int no_done;
20 +static int fetch_fsck_objects = -1;
21 +static int transfer_fsck_objects = -1;
22 +static int agent_supported;
23 +
24 +#define COMPLETE (1U << 0)
25 +#define COMMON (1U << 1)
26 +#define COMMON_REF (1U << 2)
27 +#define SEEN (1U << 3)
28 +#define POPPED (1U << 4)
29 +
30 +static int marked;
31 +
32 +/*
33 + * After sending this many "have"s if we do not get any new ACK , we
34 + * give up traversing our history.
35 + */
36 +#define MAX_IN_VAIN 256
37 +
38 +static struct commit_list *rev_list;
39 +static int non_common_revs, multi_ack, use_sideband;
40 +
41 +static void rev_list_push(struct commit *commit, int mark)
42 +{
43 + if (!(commit->object.flags & mark)) {
44 + commit->object.flags |= mark;
45 +
46 + if (!(commit->object.parsed))
47 + if (parse_commit(commit))
48 + return;
49 +
50 + commit_list_insert_by_date(commit, &rev_list);
51 +
52 + if (!(commit->object.flags & COMMON))
53 + non_common_revs++;
54 + }
55 +}
56 +
57 +static int rev_list_insert_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
58 +{
59 + struct object *o = deref_tag(parse_object(sha1), refname, 0);
60 +
61 + if (o && o->type == OBJ_COMMIT)
62 + rev_list_push((struct commit *)o, SEEN);
63 +
64 + return 0;
65 +}
66 +
67 +static int clear_marks(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
68 +{
69 + struct object *o = deref_tag(parse_object(sha1), refname, 0);
70 +
71 + if (o && o->type == OBJ_COMMIT)
72 + clear_commit_marks((struct commit *)o,
73 + COMMON | COMMON_REF | SEEN | POPPED);
74 + return 0;
75 +}
76 +
77 +/*
78 + This function marks a rev and its ancestors as common.
79 + In some cases, it is desirable to mark only the ancestors (for example
80 + when only the server does not yet know that they are common).
81 +*/
82 +
83 +static void mark_common(struct commit *commit,
84 + int ancestors_only, int dont_parse)
85 +{
86 + if (commit != NULL && !(commit->object.flags & COMMON)) {
87 + struct object *o = (struct object *)commit;
88 +
89 + if (!ancestors_only)
90 + o->flags |= COMMON;
91 +
92 + if (!(o->flags & SEEN))
93 + rev_list_push(commit, SEEN);
94 + else {
95 + struct commit_list *parents;
96 +
97 + if (!ancestors_only && !(o->flags & POPPED))
98 + non_common_revs--;
99 + if (!o->parsed && !dont_parse)
100 + if (parse_commit(commit))
101 + return;
102 +
103 + for (parents = commit->parents;
104 + parents;
105 + parents = parents->next)
106 + mark_common(parents->item, 0, dont_parse);
107 + }
108 + }
109 +}
110 +
111 +/*
112 + Get the next rev to send, ignoring the common.
113 +*/
114 +
115 +static const unsigned char *get_rev(void)
116 +{
117 + struct commit *commit = NULL;
118 +
119 + while (commit == NULL) {
120 + unsigned int mark;
121 + struct commit_list *parents;
122 +
123 + if (rev_list == NULL || non_common_revs == 0)
124 + return NULL;
125 +
126 + commit = rev_list->item;
127 + if (!commit->object.parsed)
128 + parse_commit(commit);
129 + parents = commit->parents;
130 +
131 + commit->object.flags |= POPPED;
132 + if (!(commit->object.flags & COMMON))
133 + non_common_revs--;
134 +
135 + if (commit->object.flags & COMMON) {
136 + /* do not send "have", and ignore ancestors */
137 + commit = NULL;
138 + mark = COMMON | SEEN;
139 + } else if (commit->object.flags & COMMON_REF)
140 + /* send "have", and ignore ancestors */
141 + mark = COMMON | SEEN;
142 + else
143 + /* send "have", also for its ancestors */
144 + mark = SEEN;
145 +
146 + while (parents) {
147 + if (!(parents->item->object.flags & SEEN))
148 + rev_list_push(parents->item, mark);
149 + if (mark & COMMON)
150 + mark_common(parents->item, 1, 0);
151 + parents = parents->next;
152 + }
153 +
154 + rev_list = rev_list->next;
155 + }
156 +
157 + return commit->object.sha1;
158 +}
159 +
160 +enum ack_type {
161 + NAK = 0,
162 + ACK,
163 + ACK_continue,
164 + ACK_common,
165 + ACK_ready
166 +};
167 +
168 +static void consume_shallow_list(struct fetch_pack_args *args, int fd)
169 +{
170 + if (args->stateless_rpc && args->depth > 0) {
171 + /* If we sent a depth we will get back "duplicate"
172 + * shallow and unshallow commands every time there
173 + * is a block of have lines exchanged.
174 + */
175 + char line[1000];
176 + while (packet_read_line(fd, line, sizeof(line))) {
177 + if (!prefixcmp(line, "shallow "))
178 + continue;
179 + if (!prefixcmp(line, "unshallow "))
180 + continue;
181 + die("git fetch-pack: expected shallow list");
182 + }
183 + }
184 +}
185 +
186 +struct write_shallow_data {
187 + struct strbuf *out;
188 + int use_pack_protocol;
189 + int count;
190 +};
191 +
192 +static int write_one_shallow(const struct commit_graft *graft, void *cb_data)
193 +{
194 + struct write_shallow_data *data = cb_data;
195 + const char *hex = sha1_to_hex(graft->sha1);
196 + data->count++;
197 + if (data->use_pack_protocol)
198 + packet_buf_write(data->out, "shallow %s", hex);
199 + else {
200 + strbuf_addstr(data->out, hex);
201 + strbuf_addch(data->out, '\n');
202 + }
203 + return 0;
204 +}
205 +
206 +static int write_shallow_commits(struct strbuf *out, int use_pack_protocol)
207 +{
208 + struct write_shallow_data data;
209 + data.out = out;
210 + data.use_pack_protocol = use_pack_protocol;
211 + data.count = 0;
212 + for_each_commit_graft(write_one_shallow, &data);
213 + return data.count;
214 +}
215 +
216 +static enum ack_type get_ack(int fd, unsigned char *result_sha1)
217 +{
218 + static char line[1000];
219 + int len = packet_read_line(fd, line, sizeof(line));
220 +
221 + if (!len)
222 + die("git fetch-pack: expected ACK/NAK, got EOF");
223 + if (line[len-1] == '\n')
224 + line[--len] = 0;
225 + if (!strcmp(line, "NAK"))
226 + return NAK;
227 + if (!prefixcmp(line, "ACK ")) {
228 + if (!get_sha1_hex(line+4, result_sha1)) {
229 + if (strstr(line+45, "continue"))
230 + return ACK_continue;
231 + if (strstr(line+45, "common"))
232 + return ACK_common;
233 + if (strstr(line+45, "ready"))
234 + return ACK_ready;
235 + return ACK;
236 + }
237 + }
238 + die("git fetch_pack: expected ACK/NAK, got '%s'", line);
239 +}
240 +
241 +static void send_request(struct fetch_pack_args *args,
242 + int fd, struct strbuf *buf)
243 +{
244 + if (args->stateless_rpc) {
245 + send_sideband(fd, -1, buf->buf, buf->len, LARGE_PACKET_MAX);
246 + packet_flush(fd);
247 + } else
248 + safe_write(fd, buf->buf, buf->len);
249 +}
250 +
251 +static void insert_one_alternate_ref(const struct ref *ref, void *unused)
252 +{
253 + rev_list_insert_ref(NULL, ref->old_sha1, 0, NULL);
254 +}
255 +
256 +#define INITIAL_FLUSH 16
257 +#define PIPESAFE_FLUSH 32
258 +#define LARGE_FLUSH 1024
259 +
260 +static int next_flush(struct fetch_pack_args *args, int count)
261 +{
262 + int flush_limit = args->stateless_rpc ? LARGE_FLUSH : PIPESAFE_FLUSH;
263 +
264 + if (count < flush_limit)
265 + count <<= 1;
266 + else
267 + count += flush_limit;
268 + return count;
269 +}
270 +
271 +static int find_common(struct fetch_pack_args *args,
272 + int fd[2], unsigned char *result_sha1,
273 + struct ref *refs)
274 +{
275 + int fetching;
276 + int count = 0, flushes = 0, flush_at = INITIAL_FLUSH, retval;
277 + const unsigned char *sha1;
278 + unsigned in_vain = 0;
279 + int got_continue = 0;
280 + int got_ready = 0;
281 + struct strbuf req_buf = STRBUF_INIT;
282 + size_t state_len = 0;
283 +
284 + if (args->stateless_rpc && multi_ack == 1)
285 + die("--stateless-rpc requires multi_ack_detailed");
286 + if (marked)
287 + for_each_ref(clear_marks, NULL);
288 + marked = 1;
289 +
290 + for_each_ref(rev_list_insert_ref, NULL);
291 + for_each_alternate_ref(insert_one_alternate_ref, NULL);
292 +
293 + fetching = 0;
294 + for ( ; refs ; refs = refs->next) {
295 + unsigned char *remote = refs->old_sha1;
296 + const char *remote_hex;
297 + struct object *o;
298 +
299 + /*
300 + * If that object is complete (i.e. it is an ancestor of a
301 + * local ref), we tell them we have it but do not have to
302 + * tell them about its ancestors, which they already know
303 + * about.
304 + *
305 + * We use lookup_object here because we are only
306 + * interested in the case we *know* the object is
307 + * reachable and we have already scanned it.
308 + */
309 + if (((o = lookup_object(remote)) != NULL) &&
310 + (o->flags & COMPLETE)) {
311 + continue;
312 + }
313 +
314 + remote_hex = sha1_to_hex(remote);
315 + if (!fetching) {
316 + struct strbuf c = STRBUF_INIT;
317 + if (multi_ack == 2) strbuf_addstr(&c, " multi_ack_detailed");
318 + if (multi_ack == 1) strbuf_addstr(&c, " multi_ack");
319 + if (no_done) strbuf_addstr(&c, " no-done");
320 + if (use_sideband == 2) strbuf_addstr(&c, " side-band-64k");
321 + if (use_sideband == 1) strbuf_addstr(&c, " side-band");
322 + if (args->use_thin_pack) strbuf_addstr(&c, " thin-pack");
323 + if (args->no_progress) strbuf_addstr(&c, " no-progress");
324 + if (args->include_tag) strbuf_addstr(&c, " include-tag");
325 + if (prefer_ofs_delta) strbuf_addstr(&c, " ofs-delta");
326 + if (agent_supported) strbuf_addf(&c, " agent=%s",
327 + git_user_agent_sanitized());
328 + packet_buf_write(&req_buf, "want %s%s\n", remote_hex, c.buf);
329 + strbuf_release(&c);
330 + } else
331 + packet_buf_write(&req_buf, "want %s\n", remote_hex);
332 + fetching++;
333 + }
334 +
335 + if (!fetching) {
336 + strbuf_release(&req_buf);
337 + packet_flush(fd[1]);
338 + return 1;
339 + }
340 +
341 + if (is_repository_shallow())
342 + write_shallow_commits(&req_buf, 1);
343 + if (args->depth > 0)
344 + packet_buf_write(&req_buf, "deepen %d", args->depth);
345 + packet_buf_flush(&req_buf);
346 + state_len = req_buf.len;
347 +
348 + if (args->depth > 0) {
349 + char line[1024];
350 + unsigned char sha1[20];
351 +
352 + send_request(args, fd[1], &req_buf);
353 + while (packet_read_line(fd[0], line, sizeof(line))) {
354 + if (!prefixcmp(line, "shallow ")) {
355 + if (get_sha1_hex(line + 8, sha1))
356 + die("invalid shallow line: %s", line);
357 + register_shallow(sha1);
358 + continue;
359 + }
360 + if (!prefixcmp(line, "unshallow ")) {
361 + if (get_sha1_hex(line + 10, sha1))
362 + die("invalid unshallow line: %s", line);
363 + if (!lookup_object(sha1))
364 + die("object not found: %s", line);
365 + /* make sure that it is parsed as shallow */
366 + if (!parse_object(sha1))
367 + die("error in object: %s", line);
368 + if (unregister_shallow(sha1))
369 + die("no shallow found: %s", line);
370 + continue;
371 + }
372 + die("expected shallow/unshallow, got %s", line);
373 + }
374 + } else if (!args->stateless_rpc)
375 + send_request(args, fd[1], &req_buf);
376 +
377 + if (!args->stateless_rpc) {
378 + /* If we aren't using the stateless-rpc interface
379 + * we don't need to retain the headers.
380 + */
381 + strbuf_setlen(&req_buf, 0);
382 + state_len = 0;
383 + }
384 +
385 + flushes = 0;
386 + retval = -1;
387 + while ((sha1 = get_rev())) {
388 + packet_buf_write(&req_buf, "have %s\n", sha1_to_hex(sha1));
389 + if (args->verbose)
390 + fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
391 + in_vain++;
392 + if (flush_at <= ++count) {
393 + int ack;
394 +
395 + packet_buf_flush(&req_buf);
396 + send_request(args, fd[1], &req_buf);
397 + strbuf_setlen(&req_buf, state_len);
398 + flushes++;
399 + flush_at = next_flush(args, count);
400 +
401 + /*
402 + * We keep one window "ahead" of the other side, and
403 + * will wait for an ACK only on the next one
404 + */
405 + if (!args->stateless_rpc && count == INITIAL_FLUSH)
406 + continue;
407 +
408 + consume_shallow_list(args, fd[0]);
409 + do {
410 + ack = get_ack(fd[0], result_sha1);
411 + if (args->verbose && ack)
412 + fprintf(stderr, "got ack %d %s\n", ack,
413 + sha1_to_hex(result_sha1));
414 + switch (ack) {
415 + case ACK:
416 + flushes = 0;
417 + multi_ack = 0;
418 + retval = 0;
419 + goto done;
420 + case ACK_common:
421 + case ACK_ready:
422 + case ACK_continue: {
423 + struct commit *commit =
424 + lookup_commit(result_sha1);
425 + if (!commit)
426 + die("invalid commit %s", sha1_to_hex(result_sha1));
427 + if (args->stateless_rpc
428 + && ack == ACK_common
429 + && !(commit->object.flags & COMMON)) {
430 + /* We need to replay the have for this object
431 + * on the next RPC request so the peer knows
432 + * it is in common with us.
433 + */
434 + const char *hex = sha1_to_hex(result_sha1);
435 + packet_buf_write(&req_buf, "have %s\n", hex);
436 + state_len = req_buf.len;
437 + }
438 + mark_common(commit, 0, 1);
439 + retval = 0;
440 + in_vain = 0;
441 + got_continue = 1;
442 + if (ack == ACK_ready) {
443 + rev_list = NULL;
444 + got_ready = 1;
445 + }
446 + break;
447 + }
448 + }
449 + } while (ack);
450 + flushes--;
451 + if (got_continue && MAX_IN_VAIN < in_vain) {
452 + if (args->verbose)
453 + fprintf(stderr, "giving up\n");
454 + break; /* give up */
455 + }
456 + }
457 + }
458 +done:
459 + if (!got_ready || !no_done) {
460 + packet_buf_write(&req_buf, "done\n");
461 + send_request(args, fd[1], &req_buf);
462 + }
463 + if (args->verbose)
464 + fprintf(stderr, "done\n");
465 + if (retval != 0) {
466 + multi_ack = 0;
467 + flushes++;
468 + }
469 + strbuf_release(&req_buf);
470 +
471 + consume_shallow_list(args, fd[0]);
472 + while (flushes || multi_ack) {
473 + int ack = get_ack(fd[0], result_sha1);
474 + if (ack) {
475 + if (args->verbose)
476 + fprintf(stderr, "got ack (%d) %s\n", ack,
477 + sha1_to_hex(result_sha1));
478 + if (ack == ACK)
479 + return 0;
480 + multi_ack = 1;
481 + continue;
482 + }
483 + flushes--;
484 + }
485 + /* it is no error to fetch into a completely empty repo */
486 + return count ? retval : 0;
487 +}
488 +
489 +static struct commit_list *complete;
490 +
491 +static int mark_complete(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
492 +{
493 + struct object *o = parse_object(sha1);
494 +
495 + while (o && o->type == OBJ_TAG) {
496 + struct tag *t = (struct tag *) o;
497 + if (!t->tagged)
498 + break; /* broken repository */
499 + o->flags |= COMPLETE;
500 + o = parse_object(t->tagged->sha1);
501 + }
502 + if (o && o->type == OBJ_COMMIT) {
503 + struct commit *commit = (struct commit *)o;
504 + if (!(commit->object.flags & COMPLETE)) {
505 + commit->object.flags |= COMPLETE;
506 + commit_list_insert_by_date(commit, &complete);
507 + }
508 + }
509 + return 0;
510 +}
511 +
512 +static void mark_recent_complete_commits(struct fetch_pack_args *args,
513 + unsigned long cutoff)
514 +{
515 + while (complete && cutoff <= complete->item->date) {
516 + if (args->verbose)
517 + fprintf(stderr, "Marking %s as complete\n",
518 + sha1_to_hex(complete->item->object.sha1));
519 + pop_most_recent_commit(&complete, COMPLETE);
520 + }
521 +}
522 +
523 +static int non_matching_ref(struct string_list_item *item, void *unused)
524 +{
525 + if (item->util) {
526 + item->util = NULL;
527 + return 0;
528 + }
529 + else
530 + return 1;
531 +}
532 +
533 +static void filter_refs(struct fetch_pack_args *args,
534 + struct ref **refs, struct string_list *sought)
535 +{
536 + struct ref *newlist = NULL;
537 + struct ref **newtail = &newlist;
538 + struct ref *ref, *next;
539 + int sought_pos;
540 +
541 + sought_pos = 0;
542 + for (ref = *refs; ref; ref = next) {
543 + int keep = 0;
544 + next = ref->next;
545 + if (!memcmp(ref->name, "refs/", 5) &&
546 + check_refname_format(ref->name + 5, 0))
547 + ; /* trash */
548 + else {
549 + while (sought_pos < sought->nr) {
550 + int cmp = strcmp(ref->name, sought->items[sought_pos].string);
551 + if (cmp < 0)
552 + break; /* definitely do not have it */
553 + else if (cmp == 0) {
554 + keep = 1; /* definitely have it */
555 + sought->items[sought_pos++].util = "matched";
556 + break;
557 + }
558 + else
559 + sought_pos++; /* might have it; keep looking */
560 + }
561 + }
562 +
563 + if (! keep && args->fetch_all &&
564 + (!args->depth || prefixcmp(ref->name, "refs/tags/")))
565 + keep = 1;
566 +
567 + if (keep) {
568 + *newtail = ref;
569 + ref->next = NULL;
570 + newtail = &ref->next;
571 + } else {
572 + free(ref);
573 + }
574 + }
575 +
576 + filter_string_list(sought, 0, non_matching_ref, NULL);
577 + *refs = newlist;
578 +}
579 +
580 +static void mark_alternate_complete(const struct ref *ref, void *unused)
581 +{
582 + mark_complete(NULL, ref->old_sha1, 0, NULL);
583 +}
584 +
585 +static int everything_local(struct fetch_pack_args *args,
586 + struct ref **refs, struct string_list *sought)
587 +{
588 + struct ref *ref;
589 + int retval;
590 + unsigned long cutoff = 0;
591 +
592 + save_commit_buffer = 0;
593 +
594 + for (ref = *refs; ref; ref = ref->next) {
595 + struct object *o;
596 +
597 + o = parse_object(ref->old_sha1);
598 + if (!o)
599 + continue;
600 +
601 + /* We already have it -- which may mean that we were
602 + * in sync with the other side at some time after
603 + * that (it is OK if we guess wrong here).
604 + */
605 + if (o->type == OBJ_COMMIT) {
606 + struct commit *commit = (struct commit *)o;
607 + if (!cutoff || cutoff < commit->date)
608 + cutoff = commit->date;
609 + }
610 + }
611 +
612 + if (!args->depth) {
613 + for_each_ref(mark_complete, NULL);
614 + for_each_alternate_ref(mark_alternate_complete, NULL);
615 + if (cutoff)
616 + mark_recent_complete_commits(args, cutoff);
617 + }
618 +
619 + /*
620 + * Mark all complete remote refs as common refs.
621 + * Don't mark them common yet; the server has to be told so first.
622 + */
623 + for (ref = *refs; ref; ref = ref->next) {
624 + struct object *o = deref_tag(lookup_object(ref->old_sha1),
625 + NULL, 0);
626 +
627 + if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
628 + continue;
629 +
630 + if (!(o->flags & SEEN)) {
631 + rev_list_push((struct commit *)o, COMMON_REF | SEEN);
632 +
633 + mark_common((struct commit *)o, 1, 1);
634 + }
635 + }
636 +
637 + filter_refs(args, refs, sought);
638 +
639 + for (retval = 1, ref = *refs; ref ; ref = ref->next) {
640 + const unsigned char *remote = ref->old_sha1;
641 + unsigned char local[20];
642 + struct object *o;
643 +
644 + o = lookup_object(remote);
645 + if (!o || !(o->flags & COMPLETE)) {
646 + retval = 0;
647 + if (!args->verbose)
648 + continue;
649 + fprintf(stderr,
650 + "want %s (%s)\n", sha1_to_hex(remote),
651 + ref->name);
652 + continue;
653 + }
654 +
655 + hashcpy(ref->new_sha1, local);
656 + if (!args->verbose)
657 + continue;
658 + fprintf(stderr,
659 + "already have %s (%s)\n", sha1_to_hex(remote),
660 + ref->name);
661 + }
662 + return retval;
663 +}
664 +
665 +static int sideband_demux(int in, int out, void *data)
666 +{
667 + int *xd = data;
668 +
669 + int ret = recv_sideband("fetch-pack", xd[0], out);
670 + close(out);
671 + return ret;
672 +}
673 +
674 +static int get_pack(struct fetch_pack_args *args,
675 + int xd[2], char **pack_lockfile)
676 +{
677 + struct async demux;
678 + const char *argv[20];
679 + char keep_arg[256];
680 + char hdr_arg[256];
681 + const char **av;
682 + int do_keep = args->keep_pack;
683 + struct child_process cmd;
684 +
685 + memset(&demux, 0, sizeof(demux));
686 + if (use_sideband) {
687 + /* xd[] is talking with upload-pack; subprocess reads from
688 + * xd[0], spits out band#2 to stderr, and feeds us band#1
689 + * through demux->out.
690 + */
691 + demux.proc = sideband_demux;
692 + demux.data = xd;
693 + demux.out = -1;
694 + if (start_async(&demux))
695 + die("fetch-pack: unable to fork off sideband"
696 + " demultiplexer");
697 + }
698 + else
699 + demux.out = xd[0];
700 +
701 + memset(&cmd, 0, sizeof(cmd));
702 + cmd.argv = argv;
703 + av = argv;
704 + *hdr_arg = 0;
705 + if (!args->keep_pack && unpack_limit) {
706 + struct pack_header header;
707 +
708 + if (read_pack_header(demux.out, &header))
709 + die("protocol error: bad pack header");
710 + snprintf(hdr_arg, sizeof(hdr_arg),
711 + "--pack_header=%"PRIu32",%"PRIu32,
712 + ntohl(header.hdr_version), ntohl(header.hdr_entries));
713 + if (ntohl(header.hdr_entries) < unpack_limit)
714 + do_keep = 0;
715 + else
716 + do_keep = 1;
717 + }
718 +
719 + if (do_keep) {
720 + if (pack_lockfile)
721 + cmd.out = -1;
722 + *av++ = "index-pack";
723 + *av++ = "--stdin";
724 + if (!args->quiet && !args->no_progress)
725 + *av++ = "-v";
726 + if (args->use_thin_pack)
727 + *av++ = "--fix-thin";
728 + if (args->lock_pack || unpack_limit) {
729 + int s = sprintf(keep_arg,
730 + "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
731 + if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
732 + strcpy(keep_arg + s, "localhost");
733 + *av++ = keep_arg;
734 + }
735 + }
736 + else {
737 + *av++ = "unpack-objects";
738 + if (args->quiet || args->no_progress)
739 + *av++ = "-q";
740 + }
741 + if (*hdr_arg)
742 + *av++ = hdr_arg;
743 + if (fetch_fsck_objects >= 0
744 + ? fetch_fsck_objects
745 + : transfer_fsck_objects >= 0
746 + ? transfer_fsck_objects
747 + : 0)
748 + *av++ = "--strict";
749 + *av++ = NULL;
750 +
751 + cmd.in = demux.out;
752 + cmd.git_cmd = 1;
753 + if (start_command(&cmd))
754 + die("fetch-pack: unable to fork off %s", argv[0]);
755 + if (do_keep && pack_lockfile) {
756 + *pack_lockfile = index_pack_lockfile(cmd.out);
757 + close(cmd.out);
758 + }
759 +
760 + if (finish_command(&cmd))
761 + die("%s failed", argv[0]);
762 + if (use_sideband && finish_async(&demux))
763 + die("error in sideband demultiplexer");
764 + return 0;
765 +}
766 +
767 +static struct ref *do_fetch_pack(struct fetch_pack_args *args,
768 + int fd[2],
769 + const struct ref *orig_ref,
770 + struct string_list *sought,
771 + char **pack_lockfile)
772 +{
773 + struct ref *ref = copy_ref_list(orig_ref);
774 + unsigned char sha1[20];
775 + const char *agent_feature;
776 + int agent_len;
777 +
778 + sort_ref_list(&ref, ref_compare_name);
779 +
780 + if (is_repository_shallow() && !server_supports("shallow"))
781 + die("Server does not support shallow clients");
782 + if (server_supports("multi_ack_detailed")) {
783 + if (args->verbose)
784 + fprintf(stderr, "Server supports multi_ack_detailed\n");
785 + multi_ack = 2;
786 + if (server_supports("no-done")) {
787 + if (args->verbose)
788 + fprintf(stderr, "Server supports no-done\n");
789 + if (args->stateless_rpc)
790 + no_done = 1;
791 + }
792 + }
793 + else if (server_supports("multi_ack")) {
794 + if (args->verbose)
795 + fprintf(stderr, "Server supports multi_ack\n");
796 + multi_ack = 1;
797 + }
798 + if (server_supports("side-band-64k")) {
799 + if (args->verbose)
800 + fprintf(stderr, "Server supports side-band-64k\n");
801 + use_sideband = 2;
802 + }
803 + else if (server_supports("side-band")) {
804 + if (args->verbose)
805 + fprintf(stderr, "Server supports side-band\n");
806 + use_sideband = 1;
807 + }
808 + if (!server_supports("thin-pack"))
809 + args->use_thin_pack = 0;
810 + if (!server_supports("no-progress"))
811 + args->no_progress = 0;
812 + if (!server_supports("include-tag"))
813 + args->include_tag = 0;
814 + if (server_supports("ofs-delta")) {
815 + if (args->verbose)
816 + fprintf(stderr, "Server supports ofs-delta\n");
817 + } else
818 + prefer_ofs_delta = 0;
819 +
820 + if ((agent_feature = server_feature_value("agent", &agent_len))) {
821 + agent_supported = 1;
822 + if (args->verbose && agent_len)
823 + fprintf(stderr, "Server version is %.*s\n",
824 + agent_len, agent_feature);
825 + }
826 +
827 + if (everything_local(args, &ref, sought)) {
828 + packet_flush(fd[1]);
829 + goto all_done;
830 + }
831 + if (find_common(args, fd, sha1, ref) < 0)
832 + if (!args->keep_pack)
833 + /* When cloning, it is not unusual to have
834 + * no common commit.
835 + */
836 + warning("no common commits");
837 +
838 + if (args->stateless_rpc)
839 + packet_flush(fd[1]);
840 + if (get_pack(args, fd, pack_lockfile))
841 + die("git fetch-pack: fetch failed.");
842 +
843 + all_done:
844 + return ref;
845 +}
846 +
847 +static int fetch_pack_config(const char *var, const char *value, void *cb)
848 +{
849 + if (strcmp(var, "fetch.unpacklimit") == 0) {
850 + fetch_unpack_limit = git_config_int(var, value);
851 + return 0;
852 + }
853 +
854 + if (strcmp(var, "transfer.unpacklimit") == 0) {
855 + transfer_unpack_limit = git_config_int(var, value);
856 + return 0;
857 + }
858 +
859 + if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
860 + prefer_ofs_delta = git_config_bool(var, value);
861 + return 0;
862 + }
863 +
864 + if (!strcmp(var, "fetch.fsckobjects")) {
865 + fetch_fsck_objects = git_config_bool(var, value);
866 + return 0;
867 + }
868 +
869 + if (!strcmp(var, "transfer.fsckobjects")) {
870 + transfer_fsck_objects = git_config_bool(var, value);
871 + return 0;
872 + }
873 +
874 + return git_default_config(var, value, cb);
875 +}
876 +
877 +static struct lock_file lock;
878 +
879 +static void fetch_pack_setup(void)
880 +{
881 + static int did_setup;
882 + if (did_setup)
883 + return;
884 + git_config(fetch_pack_config, NULL);
885 + if (0 <= transfer_unpack_limit)
886 + unpack_limit = transfer_unpack_limit;
887 + else if (0 <= fetch_unpack_limit)
888 + unpack_limit = fetch_unpack_limit;
889 + did_setup = 1;
890 +}
891 +
892 +struct ref *fetch_pack(struct fetch_pack_args *args,
893 + int fd[], struct child_process *conn,
894 + const struct ref *ref,
895 + const char *dest,
896 + struct string_list *sought,
897 + char **pack_lockfile)
898 +{
899 + struct stat st;
900 + struct ref *ref_cpy;
901 +
902 + fetch_pack_setup();
903 + if (args->depth > 0) {
904 + if (stat(git_path("shallow"), &st))
905 + st.st_mtime = 0;
906 + }
907 +
908 + if (sought->nr) {
909 + sort_string_list(sought);
910 + string_list_remove_duplicates(sought, 0);
911 + }
912 +
913 + if (!ref) {
914 + packet_flush(fd[1]);
915 + die("no matching remote head");
916 + }
917 + ref_cpy = do_fetch_pack(args, fd, ref, sought, pack_lockfile);
918 +
919 + if (args->depth > 0) {
920 + struct cache_time mtime;
921 + struct strbuf sb = STRBUF_INIT;
922 + char *shallow = git_path("shallow");
923 + int fd;
924 +
925 + mtime.sec = st.st_mtime;
926 + mtime.nsec = ST_MTIME_NSEC(st);
927 + if (stat(shallow, &st)) {
928 + if (mtime.sec)
929 + die("shallow file was removed during fetch");
930 + } else if (st.st_mtime != mtime.sec
931 +#ifdef USE_NSEC
932 + || ST_MTIME_NSEC(st) != mtime.nsec
933 +#endif
934 + )
935 + die("shallow file was changed during fetch");
936 +
937 + fd = hold_lock_file_for_update(&lock, shallow,
938 + LOCK_DIE_ON_ERROR);
939 + if (!write_shallow_commits(&sb, 0)
940 + || write_in_full(fd, sb.buf, sb.len) != sb.len) {
941 + unlink_or_warn(shallow);
942 + rollback_lock_file(&lock);
943 + } else {
944 + commit_lock_file(&lock);
945 + }
946 + strbuf_release(&sb);
947 + }
948 +
949 + reprepare_packed_git();
950 + return ref_cpy;
951 +}