15 static const char fetch_pack_usage[] =
16 "git-fetch-pack [--all] [-q] [-v] [-k] [--thin] [--exec=upload-pack] [--depth=<n>] [host:]directory <refs>...";
17 static const char *exec = "git-upload-pack";
19 #define COMPLETE (1U << 0)
20 #define COMMON (1U << 1)
21 #define COMMON_REF (1U << 2)
22 #define SEEN (1U << 3)
23 #define POPPED (1U << 4)
26 * After sending this many "have"s if we do not get any new ACK , we
27 * give up traversing our history.
29 #define MAX_IN_VAIN 256
31 static struct commit_list *rev_list;
32 static int non_common_revs, multi_ack, use_thin_pack, use_sideband;
34 static void rev_list_push(struct commit *commit, int mark)
36 if (!(commit->object.flags & mark)) {
37 commit->object.flags |= mark;
39 if (!(commit->object.parsed))
42 insert_by_date(commit, &rev_list);
44 if (!(commit->object.flags & COMMON))
49 static int rev_list_insert_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
51 struct object *o = deref_tag(parse_object(sha1), path, 0);
53 if (o && o->type == OBJ_COMMIT)
54 rev_list_push((struct commit *)o, SEEN);
60 This function marks a rev and its ancestors as common.
61 In some cases, it is desirable to mark only the ancestors (for example
62 when only the server does not yet know that they are common).
65 static void mark_common(struct commit *commit,
66 int ancestors_only, int dont_parse)
68 if (commit != NULL && !(commit->object.flags & COMMON)) {
69 struct object *o = (struct object *)commit;
74 if (!(o->flags & SEEN))
75 rev_list_push(commit, SEEN);
77 struct commit_list *parents;
79 if (!ancestors_only && !(o->flags & POPPED))
81 if (!o->parsed && !dont_parse)
84 for (parents = commit->parents;
86 parents = parents->next)
87 mark_common(parents->item, 0, dont_parse);
93 Get the next rev to send, ignoring the common.
96 static const unsigned char* get_rev(void)
98 struct commit *commit = NULL;
100 while (commit == NULL) {
102 struct commit_list* parents;
104 if (rev_list == NULL || non_common_revs == 0)
107 commit = rev_list->item;
108 if (!(commit->object.parsed))
109 parse_commit(commit);
110 commit->object.flags |= POPPED;
111 if (!(commit->object.flags & COMMON))
114 parents = commit->parents;
116 if (commit->object.flags & COMMON) {
117 /* do not send "have", and ignore ancestors */
119 mark = COMMON | SEEN;
120 } else if (commit->object.flags & COMMON_REF)
121 /* send "have", and ignore ancestors */
122 mark = COMMON | SEEN;
124 /* send "have", also for its ancestors */
128 if (!(parents->item->object.flags & SEEN))
129 rev_list_push(parents->item, mark);
131 mark_common(parents->item, 1, 0);
132 parents = parents->next;
135 rev_list = rev_list->next;
138 return commit->object.sha1;
141 static int find_common(int fd[2], unsigned char *result_sha1,
145 int count = 0, flushes = 0, retval;
146 const unsigned char *sha1;
147 unsigned in_vain = 0;
148 int got_continue = 0;
150 for_each_ref(rev_list_insert_ref, NULL);
153 for ( ; refs ; refs = refs->next) {
154 unsigned char *remote = refs->old_sha1;
158 * If that object is complete (i.e. it is an ancestor of a
159 * local ref), we tell them we have it but do not have to
160 * tell them about its ancestors, which they already know
163 * We use lookup_object here because we are only
164 * interested in the case we *know* the object is
165 * reachable and we have already scanned it.
167 if (((o = lookup_object(remote)) != NULL) &&
168 (o->flags & COMPLETE)) {
173 packet_write(fd[1], "want %s%s%s%s%s%s\n",
175 (multi_ack ? " multi_ack" : ""),
176 (use_sideband == 2 ? " side-band-64k" : ""),
177 (use_sideband == 1 ? " side-band" : ""),
178 (use_thin_pack ? " thin-pack" : ""),
181 packet_write(fd[1], "want %s\n", sha1_to_hex(remote));
184 if (is_repository_shallow())
185 write_shallow_commits(fd[1], 1);
187 packet_write(fd[1], "deepen %d", depth);
194 unsigned char sha1[20];
197 while ((len = packet_read_line(fd[0], line, sizeof(line)))) {
198 if (!strncmp("shallow ", line, 8)) {
199 if (get_sha1_hex(line + 8, sha1))
200 die("invalid shallow line: %s", line);
201 /* no need making it shallow if we have it already */
202 if (lookup_object(sha1))
204 register_shallow(sha1);
207 if (!strncmp("unshallow ", line, 10)) {
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 */
214 if (unregister_shallow(sha1))
215 die("no shallow found: %s", line);
218 die("expected shallow/unshallow, got %s", line);
224 while ((sha1 = get_rev())) {
225 packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
227 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
229 if (!(31 & ++count)) {
236 * We keep one window "ahead" of the other side, and
237 * will wait for an ACK only on the next one
243 ack = get_ack(fd[0], result_sha1);
245 fprintf(stderr, "got ack %d %s\n", ack,
246 sha1_to_hex(result_sha1));
252 } else if (ack == 2) {
253 struct commit *commit =
254 lookup_commit(result_sha1);
255 mark_common(commit, 0, 1);
262 if (got_continue && MAX_IN_VAIN < in_vain) {
264 fprintf(stderr, "giving up\n");
270 packet_write(fd[1], "done\n");
272 fprintf(stderr, "done\n");
277 while (flushes || multi_ack) {
278 int ack = get_ack(fd[0], result_sha1);
281 fprintf(stderr, "got ack (%d) %s\n", ack,
282 sha1_to_hex(result_sha1));
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;
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);
314 static void mark_recent_complete_commits(unsigned long cutoff)
316 while (complete && cutoff <= complete->item->date) {
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 && !fetch_all) {
333 if (ARRAY_SIZE(fastarray) < nr_match)
334 return_refs = xcalloc(nr_match, sizeof(struct ref *));
336 return_refs = fastarray;
337 memset(return_refs, 0, sizeof(struct ref *) * nr_match);
343 for (ref = *refs; ref; ref = next) {
345 if (!memcmp(ref->name, "refs/", 5) &&
346 check_ref_format(ref->name + 5))
348 else if (fetch_all) {
351 newtail = &ref->next;
355 int order = path_match(ref->name, nr_match, match);
357 return_refs[order-1] = ref;
358 continue; /* we will link it later */
366 for (i = 0; i < nr_match; i++) {
367 ref = return_refs[i];
371 newtail = &ref->next;
374 if (return_refs != fastarray)
380 static int everything_local(struct ref **refs, int nr_match, char **match)
384 unsigned long cutoff = 0;
386 track_object_refs = 0;
387 save_commit_buffer = 0;
389 for (ref = *refs; ref; ref = ref->next) {
392 o = parse_object(ref->old_sha1);
396 /* We already have it -- which may mean that we were
397 * in sync with the other side at some time after
398 * that (it is OK if we guess wrong here).
400 if (o->type == OBJ_COMMIT) {
401 struct commit *commit = (struct commit *)o;
402 if (!cutoff || cutoff < commit->date)
403 cutoff = commit->date;
408 for_each_ref(mark_complete, NULL);
410 mark_recent_complete_commits(cutoff);
414 * Mark all complete remote refs as common refs.
415 * Don't mark them common yet; the server has to be told so first.
417 for (ref = *refs; ref; ref = ref->next) {
418 struct object *o = deref_tag(lookup_object(ref->old_sha1),
421 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
424 if (!(o->flags & SEEN)) {
425 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
427 mark_common((struct commit *)o, 1, 1);
431 filter_refs(refs, nr_match, match);
433 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
434 const unsigned char *remote = ref->old_sha1;
435 unsigned char local[20];
438 o = lookup_object(remote);
439 if (!o || !(o->flags & COMPLETE)) {
444 "want %s (%s)\n", sha1_to_hex(remote),
449 hashcpy(ref->new_sha1, local);
453 "already have %s (%s)\n", sha1_to_hex(remote),
459 static pid_t setup_sideband(int fd[2], int xd[2])
468 /* xd[] is talking with upload-pack; subprocess reads from
469 * xd[0], spits out band#2 to stderr, and feeds us band#1
473 die("fetch-pack: unable to set up pipe");
476 die("fetch-pack: unable to fork off sideband demultiplexer");
482 if (recv_sideband("fetch-pack", xd[0], fd[1], 2))
492 static int get_pack(int xd[2], const char **argv)
498 side_pid = setup_sideband(fd, xd);
501 die("fetch-pack: unable to fork off %s", argv[0]);
507 die("%s exec failed", argv[0]);
511 while (waitpid(pid, &status, 0) < 0) {
513 die("waiting for %s: %s", argv[0], strerror(errno));
515 if (WIFEXITED(status)) {
516 int code = WEXITSTATUS(status);
518 die("%s died with error code %d", argv[0], code);
521 if (WIFSIGNALED(status)) {
522 int sig = WTERMSIG(status);
523 die("%s died of signal %d", argv[0], sig);
525 die("%s died of unnatural causes %d", argv[0], status);
528 static int explode_rx_pack(int xd[2])
530 const char *argv[3] = { "unpack-objects", quiet ? "-q" : NULL, NULL };
531 return get_pack(xd, argv);
534 static int keep_rx_pack(int xd[2])
540 argv[n++] = "index-pack";
541 argv[n++] = "--stdin";
545 argv[n++] = "--fix-thin";
547 int s = sprintf(keep_arg, "--keep=fetch-pack %i on ", getpid());
548 if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
549 strcpy(keep_arg + s, "localhost");
550 argv[n++] = keep_arg;
553 return get_pack(xd, argv);
556 static int fetch_pack(int fd[2], int nr_match, char **match)
559 unsigned char sha1[20];
562 get_remote_heads(fd[0], &ref, 0, NULL, 0);
563 if (is_repository_shallow() && !server_supports("shallow"))
564 die("Server does not support shallow clients");
565 if (server_supports("multi_ack")) {
567 fprintf(stderr, "Server supports multi_ack\n");
570 if (server_supports("side-band-64k")) {
572 fprintf(stderr, "Server supports side-band-64k\n");
575 else if (server_supports("side-band")) {
577 fprintf(stderr, "Server supports side-band\n");
582 die("no matching remote head");
584 if (everything_local(&ref, nr_match, match)) {
588 if (find_common(fd, sha1, ref) < 0)
590 /* When cloning, it is not unusual to have
593 fprintf(stderr, "warning: no common commits\n");
595 status = (keep_pack) ? keep_rx_pack(fd) : explode_rx_pack(fd);
597 die("git-fetch-pack: fetch failed.");
602 sha1_to_hex(ref->old_sha1), ref->name);
608 int main(int argc, char **argv)
610 int i, ret, nr_heads;
611 char *dest = NULL, **heads;
615 struct lock_file lock;
617 setup_git_directory();
621 for (i = 1; i < argc; i++) {
625 if (!strncmp("--exec=", arg, 7)) {
629 if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
633 if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
637 if (!strcmp("--thin", arg)) {
641 if (!strcmp("--all", arg)) {
645 if (!strcmp("-v", arg)) {
649 if (!strncmp("--depth=", arg, 8)) {
650 depth = strtol(arg + 8, NULL, 0);
651 if (stat(git_path("shallow"), &st))
655 usage(fetch_pack_usage);
658 heads = argv + i + 1;
659 nr_heads = argc - i - 1;
663 usage(fetch_pack_usage);
664 pid = git_connect(fd, dest, exec);
667 ret = fetch_pack(fd, nr_heads, heads);
670 ret |= finish_connect(pid);
672 if (!ret && nr_heads) {
673 /* If the heads to pull were given, we should have
674 * consumed all of them by matching the remote.
675 * Otherwise, 'git-fetch remote no-such-ref' would
676 * silently succeed without issuing an error.
678 for (i = 0; i < nr_heads; i++)
679 if (heads[i] && heads[i][0]) {
680 error("no such remote ref %s", heads[i]);
685 if (!ret && depth > 0) {
686 struct cache_time mtime;
687 char *shallow = git_path("shallow");
690 mtime.sec = st.st_mtime;
692 mtime.usec = st.st_mtim.usec;
694 if (stat(shallow, &st)) {
696 die("shallow file was removed during fetch");
697 } else if (st.st_mtime != mtime.sec
699 || st.st_mtim.usec != mtime.usec
702 die("shallow file was changed during fetch");
704 fd = hold_lock_file_for_update(&lock, shallow, 1);
705 if (!write_shallow_commits(fd, 0)) {
706 unlink(lock.filename);
707 rollback_lock_file(&lock);
710 commit_lock_file(&lock);