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
;
28 static int non_common_revs
, multi_ack
, use_thin_pack
, 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
, int flag
, void *cb_data
)
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
, NULL
);
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%s%s\n",
171 (multi_ack
? " multi_ack" : ""),
172 (use_sideband
== 2 ? " side-band-64k" : ""),
173 (use_sideband
== 1 ? " side-band" : ""),
174 (use_thin_pack
? " thin-pack" : ""),
177 packet_write(fd
[1], "want %s\n", sha1_to_hex(remote
));
186 while ((sha1
= get_rev())) {
187 packet_write(fd
[1], "have %s\n", sha1_to_hex(sha1
));
189 fprintf(stderr
, "have %s\n", sha1_to_hex(sha1
));
191 if (!(31 & ++count
)) {
198 * We keep one window "ahead" of the other side, and
199 * will wait for an ACK only on the next one
205 ack
= get_ack(fd
[0], result_sha1
);
207 fprintf(stderr
, "got ack %d %s\n", ack
,
208 sha1_to_hex(result_sha1
));
214 } else if (ack
== 2) {
215 struct commit
*commit
=
216 lookup_commit(result_sha1
);
217 mark_common(commit
, 0, 1);
224 if (got_continue
&& MAX_IN_VAIN
< in_vain
) {
226 fprintf(stderr
, "giving up\n");
232 packet_write(fd
[1], "done\n");
234 fprintf(stderr
, "done\n");
239 while (flushes
|| multi_ack
) {
240 int ack
= get_ack(fd
[0], result_sha1
);
243 fprintf(stderr
, "got ack (%d) %s\n", ack
,
244 sha1_to_hex(result_sha1
));
255 static struct commit_list
*complete
;
257 static int mark_complete(const char *path
, const unsigned char *sha1
, int flag
, void *cb_data
)
259 struct object
*o
= parse_object(sha1
);
261 while (o
&& o
->type
== OBJ_TAG
) {
262 struct tag
*t
= (struct tag
*) o
;
264 break; /* broken repository */
265 o
->flags
|= COMPLETE
;
266 o
= parse_object(t
->tagged
->sha1
);
268 if (o
&& o
->type
== OBJ_COMMIT
) {
269 struct commit
*commit
= (struct commit
*)o
;
270 commit
->object
.flags
|= COMPLETE
;
271 insert_by_date(commit
, &complete
);
276 static void mark_recent_complete_commits(unsigned long cutoff
)
278 while (complete
&& cutoff
<= complete
->item
->date
) {
280 fprintf(stderr
, "Marking %s as complete\n",
281 sha1_to_hex(complete
->item
->object
.sha1
));
282 pop_most_recent_commit(&complete
, COMPLETE
);
286 static void filter_refs(struct ref
**refs
, int nr_match
, char **match
)
288 struct ref
**return_refs
;
289 struct ref
*newlist
= NULL
;
290 struct ref
**newtail
= &newlist
;
291 struct ref
*ref
, *next
;
292 struct ref
*fastarray
[32];
294 if (nr_match
&& !fetch_all
) {
295 if (ARRAY_SIZE(fastarray
) < nr_match
)
296 return_refs
= xcalloc(nr_match
, sizeof(struct ref
*));
298 return_refs
= fastarray
;
299 memset(return_refs
, 0, sizeof(struct ref
*) * nr_match
);
305 for (ref
= *refs
; ref
; ref
= next
) {
307 if (!memcmp(ref
->name
, "refs/", 5) &&
308 check_ref_format(ref
->name
+ 5))
310 else if (fetch_all
) {
313 newtail
= &ref
->next
;
317 int order
= path_match(ref
->name
, nr_match
, match
);
319 return_refs
[order
-1] = ref
;
320 continue; /* we will link it later */
328 for (i
= 0; i
< nr_match
; i
++) {
329 ref
= return_refs
[i
];
333 newtail
= &ref
->next
;
336 if (return_refs
!= fastarray
)
342 static int everything_local(struct ref
**refs
, int nr_match
, char **match
)
346 unsigned long cutoff
= 0;
348 track_object_refs
= 0;
349 save_commit_buffer
= 0;
351 for (ref
= *refs
; ref
; ref
= ref
->next
) {
354 o
= parse_object(ref
->old_sha1
);
358 /* We already have it -- which may mean that we were
359 * in sync with the other side at some time after
360 * that (it is OK if we guess wrong here).
362 if (o
->type
== OBJ_COMMIT
) {
363 struct commit
*commit
= (struct commit
*)o
;
364 if (!cutoff
|| cutoff
< commit
->date
)
365 cutoff
= commit
->date
;
369 for_each_ref(mark_complete
, NULL
);
371 mark_recent_complete_commits(cutoff
);
374 * Mark all complete remote refs as common refs.
375 * Don't mark them common yet; the server has to be told so first.
377 for (ref
= *refs
; ref
; ref
= ref
->next
) {
378 struct object
*o
= deref_tag(lookup_object(ref
->old_sha1
),
381 if (!o
|| o
->type
!= OBJ_COMMIT
|| !(o
->flags
& COMPLETE
))
384 if (!(o
->flags
& SEEN
)) {
385 rev_list_push((struct commit
*)o
, COMMON_REF
| SEEN
);
387 mark_common((struct commit
*)o
, 1, 1);
391 filter_refs(refs
, nr_match
, match
);
393 for (retval
= 1, ref
= *refs
; ref
; ref
= ref
->next
) {
394 const unsigned char *remote
= ref
->old_sha1
;
395 unsigned char local
[20];
398 o
= lookup_object(remote
);
399 if (!o
|| !(o
->flags
& COMPLETE
)) {
404 "want %s (%s)\n", sha1_to_hex(remote
),
409 hashcpy(ref
->new_sha1
, local
);
413 "already have %s (%s)\n", sha1_to_hex(remote
),
419 static int fetch_pack(int fd
[2], int nr_match
, char **match
)
422 unsigned char sha1
[20];
425 get_remote_heads(fd
[0], &ref
, 0, NULL
, 0);
426 if (server_supports("multi_ack")) {
428 fprintf(stderr
, "Server supports multi_ack\n");
431 if (server_supports("side-band-64k")) {
433 fprintf(stderr
, "Server supports side-band-64k\n");
436 else if (server_supports("side-band")) {
438 fprintf(stderr
, "Server supports side-band\n");
443 die("no matching remote head");
445 if (everything_local(&ref
, nr_match
, match
)) {
449 if (find_common(fd
, sha1
, ref
) < 0)
451 /* When cloning, it is not unusual to have
454 fprintf(stderr
, "warning: no common commits\n");
457 status
= receive_keep_pack(fd
, "git-fetch-pack", quiet
, use_sideband
);
459 status
= receive_unpack_pack(fd
, "git-fetch-pack", quiet
, use_sideband
);
462 die("git-fetch-pack: fetch failed.");
467 sha1_to_hex(ref
->old_sha1
), ref
->name
);
473 int main(int argc
, char **argv
)
475 int i
, ret
, nr_heads
;
476 char *dest
= NULL
, **heads
;
480 setup_git_directory();
484 for (i
= 1; i
< argc
; i
++) {
488 if (!strncmp("--exec=", arg
, 7)) {
492 if (!strcmp("--quiet", arg
) || !strcmp("-q", arg
)) {
496 if (!strcmp("--keep", arg
) || !strcmp("-k", arg
)) {
500 if (!strcmp("--thin", arg
)) {
504 if (!strcmp("--all", arg
)) {
508 if (!strcmp("-v", arg
)) {
512 usage(fetch_pack_usage
);
515 heads
= argv
+ i
+ 1;
516 nr_heads
= argc
- i
- 1;
520 usage(fetch_pack_usage
);
523 pid
= git_connect(fd
, dest
, exec
);
526 ret
= fetch_pack(fd
, nr_heads
, heads
);
529 ret
|= finish_connect(pid
);
531 if (!ret
&& nr_heads
) {
532 /* If the heads to pull were given, we should have
533 * consumed all of them by matching the remote.
534 * Otherwise, 'git-fetch remote no-such-ref' would
535 * silently succeed without issuing an error.
537 for (i
= 0; i
< nr_heads
; i
++)
538 if (heads
[i
] && heads
[i
][0]) {
539 error("no such remote ref %s", heads
[i
]);