11 static const char fetch_pack_usage[] =
12 "git-fetch-pack [--all] [-q] [-v] [-k] [--thin] [--exec=upload-pack] [host:]directory <refs>...";
13 static const char *exec = "git-upload-pack";
15 #define COMPLETE (1U << 0)
16 #define COMMON (1U << 1)
17 #define COMMON_REF (1U << 2)
18 #define SEEN (1U << 3)
19 #define POPPED (1U << 4)
22 * After sending this many "have"s if we do not get any new ACK , we
23 * give up traversing our history.
25 #define MAX_IN_VAIN 256
27 static struct commit_list *rev_list = NULL;
28 static int non_common_revs = 0, multi_ack = 0, use_thin_pack = 0, use_sideband;
30 static void rev_list_push(struct commit *commit, int mark)
32 if (!(commit->object.flags & mark)) {
33 commit->object.flags |= mark;
35 if (!(commit->object.parsed))
38 insert_by_date(commit, &rev_list);
40 if (!(commit->object.flags & COMMON))
45 static int rev_list_insert_ref(const char *path, const unsigned char *sha1)
47 struct object *o = deref_tag(parse_object(sha1), path, 0);
49 if (o && o->type == OBJ_COMMIT)
50 rev_list_push((struct commit *)o, SEEN);
56 This function marks a rev and its ancestors as common.
57 In some cases, it is desirable to mark only the ancestors (for example
58 when only the server does not yet know that they are common).
61 static void mark_common(struct commit *commit,
62 int ancestors_only, int dont_parse)
64 if (commit != NULL && !(commit->object.flags & COMMON)) {
65 struct object *o = (struct object *)commit;
70 if (!(o->flags & SEEN))
71 rev_list_push(commit, SEEN);
73 struct commit_list *parents;
75 if (!ancestors_only && !(o->flags & POPPED))
77 if (!o->parsed && !dont_parse)
80 for (parents = commit->parents;
82 parents = parents->next)
83 mark_common(parents->item, 0, dont_parse);
89 Get the next rev to send, ignoring the common.
92 static const unsigned char* get_rev(void)
94 struct commit *commit = NULL;
96 while (commit == NULL) {
98 struct commit_list* parents;
100 if (rev_list == NULL || non_common_revs == 0)
103 commit = rev_list->item;
104 if (!(commit->object.parsed))
105 parse_commit(commit);
106 commit->object.flags |= POPPED;
107 if (!(commit->object.flags & COMMON))
110 parents = commit->parents;
112 if (commit->object.flags & COMMON) {
113 /* do not send "have", and ignore ancestors */
115 mark = COMMON | SEEN;
116 } else if (commit->object.flags & COMMON_REF)
117 /* send "have", and ignore ancestors */
118 mark = COMMON | SEEN;
120 /* send "have", also for its ancestors */
124 if (!(parents->item->object.flags & SEEN))
125 rev_list_push(parents->item, mark);
127 mark_common(parents->item, 1, 0);
128 parents = parents->next;
131 rev_list = rev_list->next;
134 return commit->object.sha1;
137 static int find_common(int fd[2], unsigned char *result_sha1,
141 int count = 0, flushes = 0, retval;
142 const unsigned char *sha1;
143 unsigned in_vain = 0;
144 int got_continue = 0;
146 for_each_ref(rev_list_insert_ref);
149 for ( ; refs ; refs = refs->next) {
150 unsigned char *remote = refs->old_sha1;
154 * If that object is complete (i.e. it is an ancestor of a
155 * local ref), we tell them we have it but do not have to
156 * tell them about its ancestors, which they already know
159 * We use lookup_object here because we are only
160 * interested in the case we *know* the object is
161 * reachable and we have already scanned it.
163 if (((o = lookup_object(remote)) != NULL) &&
164 (o->flags & COMPLETE)) {
169 packet_write(fd[1], "want %s%s%s%s\n",
171 (multi_ack ? " multi_ack" : ""),
172 (use_sideband ? " side-band" : ""),
173 (use_thin_pack ? " thin-pack" : ""));
175 packet_write(fd[1], "want %s\n", sha1_to_hex(remote));
184 while ((sha1 = get_rev())) {
185 packet_write(fd[1], "have %s\n", sha1_to_hex(sha1));
187 fprintf(stderr, "have %s\n", sha1_to_hex(sha1));
189 if (!(31 & ++count)) {
196 * We keep one window "ahead" of the other side, and
197 * will wait for an ACK only on the next one
203 ack = get_ack(fd[0], result_sha1);
205 fprintf(stderr, "got ack %d %s\n", ack,
206 sha1_to_hex(result_sha1));
212 } else if (ack == 2) {
213 struct commit *commit =
214 lookup_commit(result_sha1);
215 mark_common(commit, 0, 1);
222 if (got_continue && MAX_IN_VAIN < in_vain) {
224 fprintf(stderr, "giving up\n");
230 packet_write(fd[1], "done\n");
232 fprintf(stderr, "done\n");
237 while (flushes || multi_ack) {
238 int ack = get_ack(fd[0], result_sha1);
241 fprintf(stderr, "got ack (%d) %s\n", ack,
242 sha1_to_hex(result_sha1));
253 static struct commit_list *complete = NULL;
255 static int mark_complete(const char *path, const unsigned char *sha1)
257 struct object *o = parse_object(sha1);
259 while (o && o->type == OBJ_TAG) {
260 struct tag *t = (struct tag *) o;
262 break; /* broken repository */
263 o->flags |= COMPLETE;
264 o = parse_object(t->tagged->sha1);
266 if (o && o->type == OBJ_COMMIT) {
267 struct commit *commit = (struct commit *)o;
268 commit->object.flags |= COMPLETE;
269 insert_by_date(commit, &complete);
274 static void mark_recent_complete_commits(unsigned long cutoff)
276 while (complete && cutoff <= complete->item->date) {
278 fprintf(stderr, "Marking %s as complete\n",
279 sha1_to_hex(complete->item->object.sha1));
280 pop_most_recent_commit(&complete, COMPLETE);
284 static void filter_refs(struct ref **refs, int nr_match, char **match)
286 struct ref **return_refs;
287 struct ref *newlist = NULL;
288 struct ref **newtail = &newlist;
289 struct ref *ref, *next;
290 struct ref *fastarray[32];
292 if (nr_match && !fetch_all) {
293 if (ARRAY_SIZE(fastarray) < nr_match)
294 return_refs = xcalloc(nr_match, sizeof(struct ref *));
296 return_refs = fastarray;
297 memset(return_refs, 0, sizeof(struct ref *) * nr_match);
303 for (ref = *refs; ref; ref = next) {
305 if (!memcmp(ref->name, "refs/", 5) &&
306 check_ref_format(ref->name + 5))
308 else if (fetch_all) {
311 newtail = &ref->next;
315 int order = path_match(ref->name, nr_match, match);
317 return_refs[order-1] = ref;
318 continue; /* we will link it later */
326 for (i = 0; i < nr_match; i++) {
327 ref = return_refs[i];
331 newtail = &ref->next;
334 if (return_refs != fastarray)
340 static int everything_local(struct ref **refs, int nr_match, char **match)
344 unsigned long cutoff = 0;
346 track_object_refs = 0;
347 save_commit_buffer = 0;
349 for (ref = *refs; ref; ref = ref->next) {
352 o = parse_object(ref->old_sha1);
356 /* We already have it -- which may mean that we were
357 * in sync with the other side at some time after
358 * that (it is OK if we guess wrong here).
360 if (o->type == OBJ_COMMIT) {
361 struct commit *commit = (struct commit *)o;
362 if (!cutoff || cutoff < commit->date)
363 cutoff = commit->date;
367 for_each_ref(mark_complete);
369 mark_recent_complete_commits(cutoff);
372 * Mark all complete remote refs as common refs.
373 * Don't mark them common yet; the server has to be told so first.
375 for (ref = *refs; ref; ref = ref->next) {
376 struct object *o = deref_tag(lookup_object(ref->old_sha1),
379 if (!o || o->type != OBJ_COMMIT || !(o->flags & COMPLETE))
382 if (!(o->flags & SEEN)) {
383 rev_list_push((struct commit *)o, COMMON_REF | SEEN);
385 mark_common((struct commit *)o, 1, 1);
389 filter_refs(refs, nr_match, match);
391 for (retval = 1, ref = *refs; ref ; ref = ref->next) {
392 const unsigned char *remote = ref->old_sha1;
393 unsigned char local[20];
396 o = lookup_object(remote);
397 if (!o || !(o->flags & COMPLETE)) {
402 "want %s (%s)\n", sha1_to_hex(remote),
407 memcpy(ref->new_sha1, local, 20);
411 "already have %s (%s)\n", sha1_to_hex(remote),
417 static int fetch_pack(int fd[2], int nr_match, char **match)
420 unsigned char sha1[20];
423 get_remote_heads(fd[0], &ref, 0, NULL, 0);
424 if (server_supports("multi_ack")) {
426 fprintf(stderr, "Server supports multi_ack\n");
429 if (server_supports("side-band")) {
431 fprintf(stderr, "Server supports side-band\n");
436 die("no matching remote head");
438 if (everything_local(&ref, nr_match, match)) {
442 if (find_common(fd, sha1, ref) < 0)
444 /* When cloning, it is not unusual to have
447 fprintf(stderr, "warning: no common commits\n");
450 status = receive_keep_pack(fd, "git-fetch-pack", quiet, use_sideband);
452 status = receive_unpack_pack(fd, "git-fetch-pack", quiet, use_sideband);
455 die("git-fetch-pack: fetch failed.");
460 sha1_to_hex(ref->old_sha1), ref->name);
466 int main(int argc, char **argv)
468 int i, ret, nr_heads;
469 char *dest = NULL, **heads;
473 setup_git_directory();
477 for (i = 1; i < argc; i++) {
481 if (!strncmp("--exec=", arg, 7)) {
485 if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) {
489 if (!strcmp("--keep", arg) || !strcmp("-k", arg)) {
493 if (!strcmp("--thin", arg)) {
497 if (!strcmp("--all", arg)) {
501 if (!strcmp("-v", arg)) {
505 usage(fetch_pack_usage);
508 heads = argv + i + 1;
509 nr_heads = argc - i - 1;
513 usage(fetch_pack_usage);
516 pid = git_connect(fd, dest, exec);
519 ret = fetch_pack(fd, nr_heads, heads);
524 if (!ret && nr_heads) {
525 /* If the heads to pull were given, we should have
526 * consumed all of them by matching the remote.
527 * Otherwise, 'git-fetch remote no-such-ref' would
528 * silently succeed without issuing an error.
530 for (i = 0; i < nr_heads; i++)
531 if (heads[i] && heads[i][0]) {
532 error("no such remote ref %s", heads[i]);