git-svn: error out when the SVN connection fails during a fetch
[git/fastimport.git] / fetch-pack.c
blob0a169dce8574102a03c978bb24f8d0664f1fc9b6
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 "sideband.h"
8 #include <sys/wait.h>
10 static int keep_pack;
11 static int quiet;
12 static int verbose;
13 static int fetch_all;
14 static const char fetch_pack_usage[] =
15 "git-fetch-pack [--all] [-q] [-v] [-k] [--thin] [--exec=upload-pack] [host:]directory <refs>...";
16 static const char *exec = "git-upload-pack";
18 #define COMPLETE (1U << 0)
19 #define COMMON (1U << 1)
20 #define COMMON_REF (1U << 2)
21 #define SEEN (1U << 3)
22 #define POPPED (1U << 4)
25 * After sending this many "have"s if we do not get any new ACK , we
26 * give up traversing our history.
28 #define MAX_IN_VAIN 256
30 static struct commit_list *rev_list;
31 static int non_common_revs, multi_ack, use_thin_pack, use_sideband;
33 static void rev_list_push(struct commit *commit, int mark)
35 if (!(commit->object.flags & mark)) {
36 commit->object.flags |= mark;
38 if (!(commit->object.parsed))
39 parse_commit(commit);
41 insert_by_date(commit, &rev_list);
43 if (!(commit->object.flags & COMMON))
44 non_common_revs++;
48 static int rev_list_insert_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
50 struct object *o = deref_tag(parse_object(sha1), path, 0);
52 if (o && o->type == OBJ_COMMIT)
53 rev_list_push((struct commit *)o, SEEN);
55 return 0;
59 This function marks a rev and its ancestors as common.
60 In some cases, it is desirable to mark only the ancestors (for example
61 when only the server does not yet know that they are common).
64 static void mark_common(struct commit *commit,
65 int ancestors_only, int dont_parse)
67 if (commit != NULL && !(commit->object.flags & COMMON)) {
68 struct object *o = (struct object *)commit;
70 if (!ancestors_only)
71 o->flags |= COMMON;
73 if (!(o->flags & SEEN))
74 rev_list_push(commit, SEEN);
75 else {
76 struct commit_list *parents;
78 if (!ancestors_only && !(o->flags & POPPED))
79 non_common_revs--;
80 if (!o->parsed && !dont_parse)
81 parse_commit(commit);
83 for (parents = commit->parents;
84 parents;
85 parents = parents->next)
86 mark_common(parents->item, 0, dont_parse);
92 Get the next rev to send, ignoring the common.
95 static const unsigned char* get_rev(void)
97 struct commit *commit = NULL;
99 while (commit == NULL) {
100 unsigned int mark;
101 struct commit_list* parents;
103 if (rev_list == NULL || non_common_revs == 0)
104 return NULL;
106 commit = rev_list->item;
107 if (!(commit->object.parsed))
108 parse_commit(commit);
109 commit->object.flags |= POPPED;
110 if (!(commit->object.flags & COMMON))
111 non_common_revs--;
113 parents = commit->parents;
115 if (commit->object.flags & COMMON) {
116 /* do not send "have", and ignore ancestors */
117 commit = NULL;
118 mark = COMMON | SEEN;
119 } else if (commit->object.flags & COMMON_REF)
120 /* send "have", and ignore ancestors */
121 mark = COMMON | SEEN;
122 else
123 /* send "have", also for its ancestors */
124 mark = SEEN;
126 while (parents) {
127 if (!(parents->item->object.flags & SEEN))
128 rev_list_push(parents->item, mark);
129 if (mark & COMMON)
130 mark_common(parents->item, 1, 0);
131 parents = parents->next;
134 rev_list = rev_list->next;
137 return commit->object.sha1;
140 static int find_common(int fd[2], unsigned char *result_sha1,
141 struct ref *refs)
143 int fetching;
144 int count = 0, flushes = 0, retval;
145 const unsigned char *sha1;
146 unsigned in_vain = 0;
147 int got_continue = 0;
149 for_each_ref(rev_list_insert_ref, NULL);
151 fetching = 0;
152 for ( ; refs ; refs = refs->next) {
153 unsigned char *remote = refs->old_sha1;
154 struct object *o;
157 * If that object is complete (i.e. it is an ancestor of a
158 * local ref), we tell them we have it but do not have to
159 * tell them about its ancestors, which they already know
160 * about.
162 * We use lookup_object here because we are only
163 * interested in the case we *know* the object is
164 * reachable and we have already scanned it.
166 if (((o = lookup_object(remote)) != NULL) &&
167 (o->flags & COMPLETE)) {
168 continue;
171 if (!fetching)
172 packet_write(fd[1], "want %s%s%s%s%s%s\n",
173 sha1_to_hex(remote),
174 (multi_ack ? " multi_ack" : ""),
175 (use_sideband == 2 ? " side-band-64k" : ""),
176 (use_sideband == 1 ? " side-band" : ""),
177 (use_thin_pack ? " thin-pack" : ""),
178 " ofs-delta");
179 else
180 packet_write(fd[1], "want %s\n", sha1_to_hex(remote));
181 fetching++;
183 packet_flush(fd[1]);
184 if (!fetching)
185 return 1;
187 flushes = 0;
188 retval = -1;
189 while ((sha1 = get_rev())) {
190 packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
191 if (verbose)
192 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
193 in_vain++;
194 if (!(31 & ++count)) {
195 int ack;
197 packet_flush(fd[1]);
198 flushes++;
201 * We keep one window "ahead" of the other side, and
202 * will wait for an ACK only on the next one
204 if (count == 32)
205 continue;
207 do {
208 ack = get_ack(fd[0], result_sha1);
209 if (verbose && ack)
210 fprintf(stderr, "got ack %d %s\n", ack,
211 sha1_to_hex(result_sha1));
212 if (ack == 1) {
213 flushes = 0;
214 multi_ack = 0;
215 retval = 0;
216 goto done;
217 } else if (ack == 2) {
218 struct commit *commit =
219 lookup_commit(result_sha1);
220 mark_common(commit, 0, 1);
221 retval = 0;
222 in_vain = 0;
223 got_continue = 1;
225 } while (ack);
226 flushes--;
227 if (got_continue && MAX_IN_VAIN < in_vain) {
228 if (verbose)
229 fprintf(stderr, "giving up\n");
230 break; /* give up */
234 done:
235 packet_write(fd[1], "done\n");
236 if (verbose)
237 fprintf(stderr, "done\n");
238 if (retval != 0) {
239 multi_ack = 0;
240 flushes++;
242 while (flushes || multi_ack) {
243 int ack = get_ack(fd[0], result_sha1);
244 if (ack) {
245 if (verbose)
246 fprintf(stderr, "got ack (%d) %s\n", ack,
247 sha1_to_hex(result_sha1));
248 if (ack == 1)
249 return 0;
250 multi_ack = 1;
251 continue;
253 flushes--;
255 return retval;
258 static struct commit_list *complete;
260 static int mark_complete(const char *path, const unsigned char *sha1, int flag, void *cb_data)
262 struct object *o = parse_object(sha1);
264 while (o && o->type == OBJ_TAG) {
265 struct tag *t = (struct tag *) o;
266 if (!t->tagged)
267 break; /* broken repository */
268 o->flags |= COMPLETE;
269 o = parse_object(t->tagged->sha1);
271 if (o && o->type == OBJ_COMMIT) {
272 struct commit *commit = (struct commit *)o;
273 commit->object.flags |= COMPLETE;
274 insert_by_date(commit, &complete);
276 return 0;
279 static void mark_recent_complete_commits(unsigned long cutoff)
281 while (complete && cutoff <= complete->item->date) {
282 if (verbose)
283 fprintf(stderr, "Marking %s as complete\n",
284 sha1_to_hex(complete->item->object.sha1));
285 pop_most_recent_commit(&complete, COMPLETE);
289 static void filter_refs(struct ref **refs, int nr_match, char **match)
291 struct ref **return_refs;
292 struct ref *newlist = NULL;
293 struct ref **newtail = &newlist;
294 struct ref *ref, *next;
295 struct ref *fastarray[32];
297 if (nr_match && !fetch_all) {
298 if (ARRAY_SIZE(fastarray) < nr_match)
299 return_refs = xcalloc(nr_match, sizeof(struct ref *));
300 else {
301 return_refs = fastarray;
302 memset(return_refs, 0, sizeof(struct ref *) * nr_match);
305 else
306 return_refs = NULL;
308 for (ref = *refs; ref; ref = next) {
309 next = ref->next;
310 if (!memcmp(ref->name, "refs/", 5) &&
311 check_ref_format(ref->name + 5))
312 ; /* trash */
313 else if (fetch_all) {
314 *newtail = ref;
315 ref->next = NULL;
316 newtail = &ref->next;
317 continue;
319 else {
320 int order = path_match(ref->name, nr_match, match);
321 if (order) {
322 return_refs[order-1] = ref;
323 continue; /* we will link it later */
326 free(ref);
329 if (!fetch_all) {
330 int i;
331 for (i = 0; i < nr_match; i++) {
332 ref = return_refs[i];
333 if (ref) {
334 *newtail = ref;
335 ref->next = NULL;
336 newtail = &ref->next;
339 if (return_refs != fastarray)
340 free(return_refs);
342 *refs = newlist;
345 static int everything_local(struct ref **refs, int nr_match, char **match)
347 struct ref *ref;
348 int retval;
349 unsigned long cutoff = 0;
351 track_object_refs = 0;
352 save_commit_buffer = 0;
354 for (ref = *refs; ref; ref = ref->next) {
355 struct object *o;
357 o = parse_object(ref->old_sha1);
358 if (!o)
359 continue;
361 /* We already have it -- which may mean that we were
362 * in sync with the other side at some time after
363 * that (it is OK if we guess wrong here).
365 if (o->type == OBJ_COMMIT) {
366 struct commit *commit = (struct commit *)o;
367 if (!cutoff || cutoff < commit->date)
368 cutoff = commit->date;
372 for_each_ref(mark_complete, NULL);
373 if (cutoff)
374 mark_recent_complete_commits(cutoff);
377 * Mark all complete remote refs as common refs.
378 * Don't mark them common yet; the server has to be told so first.
380 for (ref = *refs; ref; ref = ref->next) {
381 struct object *o = deref_tag(lookup_object(ref->old_sha1),
382 NULL, 0);
384 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
385 continue;
387 if (!(o->flags & SEEN)) {
388 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
390 mark_common((struct commit *)o, 1, 1);
394 filter_refs(refs, nr_match, match);
396 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
397 const unsigned char *remote = ref->old_sha1;
398 unsigned char local[20];
399 struct object *o;
401 o = lookup_object(remote);
402 if (!o || !(o->flags & COMPLETE)) {
403 retval = 0;
404 if (!verbose)
405 continue;
406 fprintf(stderr,
407 "want %s (%s)\n", sha1_to_hex(remote),
408 ref->name);
409 continue;
412 hashcpy(ref->new_sha1, local);
413 if (!verbose)
414 continue;
415 fprintf(stderr,
416 "already have %s (%s)\n", sha1_to_hex(remote),
417 ref->name);
419 return retval;
422 static pid_t setup_sideband(int fd[2], int xd[2])
424 pid_t side_pid;
426 if (!use_sideband) {
427 fd[0] = xd[0];
428 fd[1] = xd[1];
429 return 0;
431 /* xd[] is talking with upload-pack; subprocess reads from
432 * xd[0], spits out band#2 to stderr, and feeds us band#1
433 * through our fd[0].
435 if (pipe(fd) < 0)
436 die("fetch-pack: unable to set up pipe");
437 side_pid = fork();
438 if (side_pid < 0)
439 die("fetch-pack: unable to fork off sideband demultiplexer");
440 if (!side_pid) {
441 /* subprocess */
442 close(fd[0]);
443 if (xd[0] != xd[1])
444 close(xd[1]);
445 if (recv_sideband("fetch-pack", xd[0], fd[1], 2))
446 exit(1);
447 exit(0);
449 close(xd[0]);
450 close(fd[1]);
451 fd[1] = xd[1];
452 return side_pid;
455 static int get_pack(int xd[2], const char **argv)
457 int status;
458 pid_t pid, side_pid;
459 int fd[2];
461 side_pid = setup_sideband(fd, xd);
462 pid = fork();
463 if (pid < 0)
464 die("fetch-pack: unable to fork off %s", argv[0]);
465 if (!pid) {
466 dup2(fd[0], 0);
467 close(fd[0]);
468 close(fd[1]);
469 execv_git_cmd(argv);
470 die("%s exec failed", argv[0]);
472 close(fd[0]);
473 close(fd[1]);
474 while (waitpid(pid, &status, 0) < 0) {
475 if (errno != EINTR)
476 die("waiting for %s: %s", argv[0], strerror(errno));
478 if (WIFEXITED(status)) {
479 int code = WEXITSTATUS(status);
480 if (code)
481 die("%s died with error code %d", argv[0], code);
482 return 0;
484 if (WIFSIGNALED(status)) {
485 int sig = WTERMSIG(status);
486 die("%s died of signal %d", argv[0], sig);
488 die("%s died of unnatural causes %d", argv[0], status);
491 static int explode_rx_pack(int xd[2])
493 const char *argv[3] = { "unpack-objects", quiet ? "-q" : NULL, NULL };
494 return get_pack(xd, argv);
497 static int keep_rx_pack(int xd[2])
499 const char *argv[6];
500 char keep_arg[256];
501 int n = 0;
503 argv[n++] = "index-pack";
504 argv[n++] = "--stdin";
505 if (!quiet)
506 argv[n++] = "-v";
507 if (use_thin_pack)
508 argv[n++] = "--fix-thin";
509 if (keep_pack > 1) {
510 int s = sprintf(keep_arg, "--keep=fetch-pack %i on ", getpid());
511 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
512 strcpy(keep_arg + s, "localhost");
513 argv[n++] = keep_arg;
515 argv[n] = NULL;
516 return get_pack(xd, argv);
519 static int fetch_pack(int fd[2], int nr_match, char **match)
521 struct ref *ref;
522 unsigned char sha1[20];
523 int status;
525 get_remote_heads(fd[0], &ref, 0, NULL, 0);
526 if (server_supports("multi_ack")) {
527 if (verbose)
528 fprintf(stderr, "Server supports multi_ack\n");
529 multi_ack = 1;
531 if (server_supports("side-band-64k")) {
532 if (verbose)
533 fprintf(stderr, "Server supports side-band-64k\n");
534 use_sideband = 2;
536 else if (server_supports("side-band")) {
537 if (verbose)
538 fprintf(stderr, "Server supports side-band\n");
539 use_sideband = 1;
541 if (!ref) {
542 packet_flush(fd[1]);
543 die("no matching remote head");
545 if (everything_local(&ref, nr_match, match)) {
546 packet_flush(fd[1]);
547 goto all_done;
549 if (find_common(fd, sha1, ref) < 0)
550 if (keep_pack != 1)
551 /* When cloning, it is not unusual to have
552 * no common commit.
554 fprintf(stderr, "warning: no common commits\n");
556 status = (keep_pack) ? keep_rx_pack(fd) : explode_rx_pack(fd);
557 if (status)
558 die("git-fetch-pack: fetch failed.");
560 all_done:
561 while (ref) {
562 printf("%s %s\n",
563 sha1_to_hex(ref->old_sha1), ref->name);
564 ref = ref->next;
566 return 0;
569 int main(int argc, char **argv)
571 int i, ret, nr_heads;
572 char *dest = NULL, **heads;
573 int fd[2];
574 pid_t pid;
576 setup_git_directory();
578 nr_heads = 0;
579 heads = NULL;
580 for (i = 1; i < argc; i++) {
581 char *arg = argv[i];
583 if (*arg == '-') {
584 if (!strncmp("--exec=", arg, 7)) {
585 exec = arg + 7;
586 continue;
588 if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
589 quiet = 1;
590 continue;
592 if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
593 keep_pack++;
594 continue;
596 if (!strcmp("--thin", arg)) {
597 use_thin_pack = 1;
598 continue;
600 if (!strcmp("--all", arg)) {
601 fetch_all = 1;
602 continue;
604 if (!strcmp("-v", arg)) {
605 verbose = 1;
606 continue;
608 usage(fetch_pack_usage);
610 dest = arg;
611 heads = argv + i + 1;
612 nr_heads = argc - i - 1;
613 break;
615 if (!dest)
616 usage(fetch_pack_usage);
617 pid = git_connect(fd, dest, exec);
618 if (pid < 0)
619 return 1;
620 ret = fetch_pack(fd, nr_heads, heads);
621 close(fd[0]);
622 close(fd[1]);
623 ret |= finish_connect(pid);
625 if (!ret && nr_heads) {
626 /* If the heads to pull were given, we should have
627 * consumed all of them by matching the remote.
628 * Otherwise, 'git-fetch remote no-such-ref' would
629 * silently succeed without issuing an error.
631 for (i = 0; i < nr_heads; i++)
632 if (heads[i] && heads[i][0]) {
633 error("no such remote ref %s", heads[i]);
634 ret = 1;
638 return !!ret;