Use start_comand() in builtin-fetch-pack.c instead of explicit fork/exec.
[git/dscho.git] / builtin-fetch-pack.c
blob871b7042e74837b5dfd26f17f4317d4341c01100
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 "run-command.h"
12 static int transfer_unpack_limit = -1;
13 static int fetch_unpack_limit = -1;
14 static int unpack_limit = 100;
15 static struct fetch_pack_args args;
17 static const char fetch_pack_usage[] =
18 "git-fetch-pack [--all] [--quiet|-q] [--keep|-k] [--thin] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] [-v] [<host>:]<directory> [<refs>...]";
19 static const char *uploadpack = "git-upload-pack";
21 #define COMPLETE (1U << 0)
22 #define COMMON (1U << 1)
23 #define COMMON_REF (1U << 2)
24 #define SEEN (1U << 3)
25 #define POPPED (1U << 4)
28 * After sending this many "have"s if we do not get any new ACK , we
29 * give up traversing our history.
31 #define MAX_IN_VAIN 256
33 static struct commit_list *rev_list;
34 static int non_common_revs, multi_ack, use_thin_pack, use_sideband;
36 static void rev_list_push(struct commit *commit, int mark)
38 if (!(commit->object.flags & mark)) {
39 commit->object.flags |= mark;
41 if (!(commit->object.parsed))
42 parse_commit(commit);
44 insert_by_date(commit, &rev_list);
46 if (!(commit->object.flags & COMMON))
47 non_common_revs++;
51 static int rev_list_insert_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
53 struct object *o = deref_tag(parse_object(sha1), path, 0);
55 if (o && o->type == OBJ_COMMIT)
56 rev_list_push((struct commit *)o, SEEN);
58 return 0;
62 This function marks a rev and its ancestors as common.
63 In some cases, it is desirable to mark only the ancestors (for example
64 when only the server does not yet know that they are common).
67 static void mark_common(struct commit *commit,
68 int ancestors_only, int dont_parse)
70 if (commit != NULL && !(commit->object.flags & COMMON)) {
71 struct object *o = (struct object *)commit;
73 if (!ancestors_only)
74 o->flags |= COMMON;
76 if (!(o->flags & SEEN))
77 rev_list_push(commit, SEEN);
78 else {
79 struct commit_list *parents;
81 if (!ancestors_only && !(o->flags & POPPED))
82 non_common_revs--;
83 if (!o->parsed && !dont_parse)
84 parse_commit(commit);
86 for (parents = commit->parents;
87 parents;
88 parents = parents->next)
89 mark_common(parents->item, 0, dont_parse);
95 Get the next rev to send, ignoring the common.
98 static const unsigned char* get_rev(void)
100 struct commit *commit = NULL;
102 while (commit == NULL) {
103 unsigned int mark;
104 struct commit_list* parents;
106 if (rev_list == NULL || non_common_revs == 0)
107 return NULL;
109 commit = rev_list->item;
110 if (!(commit->object.parsed))
111 parse_commit(commit);
112 commit->object.flags |= POPPED;
113 if (!(commit->object.flags & COMMON))
114 non_common_revs--;
116 parents = commit->parents;
118 if (commit->object.flags & COMMON) {
119 /* do not send "have", and ignore ancestors */
120 commit = NULL;
121 mark = COMMON | SEEN;
122 } else if (commit->object.flags & COMMON_REF)
123 /* send "have", and ignore ancestors */
124 mark = COMMON | SEEN;
125 else
126 /* send "have", also for its ancestors */
127 mark = SEEN;
129 while (parents) {
130 if (!(parents->item->object.flags & SEEN))
131 rev_list_push(parents->item, mark);
132 if (mark & COMMON)
133 mark_common(parents->item, 1, 0);
134 parents = parents->next;
137 rev_list = rev_list->next;
140 return commit->object.sha1;
143 static int find_common(int fd[2], unsigned char *result_sha1,
144 struct ref *refs)
146 int fetching;
147 int count = 0, flushes = 0, retval;
148 const unsigned char *sha1;
149 unsigned in_vain = 0;
150 int got_continue = 0;
152 for_each_ref(rev_list_insert_ref, NULL);
154 fetching = 0;
155 for ( ; refs ; refs = refs->next) {
156 unsigned char *remote = refs->old_sha1;
157 struct object *o;
160 * If that object is complete (i.e. it is an ancestor of a
161 * local ref), we tell them we have it but do not have to
162 * tell them about its ancestors, which they already know
163 * about.
165 * We use lookup_object here because we are only
166 * interested in the case we *know* the object is
167 * reachable and we have already scanned it.
169 if (((o = lookup_object(remote)) != NULL) &&
170 (o->flags & COMPLETE)) {
171 continue;
174 if (!fetching)
175 packet_write(fd[1], "want %s%s%s%s%s%s%s\n",
176 sha1_to_hex(remote),
177 (multi_ack ? " multi_ack" : ""),
178 (use_sideband == 2 ? " side-band-64k" : ""),
179 (use_sideband == 1 ? " side-band" : ""),
180 (use_thin_pack ? " thin-pack" : ""),
181 (args.no_progress ? " no-progress" : ""),
182 " ofs-delta");
183 else
184 packet_write(fd[1], "want %s\n", sha1_to_hex(remote));
185 fetching++;
187 if (is_repository_shallow())
188 write_shallow_commits(fd[1], 1);
189 if (args.depth > 0)
190 packet_write(fd[1], "deepen %d", args.depth);
191 packet_flush(fd[1]);
192 if (!fetching)
193 return 1;
195 if (args.depth > 0) {
196 char line[1024];
197 unsigned char sha1[20];
198 int len;
200 while ((len = packet_read_line(fd[0], line, sizeof(line)))) {
201 if (!prefixcmp(line, "shallow ")) {
202 if (get_sha1_hex(line + 8, sha1))
203 die("invalid shallow line: %s", line);
204 register_shallow(sha1);
205 continue;
207 if (!prefixcmp(line, "unshallow ")) {
208 if (get_sha1_hex(line + 10, sha1))
209 die("invalid unshallow line: %s", line);
210 if (!lookup_object(sha1))
211 die("object not found: %s", line);
212 /* make sure that it is parsed as shallow */
213 parse_object(sha1);
214 if (unregister_shallow(sha1))
215 die("no shallow found: %s", line);
216 continue;
218 die("expected shallow/unshallow, got %s", line);
222 flushes = 0;
223 retval = -1;
224 while ((sha1 = get_rev())) {
225 packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
226 if (args.verbose)
227 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
228 in_vain++;
229 if (!(31 & ++count)) {
230 int ack;
232 packet_flush(fd[1]);
233 flushes++;
236 * We keep one window "ahead" of the other side, and
237 * will wait for an ACK only on the next one
239 if (count == 32)
240 continue;
242 do {
243 ack = get_ack(fd[0], result_sha1);
244 if (args.verbose && ack)
245 fprintf(stderr, "got ack %d %s\n", ack,
246 sha1_to_hex(result_sha1));
247 if (ack == 1) {
248 flushes = 0;
249 multi_ack = 0;
250 retval = 0;
251 goto done;
252 } else if (ack == 2) {
253 struct commit *commit =
254 lookup_commit(result_sha1);
255 mark_common(commit, 0, 1);
256 retval = 0;
257 in_vain = 0;
258 got_continue = 1;
260 } while (ack);
261 flushes--;
262 if (got_continue && MAX_IN_VAIN < in_vain) {
263 if (args.verbose)
264 fprintf(stderr, "giving up\n");
265 break; /* give up */
269 done:
270 packet_write(fd[1], "done\n");
271 if (args.verbose)
272 fprintf(stderr, "done\n");
273 if (retval != 0) {
274 multi_ack = 0;
275 flushes++;
277 while (flushes || multi_ack) {
278 int ack = get_ack(fd[0], result_sha1);
279 if (ack) {
280 if (args.verbose)
281 fprintf(stderr, "got ack (%d) %s\n", ack,
282 sha1_to_hex(result_sha1));
283 if (ack == 1)
284 return 0;
285 multi_ack = 1;
286 continue;
288 flushes--;
290 return retval;
293 static struct commit_list *complete;
295 static int mark_complete(const char *path, const unsigned char *sha1, int flag, void *cb_data)
297 struct object *o = parse_object(sha1);
299 while (o && o->type == OBJ_TAG) {
300 struct tag *t = (struct tag *) o;
301 if (!t->tagged)
302 break; /* broken repository */
303 o->flags |= COMPLETE;
304 o = parse_object(t->tagged->sha1);
306 if (o && o->type == OBJ_COMMIT) {
307 struct commit *commit = (struct commit *)o;
308 commit->object.flags |= COMPLETE;
309 insert_by_date(commit, &complete);
311 return 0;
314 static void mark_recent_complete_commits(unsigned long cutoff)
316 while (complete && cutoff <= complete->item->date) {
317 if (args.verbose)
318 fprintf(stderr, "Marking %s as complete\n",
319 sha1_to_hex(complete->item->object.sha1));
320 pop_most_recent_commit(&complete, COMPLETE);
324 static void filter_refs(struct ref **refs, int nr_match, char **match)
326 struct ref **return_refs;
327 struct ref *newlist = NULL;
328 struct ref **newtail = &newlist;
329 struct ref *ref, *next;
330 struct ref *fastarray[32];
332 if (nr_match && !args.fetch_all) {
333 if (ARRAY_SIZE(fastarray) < nr_match)
334 return_refs = xcalloc(nr_match, sizeof(struct ref *));
335 else {
336 return_refs = fastarray;
337 memset(return_refs, 0, sizeof(struct ref *) * nr_match);
340 else
341 return_refs = NULL;
343 for (ref = *refs; ref; ref = next) {
344 next = ref->next;
345 if (!memcmp(ref->name, "refs/", 5) &&
346 check_ref_format(ref->name + 5))
347 ; /* trash */
348 else if (args.fetch_all &&
349 (!args.depth || prefixcmp(ref->name, "refs/tags/") )) {
350 *newtail = ref;
351 ref->next = NULL;
352 newtail = &ref->next;
353 continue;
355 else {
356 int order = path_match(ref->name, nr_match, match);
357 if (order) {
358 return_refs[order-1] = ref;
359 continue; /* we will link it later */
362 free(ref);
365 if (!args.fetch_all) {
366 int i;
367 for (i = 0; i < nr_match; i++) {
368 ref = return_refs[i];
369 if (ref) {
370 *newtail = ref;
371 ref->next = NULL;
372 newtail = &ref->next;
375 if (return_refs != fastarray)
376 free(return_refs);
378 *refs = newlist;
381 static int everything_local(struct ref **refs, int nr_match, char **match)
383 struct ref *ref;
384 int retval;
385 unsigned long cutoff = 0;
387 track_object_refs = 0;
388 save_commit_buffer = 0;
390 for (ref = *refs; ref; ref = ref->next) {
391 struct object *o;
393 o = parse_object(ref->old_sha1);
394 if (!o)
395 continue;
397 /* We already have it -- which may mean that we were
398 * in sync with the other side at some time after
399 * that (it is OK if we guess wrong here).
401 if (o->type == OBJ_COMMIT) {
402 struct commit *commit = (struct commit *)o;
403 if (!cutoff || cutoff < commit->date)
404 cutoff = commit->date;
408 if (!args.depth) {
409 for_each_ref(mark_complete, NULL);
410 if (cutoff)
411 mark_recent_complete_commits(cutoff);
415 * Mark all complete remote refs as common refs.
416 * Don't mark them common yet; the server has to be told so first.
418 for (ref = *refs; ref; ref = ref->next) {
419 struct object *o = deref_tag(lookup_object(ref->old_sha1),
420 NULL, 0);
422 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
423 continue;
425 if (!(o->flags & SEEN)) {
426 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
428 mark_common((struct commit *)o, 1, 1);
432 filter_refs(refs, nr_match, match);
434 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
435 const unsigned char *remote = ref->old_sha1;
436 unsigned char local[20];
437 struct object *o;
439 o = lookup_object(remote);
440 if (!o || !(o->flags & COMPLETE)) {
441 retval = 0;
442 if (!args.verbose)
443 continue;
444 fprintf(stderr,
445 "want %s (%s)\n", sha1_to_hex(remote),
446 ref->name);
447 continue;
450 hashcpy(ref->new_sha1, local);
451 if (!args.verbose)
452 continue;
453 fprintf(stderr,
454 "already have %s (%s)\n", sha1_to_hex(remote),
455 ref->name);
457 return retval;
460 static pid_t setup_sideband(int fd[2], int xd[2])
462 pid_t side_pid;
464 if (!use_sideband) {
465 fd[0] = xd[0];
466 fd[1] = xd[1];
467 return 0;
469 /* xd[] is talking with upload-pack; subprocess reads from
470 * xd[0], spits out band#2 to stderr, and feeds us band#1
471 * through our fd[0].
473 if (pipe(fd) < 0)
474 die("fetch-pack: unable to set up pipe");
475 side_pid = fork();
476 if (side_pid < 0)
477 die("fetch-pack: unable to fork off sideband demultiplexer");
478 if (!side_pid) {
479 /* subprocess */
480 close(fd[0]);
481 if (xd[0] != xd[1])
482 close(xd[1]);
483 if (recv_sideband("fetch-pack", xd[0], fd[1], 2))
484 exit(1);
485 exit(0);
487 close(xd[0]);
488 close(fd[1]);
489 fd[1] = xd[1];
490 return side_pid;
493 static int get_pack(int xd[2], char **pack_lockfile)
495 pid_t side_pid;
496 int fd[2];
497 const char *argv[20];
498 char keep_arg[256];
499 char hdr_arg[256];
500 const char **av;
501 int do_keep = args.keep_pack;
502 struct child_process cmd;
504 side_pid = setup_sideband(fd, xd);
506 memset(&cmd, 0, sizeof(cmd));
507 cmd.argv = argv;
508 av = argv;
509 *hdr_arg = 0;
510 if (!args.keep_pack && unpack_limit) {
511 struct pack_header header;
513 if (read_pack_header(fd[0], &header))
514 die("protocol error: bad pack header");
515 snprintf(hdr_arg, sizeof(hdr_arg), "--pack_header=%u,%u",
516 ntohl(header.hdr_version), ntohl(header.hdr_entries));
517 if (ntohl(header.hdr_entries) < unpack_limit)
518 do_keep = 0;
519 else
520 do_keep = 1;
523 if (do_keep) {
524 if (pack_lockfile)
525 cmd.out = -1;
526 *av++ = "index-pack";
527 *av++ = "--stdin";
528 if (!args.quiet && !args.no_progress)
529 *av++ = "-v";
530 if (args.use_thin_pack)
531 *av++ = "--fix-thin";
532 if (args.lock_pack || unpack_limit) {
533 int s = sprintf(keep_arg,
534 "--keep=fetch-pack %d on ", getpid());
535 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
536 strcpy(keep_arg + s, "localhost");
537 *av++ = keep_arg;
540 else {
541 *av++ = "unpack-objects";
542 if (args.quiet)
543 *av++ = "-q";
545 if (*hdr_arg)
546 *av++ = hdr_arg;
547 *av++ = NULL;
549 cmd.in = fd[0];
550 cmd.git_cmd = 1;
551 if (start_command(&cmd))
552 die("fetch-pack: unable to fork off %s", argv[0]);
553 close(fd[1]);
554 if (do_keep && pack_lockfile)
555 *pack_lockfile = index_pack_lockfile(cmd.out);
557 if (finish_command(&cmd))
558 die("%s failed", argv[0]);
559 return 0;
562 static struct ref *do_fetch_pack(int fd[2],
563 int nr_match,
564 char **match,
565 char **pack_lockfile)
567 struct ref *ref;
568 unsigned char sha1[20];
570 get_remote_heads(fd[0], &ref, 0, NULL, 0);
571 if (is_repository_shallow() && !server_supports("shallow"))
572 die("Server does not support shallow clients");
573 if (server_supports("multi_ack")) {
574 if (args.verbose)
575 fprintf(stderr, "Server supports multi_ack\n");
576 multi_ack = 1;
578 if (server_supports("side-band-64k")) {
579 if (args.verbose)
580 fprintf(stderr, "Server supports side-band-64k\n");
581 use_sideband = 2;
583 else if (server_supports("side-band")) {
584 if (args.verbose)
585 fprintf(stderr, "Server supports side-band\n");
586 use_sideband = 1;
588 if (!ref) {
589 packet_flush(fd[1]);
590 die("no matching remote head");
592 if (everything_local(&ref, nr_match, match)) {
593 packet_flush(fd[1]);
594 goto all_done;
596 if (find_common(fd, sha1, ref) < 0)
597 if (!args.keep_pack)
598 /* When cloning, it is not unusual to have
599 * no common commit.
601 fprintf(stderr, "warning: no common commits\n");
603 if (get_pack(fd, pack_lockfile))
604 die("git-fetch-pack: fetch failed.");
606 all_done:
607 return ref;
610 static int remove_duplicates(int nr_heads, char **heads)
612 int src, dst;
614 for (src = dst = 0; src < nr_heads; src++) {
615 /* If heads[src] is different from any of
616 * heads[0..dst], push it in.
618 int i;
619 for (i = 0; i < dst; i++) {
620 if (!strcmp(heads[i], heads[src]))
621 break;
623 if (i < dst)
624 continue;
625 if (src != dst)
626 heads[dst] = heads[src];
627 dst++;
629 return dst;
632 static int fetch_pack_config(const char *var, const char *value)
634 if (strcmp(var, "fetch.unpacklimit") == 0) {
635 fetch_unpack_limit = git_config_int(var, value);
636 return 0;
639 if (strcmp(var, "transfer.unpacklimit") == 0) {
640 transfer_unpack_limit = git_config_int(var, value);
641 return 0;
644 return git_default_config(var, value);
647 static struct lock_file lock;
649 static void fetch_pack_setup(void)
651 static int did_setup;
652 if (did_setup)
653 return;
654 git_config(fetch_pack_config);
655 if (0 <= transfer_unpack_limit)
656 unpack_limit = transfer_unpack_limit;
657 else if (0 <= fetch_unpack_limit)
658 unpack_limit = fetch_unpack_limit;
659 did_setup = 1;
662 int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
664 int i, ret, nr_heads;
665 struct ref *ref;
666 char *dest = NULL, **heads;
668 nr_heads = 0;
669 heads = NULL;
670 for (i = 1; i < argc; i++) {
671 const char *arg = argv[i];
673 if (*arg == '-') {
674 if (!prefixcmp(arg, "--upload-pack=")) {
675 args.uploadpack = arg + 14;
676 continue;
678 if (!prefixcmp(arg, "--exec=")) {
679 args.uploadpack = arg + 7;
680 continue;
682 if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
683 args.quiet = 1;
684 continue;
686 if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
687 args.lock_pack = args.keep_pack;
688 args.keep_pack = 1;
689 continue;
691 if (!strcmp("--thin", arg)) {
692 args.use_thin_pack = 1;
693 continue;
695 if (!strcmp("--all", arg)) {
696 args.fetch_all = 1;
697 continue;
699 if (!strcmp("-v", arg)) {
700 args.verbose = 1;
701 continue;
703 if (!prefixcmp(arg, "--depth=")) {
704 args.depth = strtol(arg + 8, NULL, 0);
705 continue;
707 if (!strcmp("--no-progress", arg)) {
708 args.no_progress = 1;
709 continue;
711 usage(fetch_pack_usage);
713 dest = (char *)arg;
714 heads = (char **)(argv + i + 1);
715 nr_heads = argc - i - 1;
716 break;
718 if (!dest)
719 usage(fetch_pack_usage);
721 ref = fetch_pack(&args, dest, nr_heads, heads, NULL);
722 ret = !ref;
724 while (ref) {
725 printf("%s %s\n",
726 sha1_to_hex(ref->old_sha1), ref->name);
727 ref = ref->next;
730 return ret;
733 struct ref *fetch_pack(struct fetch_pack_args *my_args,
734 const char *dest,
735 int nr_heads,
736 char **heads,
737 char **pack_lockfile)
739 int i, ret;
740 int fd[2];
741 struct child_process *conn;
742 struct ref *ref;
743 struct stat st;
745 fetch_pack_setup();
746 memcpy(&args, my_args, sizeof(args));
747 if (args.depth > 0) {
748 if (stat(git_path("shallow"), &st))
749 st.st_mtime = 0;
752 conn = git_connect(fd, (char *)dest, uploadpack,
753 args.verbose ? CONNECT_VERBOSE : 0);
754 if (heads && nr_heads)
755 nr_heads = remove_duplicates(nr_heads, heads);
756 ref = do_fetch_pack(fd, nr_heads, heads, pack_lockfile);
757 close(fd[0]);
758 close(fd[1]);
759 ret = finish_connect(conn);
761 if (!ret && nr_heads) {
762 /* If the heads to pull were given, we should have
763 * consumed all of them by matching the remote.
764 * Otherwise, 'git-fetch remote no-such-ref' would
765 * silently succeed without issuing an error.
767 for (i = 0; i < nr_heads; i++)
768 if (heads[i] && heads[i][0]) {
769 error("no such remote ref %s", heads[i]);
770 ret = 1;
774 if (!ret && args.depth > 0) {
775 struct cache_time mtime;
776 char *shallow = git_path("shallow");
777 int fd;
779 mtime.sec = st.st_mtime;
780 #ifdef USE_NSEC
781 mtime.usec = st.st_mtim.usec;
782 #endif
783 if (stat(shallow, &st)) {
784 if (mtime.sec)
785 die("shallow file was removed during fetch");
786 } else if (st.st_mtime != mtime.sec
787 #ifdef USE_NSEC
788 || st.st_mtim.usec != mtime.usec
789 #endif
791 die("shallow file was changed during fetch");
793 fd = hold_lock_file_for_update(&lock, shallow, 1);
794 if (!write_shallow_commits(fd, 0)) {
795 unlink(shallow);
796 rollback_lock_file(&lock);
797 } else {
798 close(fd);
799 commit_lock_file(&lock);
803 if (ret)
804 ref = NULL;
806 return ref;