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