11 static const char fetch_pack_usage
[] =
12 "git-fetch-pack [-q] [-v] [--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 | COMMON)
18 #define SEEN (1U << 3)
19 #define POPPED (1U << 4)
21 static struct commit_list
*rev_list
= NULL
;
22 static struct commit_list
*rev_list_end
= NULL
;
23 static unsigned long non_common_revs
= 0;
25 static void rev_list_append(struct commit
*commit
, int mark
)
27 if (!(commit
->object
.flags
& mark
)) {
28 commit
->object
.flags
|= mark
;
30 if (rev_list
== NULL
) {
31 commit_list_insert(commit
, &rev_list
);
32 rev_list_end
= rev_list
;
34 commit_list_insert(commit
, &(rev_list_end
->next
));
35 rev_list_end
= rev_list_end
->next
;
38 if (!(commit
->object
.flags
& COMMON
))
43 static int rev_list_append_sha1(const char *path
, const unsigned char *sha1
)
45 struct object
*o
= deref_tag(parse_object(sha1
));
47 if (o
->type
== commit_type
)
48 rev_list_append((struct commit
*)o
, SEEN
);
53 static void mark_common(struct commit
*commit
)
55 if (commit
!= NULL
&& !(commit
->object
.flags
& COMMON
)) {
56 struct object
*o
= (struct object
*)commit
;
58 if (!(o
->flags
& SEEN
))
59 rev_list_append(commit
, SEEN
);
61 struct commit_list
*parents
;
63 if (!(o
->flags
& POPPED
))
67 for (parents
= commit
->parents
;
69 parents
= parents
->next
)
70 mark_common(parents
->item
);
76 Get the next rev to send, ignoring the common.
79 static const unsigned char* get_rev()
81 struct commit
*commit
= NULL
;
83 while (commit
== NULL
) {
85 struct commit_list
* parents
;
87 if (rev_list
== NULL
|| non_common_revs
== 0)
90 commit
= rev_list
->item
;
91 if (!(commit
->object
.parsed
))
93 commit
->object
.flags
|= POPPED
;
94 if (!(commit
->object
.flags
& COMMON
))
97 parents
= commit
->parents
;
99 if (commit
->object
.flags
& COMMON
) {
100 /* do not send "have", and ignore ancestors */
102 mark
= COMMON
| SEEN
;
103 } else if (commit
->object
.flags
& COMMON_REF
)
104 /* send "have", and ignore ancestors */
105 mark
= COMMON
| SEEN
;
107 /* send "have", also for its ancestors */
112 mark_common(parents
->item
);
114 rev_list_append(parents
->item
, mark
);
115 parents
= parents
->next
;
118 rev_list
= rev_list
->next
;
121 return commit
->object
.sha1
;
124 static int find_common(int fd
[2], unsigned char *result_sha1
,
128 int count
= 0, flushes
= 0, multi_ack
= 0, retval
;
129 const unsigned char *sha1
;
131 for_each_ref(rev_list_append_sha1
);
134 for ( ; refs
; refs
= refs
->next
) {
135 unsigned char *remote
= refs
->old_sha1
;
139 * If that object is complete (i.e. it is an ancestor of a
140 * local ref), we tell them we have it but do not have to
141 * tell them about its ancestors, which they already know
144 * We use lookup_object here because we are only
145 * interested in the case we *know* the object is
146 * reachable and we have already scanned it.
148 if (((o
= lookup_object(remote
)) != NULL
) &&
149 (o
->flags
& COMPLETE
)) {
152 if (o
->type
== commit_type
)
153 rev_list_append((struct commit
*)o
,
159 packet_write(fd
[1], "want %s multi_ack\n", sha1_to_hex(remote
));
168 while ((sha1
= get_rev())) {
169 packet_write(fd
[1], "have %s\n", sha1_to_hex(sha1
));
171 fprintf(stderr
, "have %s\n", sha1_to_hex(sha1
));
172 if (!(31 & ++count
)) {
179 * We keep one window "ahead" of the other side, and
180 * will wait for an ACK only on the next one
186 ack
= get_ack(fd
[0], result_sha1
);
188 fprintf(stderr
, "got ack %d %s\n", ack
,
189 sha1_to_hex(result_sha1
));
195 } else if (ack
== 2) {
197 mark_common((struct commit
*)
198 lookup_object(result_sha1
));
210 packet_write(fd
[1], "done\n");
212 fprintf(stderr
, "done\n");
216 if (get_ack(fd
[0], result_sha1
)) {
218 fprintf(stderr
, "got ack %s\n",
219 sha1_to_hex(result_sha1
));
230 static struct commit_list
*complete
= NULL
;
232 static int mark_complete(const char *path
, const unsigned char *sha1
)
234 struct object
*o
= parse_object(sha1
);
236 while (o
&& o
->type
== tag_type
) {
237 struct tag
*t
= (struct tag
*) o
;
239 break; /* broken repository */
240 o
->flags
|= COMPLETE
;
241 o
= parse_object(t
->tagged
->sha1
);
243 if (o
&& o
->type
== commit_type
) {
244 struct commit
*commit
= (struct commit
*)o
;
245 commit
->object
.flags
|= COMPLETE
;
246 insert_by_date(commit
, &complete
);
251 static void mark_recent_complete_commits(unsigned long cutoff
)
253 while (complete
&& cutoff
<= complete
->item
->date
) {
255 fprintf(stderr
, "Marking %s as complete\n",
256 sha1_to_hex(complete
->item
->object
.sha1
));
257 pop_most_recent_commit(&complete
, COMPLETE
);
261 static int everything_local(struct ref
*refs
)
265 unsigned long cutoff
= 0;
267 track_object_refs
= 0;
268 save_commit_buffer
= 0;
270 for (ref
= refs
; ref
; ref
= ref
->next
) {
273 o
= parse_object(ref
->old_sha1
);
277 /* We already have it -- which may mean that we were
278 * in sync with the other side at some time after
279 * that (it is OK if we guess wrong here).
281 if (o
->type
== commit_type
) {
282 struct commit
*commit
= (struct commit
*)o
;
283 if (!cutoff
|| cutoff
< commit
->date
)
284 cutoff
= commit
->date
;
288 for_each_ref(mark_complete
);
290 mark_recent_complete_commits(cutoff
);
292 for (retval
= 1; refs
; refs
= refs
->next
) {
293 const unsigned char *remote
= refs
->old_sha1
;
294 unsigned char local
[20];
297 o
= parse_object(remote
);
298 if (!o
|| !(o
->flags
& COMPLETE
)) {
303 "want %s (%s)\n", sha1_to_hex(remote
),
308 memcpy(refs
->new_sha1
, local
, 20);
312 "already have %s (%s)\n", sha1_to_hex(remote
),
318 static int fetch_pack(int fd
[2], int nr_match
, char **match
)
321 unsigned char sha1
[20];
325 get_remote_heads(fd
[0], &ref
, nr_match
, match
, 1);
328 die("no matching remote head");
330 if (everything_local(ref
)) {
334 if (find_common(fd
, sha1
, ref
) < 0)
335 fprintf(stderr
, "warning: no common commits\n");
338 die("git-fetch-pack: unable to fork off git-unpack-objects");
343 execlp("git-unpack-objects", "git-unpack-objects",
344 quiet
? "-q" : NULL
, NULL
);
345 die("git-unpack-objects exec failed");
349 while (waitpid(pid
, &status
, 0) < 0) {
351 die("waiting for git-unpack-objects: %s", strerror(errno
));
353 if (WIFEXITED(status
)) {
354 int code
= WEXITSTATUS(status
);
356 die("git-unpack-objects died with error code %d", code
);
360 sha1_to_hex(ref
->old_sha1
), ref
->name
);
365 if (WIFSIGNALED(status
)) {
366 int sig
= WTERMSIG(status
);
367 die("git-unpack-objects died of signal %d", sig
);
369 die("Sherlock Holmes! git-unpack-objects died of unnatural causes %d!", status
);
372 int main(int argc
, char **argv
)
374 int i
, ret
, nr_heads
;
375 char *dest
= NULL
, **heads
;
381 for (i
= 1; i
< argc
; i
++) {
385 if (!strncmp("--exec=", arg
, 7)) {
389 if (!strcmp("-q", arg
)) {
393 if (!strcmp("-v", arg
)) {
397 usage(fetch_pack_usage
);
400 heads
= argv
+ i
+ 1;
401 nr_heads
= argc
- i
- 1;
405 usage(fetch_pack_usage
);
406 pid
= git_connect(fd
, dest
, exec
);
409 ret
= fetch_pack(fd
, nr_heads
, heads
);